From 37f6c60cde0e515a3dab55954ccec86872fc9832 Mon Sep 17 00:00:00 2001 From: stefano bovio Date: Wed, 13 Sep 2023 11:17:01 +0200 Subject: [PATCH] #9396 Review annotations UI and system (#9397) Co-authored-by: Lorenzo Natali --- build/docma-config.json | 2 +- docs/developer-guide/local-config.md | 29 - .../mapstore-migration-guide.md | 15 + package.json | 1 + .../actions/__tests__/annotations-test.js | 445 --- web/client/actions/__tests__/mapInfo-test.js | 11 - web/client/actions/annotations.js | 429 --- web/client/actions/mapInfo.js | 14 - .../components/I18N/IntlNumberFormControl.jsx | 2 +- web/client/components/TOC/DefaultGroup.jsx | 2 +- web/client/components/TOC/DefaultLayer.jsx | 8 +- .../TOC/fragments/StyleBasedLegend.jsx | 2 +- .../data/identify/viewers/row/RowViewer.jsx | 2 +- .../viewers/row/__tests__/RowViewer-test.jsx | 2 +- .../enhancers/__tests__/processFiles-test.jsx | 16 +- .../dragZone/enhancers/processFiles.jsx | 4 +- .../components/import/style/StylePanel.jsx | 2 +- .../map/cesium/EditGeoJSONSupport.jsx | 2 +- web/client/components/map/cesium/Map.jsx | 4 +- web/client/components/map/leaflet/Map.jsx | 4 +- .../map/leaflet/__tests__/Layer-test.jsx | 2 +- .../components/map/openlayers/DrawSupport.jsx | 2 +- web/client/components/map/openlayers/Map.jsx | 33 +- .../openlayers/__tests__/DrawSupport-test.jsx | 2 +- .../map/openlayers/__tests__/Feature-test.jsx | 2 +- .../__tests__/LegacyVectorStyle-test.js | 2 +- .../map/openlayers/plugins/VectorLayer.js | 6 +- .../mapcontrols/annotations/Annotations.jsx | 2 +- .../annotations/AnnotationsEditor.jsx | 4 +- .../annotations/CoordinatesEditor.jsx | 19 +- .../annotations/DropdownFeatureType.jsx | 2 +- .../mapcontrols/annotations/FeaturesList.jsx | 2 +- .../annotations/SelectAnnotationsFile.jsx | 2 +- .../__tests__/CoordinatesEditor-test.js | 12 +- .../annotations/img/markers_shadow.png | Bin 535 -> 355 bytes .../misc/coordinateeditors/CoordinatesRow.jsx | 60 +- web/client/components/style/TextStyler.jsx | 2 +- .../thumbGeoms/__tests__/LineThumb-test.js | 2 +- .../__tests__/MultiGeomThumb-test.js | 2 +- .../thumbGeoms/__tests__/PolygonThumb-test.js | 2 +- .../components/style/vector/Manager.jsx | 2 +- web/client/components/style/vector/Text.jsx | 2 +- .../style/vector/marker/SymbolLayout.jsx | 2 +- .../components/styleeditor/RulesEditor.jsx | 7 +- .../components/styleeditor/config/blocks.js | 33 +- web/client/configs/localConfig.json | 12 +- .../epics/__tests__/annotations-test.js | 1357 --------- web/client/epics/__tests__/identify-test.js | 25 +- web/client/epics/__tests__/maplayout-test.js | 2 +- .../epics/__tests__/measurement-test.jsx | 148 +- web/client/epics/annotations.js | 808 ------ web/client/epics/identify.js | 18 +- web/client/epics/maplayout.js | 2 +- web/client/epics/measurement.js | 60 +- web/client/plugins/Annotations.jsx | 363 --- .../__tests__/Annotations-test.jsx | 24 +- .../actions/__tests__/annotations-test.js | 94 + .../Annotations/actions/annotations.js | 135 + .../components/AnnotationsFields.jsx | 121 + .../Annotations/components/FeaturesEditor.jsx | 544 ++++ .../components}/GeometryEditor.jsx | 13 +- .../__tests__/AnnotationsFields-test.jsx | 85 + .../__tests__/FeaturesEditor-test.jsx | 219 ++ .../__tests__/GeometryEditor-test.jsx | 29 + web/client/plugins/Annotations/constants.js | 13 + .../containers/AnnotationsEditor.jsx | 414 +++ .../AnnotationsMapInteractionsSupport.jsx | 80 + .../containers/AnnotationsPanel.jsx | 335 +++ .../containers/AnnotationsTOCButton.jsx | 114 + .../epics/__tests__/annotations-test.js | 211 ++ .../plugins/Annotations/epics/annotations.js | 202 ++ web/client/plugins/Annotations/index.js | 124 + .../reducers/__tests__/annotations-test.js | 50 + .../Annotations/reducers/annotations.js | 67 + .../selectors/__tests__/annotations-test.js | 146 + .../Annotations/selectors/annotations.js | 59 + .../Annotations/utils/AnnotationsUtils.js | 756 +++++ .../utils/__tests__/AnnotationsUtils-test.js | 605 ++++ web/client/plugins/CRSSelector.jsx | 8 +- web/client/plugins/MapImport.jsx | 4 +- web/client/plugins/Measure.jsx | 3 +- web/client/plugins/TOC.jsx | 20 +- .../plugins/__tests__/CRSSelector-test.jsx | 5 +- .../plugins/__tests__/pluginsTestUtils.js | 2 - .../tocitemssettings/defaultSettingsTabs.js | 4 +- web/client/product/main.jsx | 2 - .../reducers/__tests__/annotations-test.js | 2437 ----------------- web/client/reducers/__tests__/config-test.js | 26 +- .../reducers/__tests__/featuregrid-test.js | 7 +- web/client/reducers/__tests__/mapInfo-test.js | 537 ---- web/client/reducers/annotations.js | 775 ------ web/client/reducers/config.js | 24 +- web/client/reducers/mapInfo.js | 81 - .../selectors/__tests__/annotations-test.js | 627 ----- web/client/selectors/annotations.js | 126 - web/client/themes/default/icons.less | 1196 ++++---- web/client/themes/default/icons/icons.eot | Bin 85284 -> 85676 bytes web/client/themes/default/icons/icons.svg | 608 ++-- web/client/themes/default/icons/icons.ttf | Bin 85128 -> 85520 bytes web/client/themes/default/icons/icons.woff | Bin 47988 -> 48156 bytes web/client/themes/default/icons/icons.woff2 | Bin 39364 -> 39432 bytes .../themes/default/less/annotations.less | 996 ++----- web/client/themes/default/less/common.less | 4 + .../default/less/legacy-annotations.less | 864 ++++++ web/client/themes/default/svg/add-comment.svg | 60 + .../themes/default/svg/download-comment.svg | 59 + web/client/translations/data.de-DE.json | 6 +- web/client/translations/data.en-US.json | 8 +- web/client/translations/data.es-ES.json | 6 +- web/client/translations/data.fr-FR.json | 6 +- web/client/translations/data.it-IT.json | 6 +- web/client/utils/ControlUtils.js | 4 +- web/client/utils/LayersUtils.js | 8 + ...ionsUtils.js => LegacyAnnotationsUtils.js} | 0 web/client/utils/MarkerUtils.js | 25 +- web/client/utils/MeasureUtils.js | 19 + web/client/utils/MeasurementUtils.js | 526 +++- web/client/utils/PrintUtils.js | 13 +- web/client/utils/VectorStyleUtils.js | 1 + ...test.js => LegacyAnnotationsUtils-test.js} | 2 +- .../utils/__tests__/MarkerUtils-test.js | 6 +- .../utils/__tests__/MeasurementUtils-test.js | 65 +- web/client/utils/__tests__/PrintUtils-test.js | 66 +- .../utils/cesium/ModifyGeoJSONInteraction.js | 44 +- web/client/utils/mapinfo/vector.js | 24 +- .../openlayers/DrawGeometryInteraction.js | 3 +- .../openlayers/ModifyGeoJSONInteraction.js | 28 +- 127 files changed, 7630 insertions(+), 10148 deletions(-) delete mode 100644 web/client/actions/__tests__/annotations-test.js delete mode 100644 web/client/actions/annotations.js delete mode 100644 web/client/epics/__tests__/annotations-test.js delete mode 100644 web/client/epics/annotations.js delete mode 100644 web/client/plugins/Annotations.jsx rename web/client/plugins/{ => Annotations}/__tests__/Annotations-test.jsx (59%) create mode 100644 web/client/plugins/Annotations/actions/__tests__/annotations-test.js create mode 100644 web/client/plugins/Annotations/actions/annotations.js create mode 100644 web/client/plugins/Annotations/components/AnnotationsFields.jsx create mode 100644 web/client/plugins/Annotations/components/FeaturesEditor.jsx rename web/client/{components/mapcontrols/annotations => plugins/Annotations/components}/GeometryEditor.jsx (85%) create mode 100644 web/client/plugins/Annotations/components/__tests__/AnnotationsFields-test.jsx create mode 100644 web/client/plugins/Annotations/components/__tests__/FeaturesEditor-test.jsx create mode 100644 web/client/plugins/Annotations/components/__tests__/GeometryEditor-test.jsx create mode 100644 web/client/plugins/Annotations/constants.js create mode 100644 web/client/plugins/Annotations/containers/AnnotationsEditor.jsx create mode 100644 web/client/plugins/Annotations/containers/AnnotationsMapInteractionsSupport.jsx create mode 100644 web/client/plugins/Annotations/containers/AnnotationsPanel.jsx create mode 100644 web/client/plugins/Annotations/containers/AnnotationsTOCButton.jsx create mode 100644 web/client/plugins/Annotations/epics/__tests__/annotations-test.js create mode 100644 web/client/plugins/Annotations/epics/annotations.js create mode 100644 web/client/plugins/Annotations/index.js create mode 100644 web/client/plugins/Annotations/reducers/__tests__/annotations-test.js create mode 100644 web/client/plugins/Annotations/reducers/annotations.js create mode 100644 web/client/plugins/Annotations/selectors/__tests__/annotations-test.js create mode 100644 web/client/plugins/Annotations/selectors/annotations.js create mode 100644 web/client/plugins/Annotations/utils/AnnotationsUtils.js create mode 100644 web/client/plugins/Annotations/utils/__tests__/AnnotationsUtils-test.js delete mode 100644 web/client/reducers/__tests__/annotations-test.js delete mode 100644 web/client/reducers/annotations.js delete mode 100644 web/client/selectors/__tests__/annotations-test.js delete mode 100644 web/client/selectors/annotations.js create mode 100644 web/client/themes/default/less/legacy-annotations.less create mode 100644 web/client/themes/default/svg/add-comment.svg create mode 100644 web/client/themes/default/svg/download-comment.svg rename web/client/utils/{AnnotationsUtils.js => LegacyAnnotationsUtils.js} (100%) rename web/client/utils/__tests__/{AnnotationsUtils-test.js => LegacyAnnotationsUtils-test.js} (99%) diff --git a/build/docma-config.json b/build/docma-config.json index 8f9bbdc103..4d115c4123 100644 --- a/build/docma-config.json +++ b/build/docma-config.json @@ -222,7 +222,7 @@ "plugins": [ "web/client/plugins/index.jsdoc", "web/client/plugins/AddGroup.jsx", - "web/client/plugins/Annotations.jsx", + "web/client/plugins/Annotations/index.js", "web/client/plugins/AutoMapUpdate.jsx", "web/client/plugins/BackgroundSelector.jsx", "web/client/plugins/BurgerMenu.jsx", diff --git a/docs/developer-guide/local-config.md b/docs/developer-guide/local-config.md index bafcd31a2d..16d227a047 100644 --- a/docs/developer-guide/local-config.md +++ b/docs/developer-guide/local-config.md @@ -241,35 +241,6 @@ CSW service
-#### Annotations Editor configuration - -Annotations editor can be configured by setting it's defaultState. It looks like this: - -```javascript -"defaultState": { - ... - "annotations": { - "config": { - "geometryEditorOptions": { - "measureOptions": { - "displayUom": "nm" - } - }, - "multiGeometry": true, - "validationErrors": {}, - "defaultPointType": "symbol" - }, - "format": "aeronautical", - "defaultTextAnnotation": "New" - }, -``` - -- **format** - decimal or aeronautical degree for coordinates -- **defaultTextAnnotation** - default text value for text annotations -- **config.geometryEditorOptions** - properties to be passed to CoordinatesEditor of GeometryEditor. For more information refer to the documentation of CoordinatesEditor component -- **config.multiGeometry** - if set to true allows to add more then one geometry to annotations -- **config.defaultPointType** - default point type of marker geometry type. Can be 'marker' or 'symbol' - ### projectionDefs configuration Custom CRS can be configured here, at root level of localConfig.json file. For example: diff --git a/docs/developer-guide/mapstore-migration-guide.md b/docs/developer-guide/mapstore-migration-guide.md index dfe003c56d..85acc49374 100644 --- a/docs/developer-guide/mapstore-migration-guide.md +++ b/docs/developer-guide/mapstore-migration-guide.md @@ -20,6 +20,21 @@ This is a list of things to check if you want to update from a previous version - Optionally check also accessory files like `.eslinrc`, if you want to keep aligned with lint standards. - Follow the instructions below, in order, from your version to the one you want to update to. +## Migration from 2023.02.xx to 2024.01.00 + +### Annotations plugin refactor + +The Annotation plugin has been updated to be supported also in 3D maps. This update introduced some changes: + +- All the configurations related to the "Annotations" plugin has been removed from `localConfig.json` `defaultState` entry and moved to the `cfg` property of the plugin +- The annotations reducers is not needed anymore inside the default reducers of the app + +Please update by: + +- Removing `annotations` entry from your `localConfig.json` `defaultState` +- If you customized the app, you can remove the `annotations` reducer from default reducers. +- If some customizations were applied to the Annotations plugin in `defaultState`, apply these changes to the plugin configuration, following the documentation of the plugin. + ## Migration from 2023.01.xx to 2023.02.00 ### About plugin cfg changes diff --git a/package.json b/package.json index 68962f9718..6d5c1ed2a0 100644 --- a/package.json +++ b/package.json @@ -133,6 +133,7 @@ "@mapbox/togeojson": "0.16.0", "@mapstore/patcher": "https://github.com/geosolutions-it/Patcher/tarball/master", "@turf/along": "6.5.0", + "@turf/area": "6.5.0", "@turf/bbox": "4.1.0", "@turf/bbox-polygon": "5.1.5", "@turf/boolean-clockwise": "6.5.0", diff --git a/web/client/actions/__tests__/annotations-test.js b/web/client/actions/__tests__/annotations-test.js deleted file mode 100644 index e143ec942a..0000000000 --- a/web/client/actions/__tests__/annotations-test.js +++ /dev/null @@ -1,445 +0,0 @@ -/* - * Copyright 2017, GeoSolutions Sas. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. - */ - -import expect from 'expect'; - -import { isFunction } from 'lodash'; - -import { - EDIT_ANNOTATION, - REMOVE_ANNOTATION, - CONFIRM_REMOVE_ANNOTATION, - CANCEL_REMOVE_ANNOTATION, - CLOSE_ANNOTATIONS, - CONFIRM_CLOSE_ANNOTATIONS, - CANCEL_CLOSE_ANNOTATIONS, - CANCEL_EDIT_ANNOTATION, - SAVE_ANNOTATION, - TOGGLE_ADD, - UPDATE_ANNOTATION_GEOMETRY, - VALIDATION_ERROR, - REMOVE_ANNOTATION_GEOMETRY, - TOGGLE_STYLE, - SET_STYLE, - RESTORE_STYLE, - SHOW_ANNOTATION, - CANCEL_SHOW_ANNOTATION, - NEW_ANNOTATION, - HIGHLIGHT, - CLEAN_HIGHLIGHT, - FILTER_ANNOTATIONS, - addText, - ADD_TEXT, - CHANGE_FORMAT, - changeFormat, - changedProperties, - CHANGED_PROPERTIES, - toggleUnsavedStyleModal, - TOGGLE_STYLE_MODAL, - startDrawing, - START_DRAWING, - toggleUnsavedChangesModal, - TOGGLE_CHANGES_MODAL, - setUnsavedStyle, - UNSAVED_STYLE, - setUnsavedChanges, - UNSAVED_CHANGES, - editAnnotation, - removeAnnotation, - confirmRemoveAnnotation, - cancelRemoveAnnotation, - cancelEditAnnotation, - saveAnnotation, - toggleAdd, - updateAnnotationGeometry, - validationError, - removeAnnotationGeometry, - toggleStyle, - setStyle, - restoreStyle, - showAnnotation, - cancelShowAnnotation, - newAnnotation, - highlight, - cleanHighlight, - filterAnnotations, - closeAnnotations, - confirmCloseAnnotations, - cancelCloseAnnotations, - DOWNLOAD, download, - CHANGED_SELECTED, changeSelected, - SET_INVALID_SELECTED, setInvalidSelected, - TOGGLE_GEOMETRY_MODAL, toggleUnsavedGeometryModal, - RESET_COORD_EDITOR, resetCoordEditor, - CHANGE_RADIUS, changeRadius, - CHANGE_TEXT, changeText, - CONFIRM_DELETE_FEATURE, confirmDeleteFeature, - OPEN_EDITOR, openEditor, - TOGGLE_DELETE_FT_MODAL, toggleDeleteFtModal, - ADD_NEW_FEATURE, addNewFeature, - LOAD_ANNOTATIONS, loadAnnotations, - UPDATE_SYMBOLS, updateSymbols, - SET_DEFAULT_STYLE, setDefaultStyle, - LOAD_DEFAULT_STYLES, loadDefaultStyles, - LOADING, loading, - TOGGLE_ANNOTATION_VISIBILITY, toggleVisibilityAnnotation, - CHANGE_GEOMETRY_TITLE, changeGeometryTitle, - FILTER_MARKER, filterMarker, - GEOMETRY_HIGHLIGHT, geometryHighlight, - INIT_PLUGIN, initPlugin, - TOGGLE_SHOW_AGAIN, toggleShowAgain, - HIDE_MEASURE_WARNING, hideMeasureWarning, - UNSELECT_FEATURE, unSelectFeature, - VALIDATE_FEATURE, validateFeature -} from '../annotations'; - -describe('Test correctness of the annotations actions', () => { - it('edit annotation', (done) => { - const result = editAnnotation('1'); - expect(result).toExist(); - expect(isFunction(result)).toBe(true); - result((action) => { - expect(action.type).toEqual(EDIT_ANNOTATION); - expect(action.featureType).toEqual('Point'); - expect(action.feature).toExist(); - expect(action.feature.properties.name).toEqual('myannotation'); - done(); - }, () => ({ - layers: { - flat: [{ - id: 'annotations', - features: [{ - properties: { - id: '1', - name: 'myannotation' - }, - geometry: { - type: "Point" - } - }] - }] - } - })); - }); - - it('remove annotation', () => { - const result = removeAnnotation('1'); - expect(result.type).toEqual(REMOVE_ANNOTATION); - expect(result.id).toEqual('1'); - }); - it('openEditor annotation', () => { - const result = openEditor('1'); - expect(result.type).toEqual(OPEN_EDITOR); - expect(result.id).toEqual('1'); - }); - it('addNewFeature', () => { - const result = addNewFeature(); - expect(result.type).toEqual(ADD_NEW_FEATURE); - }); - it('confirmDeleteFeature', () => { - const result = confirmDeleteFeature(); - expect(result.type).toEqual(CONFIRM_DELETE_FEATURE); - }); - it('toggleDeleteFtModal', () => { - const result = toggleDeleteFtModal(); - expect(result.type).toEqual(TOGGLE_DELETE_FT_MODAL); - }); - it('changeSelected', () => { - const coordinates = [1, 2]; - const radius = 0; - const text = "text"; - const crs = "EPS:3857"; - const result = changeSelected(coordinates, radius, text, crs); - expect(result.type).toEqual(CHANGED_SELECTED); - expect(result.coordinates).toEqual(coordinates); - expect(result.radius).toEqual(radius); - expect(result.crs).toEqual(crs); - expect(result.text).toEqual(text); - }); - it('setInvalidSelected', () => { - const errorFrom = "text"; - const coordinates = [1, 2]; - const result = setInvalidSelected(errorFrom, coordinates); - expect(result.type).toEqual(SET_INVALID_SELECTED); - expect(result.errorFrom).toEqual(errorFrom); - expect(result.coordinates).toEqual(coordinates); - }); - it('addText', () => { - const result = addText(); - expect(result.type).toEqual(ADD_TEXT); - }); - it('changeFormat', () => { - const format = "decimal"; - const result = changeFormat(format); - expect(result.type).toEqual(CHANGE_FORMAT); - expect(result.format).toEqual(format); - }); - it('confirm remove annotation', () => { - const result = confirmRemoveAnnotation('1', 'geometry'); - expect(result.type).toEqual(CONFIRM_REMOVE_ANNOTATION); - expect(result.id).toEqual('1'); - expect(result.attribute).toEqual('geometry'); - }); - it('changedProperties', () => { - const field = "desc"; - const value = "desc value"; - const result = changedProperties(field, value); - expect(result.type).toEqual(CHANGED_PROPERTIES); - expect(result.field).toEqual(field); - expect(result.value).toEqual(value); - }); - it('cancel remove annotation', () => { - const result = cancelRemoveAnnotation(); - expect(result.type).toEqual(CANCEL_REMOVE_ANNOTATION); - }); - it('setUnsavedChanges', () => { - const result = setUnsavedChanges(true); - expect(result.type).toEqual(UNSAVED_CHANGES); - expect(result.unsavedChanges).toEqual(true); - }); - it('setUnsavedStyle', () => { - const result = setUnsavedStyle(true); - expect(result.type).toEqual(UNSAVED_STYLE); - expect(result.unsavedStyle).toEqual(true); - }); - it('cancel edit annotation', () => { - const result = cancelEditAnnotation({id: 1}); - expect(result.type).toEqual(CANCEL_EDIT_ANNOTATION); - expect(result.properties).toEqual({id: 1}); - }); - it('startDrawing', () => { - const result = startDrawing(); - expect(result.type).toEqual(START_DRAWING); - }); - it('startDrawing with options', () => { - const options = {geodesic: false}; - const result = startDrawing(options); - expect(result.type).toEqual(START_DRAWING); - expect(result.options).toEqual(options); - }); - it('toggleUnsavedChangesModal', () => { - const result = toggleUnsavedChangesModal(); - expect(result.type).toEqual(TOGGLE_CHANGES_MODAL); - }); - it('toggleUnsavedStyleModal', () => { - const result = toggleUnsavedStyleModal(); - expect(result.type).toEqual(TOGGLE_STYLE_MODAL); - }); - - it('save annotation', () => { - const result = saveAnnotation('1', { - name: 'changed' - }, {}, {}, true); - expect(result.type).toEqual(SAVE_ANNOTATION); - expect(result.id).toEqual('1'); - expect(result.fields.name).toEqual('changed'); - expect(result.geometry).toExist(); - expect(result.style).toExist(); - expect(result.newFeature).toBe(true); - }); - - it('toggle add', () => { - const result = toggleAdd(); - expect(result.type).toEqual(TOGGLE_ADD); - }); - - it('toggle style', () => { - const result = toggleStyle(); - expect(result.type).toEqual(TOGGLE_STYLE); - }); - - it('restore style', () => { - const result = restoreStyle(); - expect(result.type).toEqual(RESTORE_STYLE); - }); - - it('set style', () => { - const result = setStyle({}); - expect(result.type).toEqual(SET_STYLE); - expect(result.style).toExist(); - }); - - it('update annotation geometry', () => { - const result = updateAnnotationGeometry({}); - expect(result.type).toEqual(UPDATE_ANNOTATION_GEOMETRY); - expect(result.geometry).toExist(); - }); - - it('validation error', () => { - const result = validationError({ - 'title': 'error1' - }); - expect(result.type).toEqual(VALIDATION_ERROR); - expect(result.errors.title).toEqual('error1'); - }); - - it('remove annotation geometry', () => { - const result = removeAnnotationGeometry('1'); - expect(result.type).toEqual(REMOVE_ANNOTATION_GEOMETRY); - expect(result.id).toBe('1'); - }); - - it('shows annotation', () => { - const result = showAnnotation('1'); - expect(result.type).toEqual(SHOW_ANNOTATION); - expect(result.id).toEqual('1'); - }); - - it('cancels show annotation', () => { - const result = cancelShowAnnotation(); - expect(result.type).toEqual(CANCEL_SHOW_ANNOTATION); - }); - - it('creates new annotation', () => { - const result = newAnnotation(); - expect(result.type).toEqual(NEW_ANNOTATION); - }); - - it('highlights annotation', () => { - const result = highlight('1'); - expect(result.type).toEqual(HIGHLIGHT); - expect(result.id).toEqual('1'); - }); - - it('cleans highlights', () => { - const result = cleanHighlight('1'); - expect(result.type).toEqual(CLEAN_HIGHLIGHT); - }); - - it('filters annotaions', () => { - const result = filterAnnotations('1'); - expect(result.type).toEqual(FILTER_ANNOTATIONS); - expect(result.filter).toEqual('1'); - }); - - it('close annotations', () => { - const result = closeAnnotations(); - expect(result.type).toEqual(CLOSE_ANNOTATIONS); - }); - - it('confirm close annotations', () => { - const result = confirmCloseAnnotations({id: 1}); - expect(result.type).toEqual(CONFIRM_CLOSE_ANNOTATIONS); - expect(result.properties).toEqual({id: 1}); - }); - - it('changeRadius', () => { - const radius = ""; - const components = ""; - const crs = "ESPG:4326"; - const result = changeRadius(radius, components, crs); - expect(result.components).toEqual(components); - expect(result.radius).toEqual(radius); - expect(result.crs).toEqual(crs); - expect(result.type).toEqual(CHANGE_RADIUS); - }); - it('changeText', () => { - const text = ""; - const components = ""; - const result = changeText(text, components); - expect(result.type).toEqual(CHANGE_TEXT); - expect(result.text).toEqual(text); - expect(result.components).toEqual(components); - }); - - it('toggleUnsavedGeometryModal', () => { - const result = toggleUnsavedGeometryModal(); - expect(result.type).toEqual(TOGGLE_GEOMETRY_MODAL); - }); - it('resetCoordEditor', () => { - const result = resetCoordEditor(); - expect(result.type).toEqual(RESET_COORD_EDITOR); - }); - - it('cancel close annotations', () => { - const result = cancelCloseAnnotations(); - expect(result.type).toEqual(CANCEL_CLOSE_ANNOTATIONS); - }); - it('download annotations', () => { - const result = download(); - expect(result.type).toEqual(DOWNLOAD); - }); - it('updateSymbols', () => { - const symbols = [{name: "symbol1"}, {name: "symbol2"}]; - let result = updateSymbols(symbols); - expect(result.type).toEqual(UPDATE_SYMBOLS); - expect(result.symbols.length).toEqual(2); - expect(result.symbols[0].name).toEqual(symbols[0].name); - - result = updateSymbols(); - expect(result.symbols.length).toEqual(0); - }); - it('load annotations', () => { - const result = loadAnnotations([]); - expect(result.type).toEqual(LOAD_ANNOTATIONS); - expect(result.features).toExist(); - expect(result.override).toBe(false); - }); - it('setDefaultStyle', () => { - const result = setDefaultStyle('POINT.symbol', {size: 64}); - expect(result.type).toBe(SET_DEFAULT_STYLE); - expect(result.path).toBe('POINT.symbol'); - expect(result.style).toEqual({size: 64}); - }); - it('loadDefaultStyles', () => { - const result = loadDefaultStyles('circle', 64, '#0000FF', '#00FF00', '/path/to/symbols'); - expect(result.type).toBe(LOAD_DEFAULT_STYLES); - expect(result.shape).toBe('circle'); - expect(result.size).toBe(64); - expect(result.fillColor).toBe('#0000FF'); - expect(result.strokeColor).toBe('#00FF00'); - expect(result.symbolsPath).toBe('/path/to/symbols'); - }); - it('loading', () => { - const result = loading(true, 'loadingFlag'); - expect(result.type).toBe(LOADING); - expect(result.value).toBe(true); - expect(result.name).toBe('loadingFlag'); - }); - it('toggleVisibilityAnnotation ', () => { - const result = toggleVisibilityAnnotation('1'); - expect(result.type).toBe(TOGGLE_ANNOTATION_VISIBILITY); - expect(result.id).toBe('1'); - }); - it('changeGeometryTitle ', () => { - const result = changeGeometryTitle('New title'); - expect(result.type).toBe(CHANGE_GEOMETRY_TITLE); - expect(result.title).toBe('New title'); - }); - it('filterMarker ', () => { - const result = filterMarker('glass'); - expect(result.type).toBe(FILTER_MARKER); - expect(result.filter).toBe('glass'); - }); - it('geometryHighlight ', () => { - const result = geometryHighlight('1', false); - expect(result.type).toBe(GEOMETRY_HIGHLIGHT); - expect(result.id).toBe('1'); - expect(result.state).toBe(false); - }); - it('initPlugin ', () => { - const result = initPlugin(); - expect(result.type).toBe(INIT_PLUGIN); - }); - it('toggleShowAgain ', () => { - const result = toggleShowAgain('glass'); - expect(result.type).toBe(TOGGLE_SHOW_AGAIN); - }); - it('hideMeasureWarning ', () => { - const result = hideMeasureWarning(); - expect(result.type).toBe(HIDE_MEASURE_WARNING); - }); - it('unSelectFeature ', () => { - const result = unSelectFeature(); - expect(result.type).toBe(UNSELECT_FEATURE); - }); - it('validateFeature ', () => { - const result = validateFeature(); - expect(result.type).toBe(VALIDATE_FEATURE); - }); -}); diff --git a/web/client/actions/__tests__/mapInfo-test.js b/web/client/actions/__tests__/mapInfo-test.js index 81bcf23dca..344fd303ab 100644 --- a/web/client/actions/__tests__/mapInfo-test.js +++ b/web/client/actions/__tests__/mapInfo-test.js @@ -15,7 +15,6 @@ import { CHANGE_MAPINFO_FORMAT, SHOW_REVERSE_GEOCODE, HIDE_REVERSE_GEOCODE, - GET_VECTOR_INFO, TOGGLE_MAPINFO_STATE, UPDATE_CENTER_TO_MARKER, FEATURE_INFO_CLICK, @@ -28,7 +27,6 @@ import { changeMapInfoFormat, showMapinfoRevGeocode, hideMapinfoRevGeocode, - getVectorInfo, toggleMapInfoState, updateCenterToMarker, TOGGLE_SHOW_COORD_EDITOR, @@ -49,15 +47,6 @@ import { describe('Test correctness of the map actions', () => { - it('gets vector info', () => { - const retval = getVectorInfo('layer', 'request', 'metadata'); - - expect(retval.type).toBe(GET_VECTOR_INFO); - expect(retval.layer).toBe('layer'); - expect(retval.request).toBe('request'); - expect(retval.metadata).toBe('metadata'); - }); - it('change map info state', () => { const testVal = "val"; const retval = changeMapInfoState(testVal); diff --git a/web/client/actions/annotations.js b/web/client/actions/annotations.js deleted file mode 100644 index 53fab33bff..0000000000 --- a/web/client/actions/annotations.js +++ /dev/null @@ -1,429 +0,0 @@ -/* - * Copyright 2018, GeoSolutions Sas. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. - */ - -export const INIT_PLUGIN = 'ANNOTATIONS:INIT_PLUGIN'; -export const EDIT_ANNOTATION = 'ANNOTATIONS:EDIT'; -export const OPEN_EDITOR = 'ANNOTATIONS:OPEN_EDITOR'; -export const SHOW_ANNOTATION = 'ANNOTATIONS:SHOW'; -export const NEW_ANNOTATION = 'ANNOTATIONS:NEW'; -export const REMOVE_ANNOTATION = 'ANNOTATIONS:REMOVE'; -export const REMOVE_ANNOTATION_GEOMETRY = 'ANNOTATIONS:REMOVE_GEOMETRY'; -export const CONFIRM_REMOVE_ANNOTATION = 'ANNOTATIONS:CONFIRM_REMOVE'; -export const CANCEL_REMOVE_ANNOTATION = 'ANNOTATIONS:CANCEL_REMOVE'; -export const CANCEL_EDIT_ANNOTATION = 'ANNOTATIONS:CANCEL_EDIT'; -export const CANCEL_SHOW_ANNOTATION = 'ANNOTATIONS:CANCEL_SHOW'; -export const SAVE_ANNOTATION = 'ANNOTATIONS:SAVE'; -export const TOGGLE_ADD = 'ANNOTATIONS:TOGGLE_ADD'; -export const TOGGLE_STYLE = 'ANNOTATIONS:TOGGLE_STYLE'; -export const SET_STYLE = 'ANNOTATIONS:SET_STYLE'; -export const RESTORE_STYLE = 'ANNOTATIONS:RESTORE_STYLE'; -export const UPDATE_ANNOTATION_GEOMETRY = 'ANNOTATIONS:UPDATE_GEOMETRY'; -export const SET_INVALID_SELECTED = 'ANNOTATIONS:SET_INVALID_SELECTED'; -export const VALIDATION_ERROR = 'ANNOTATIONS:VALIDATION_ERROR'; -export const HIGHLIGHT = 'ANNOTATIONS:HIGHLIGHT'; -export const CLEAN_HIGHLIGHT = 'ANNOTATIONS:CLEAN_HIGHLIGHT'; -export const FILTER_ANNOTATIONS = 'ANNOTATIONS:FILTER'; -export const CLOSE_ANNOTATIONS = 'ANNOTATIONS:CLOSE'; -export const CONFIRM_CLOSE_ANNOTATIONS = 'ANNOTATIONS:CONFIRM_CLOSE'; -export const CANCEL_CLOSE_ANNOTATIONS = 'ANNOTATIONS:CANCEL_CLOSE'; -export const START_DRAWING = 'ANNOTATIONS:START_DRAWING'; -export const UNSAVED_CHANGES = 'ANNOTATIONS:UNSAVED_CHANGES'; -export const TOGGLE_ANNOTATION_VISIBILITY = 'ANNOTATIONS:VISIBILITY'; -export const TOGGLE_CHANGES_MODAL = 'ANNOTATIONS:TOGGLE_CHANGES_MODAL'; -export const TOGGLE_GEOMETRY_MODAL = 'ANNOTATIONS:TOGGLE_GEOMETRY_MODAL'; -export const CHANGED_PROPERTIES = 'ANNOTATIONS:CHANGED_PROPERTIES'; -export const UNSAVED_STYLE = 'ANNOTATIONS:UNSAVED_STYLE'; -export const TOGGLE_STYLE_MODAL = 'ANNOTATIONS:TOGGLE_STYLE_MODAL'; -export const ADD_TEXT = 'ANNOTATIONS:ADD_TEXT'; -export const DOWNLOAD = 'ANNOTATIONS:DOWNLOAD'; -export const LOAD_ANNOTATIONS = 'ANNOTATIONS:LOAD_ANNOTATIONS'; -export const CHANGED_SELECTED = 'ANNOTATIONS:CHANGED_SELECTED'; -export const RESET_COORD_EDITOR = 'ANNOTATIONS:RESET_COORD_EDITOR'; -export const CHANGE_RADIUS = 'ANNOTATIONS:CHANGE_RADIUS'; -export const CHANGE_TEXT = 'ANNOTATIONS:CHANGE_TEXT'; -export const ADD_NEW_FEATURE = 'ANNOTATIONS:ADD_NEW_FEATURE'; -export const SET_EDITING_FEATURE = 'ANNOTATIONS:SET_EDITING_FEATURE'; -export const HIGHLIGHT_POINT = 'ANNOTATIONS:HIGHLIGHT_POINT'; -export const TOGGLE_DELETE_FT_MODAL = 'ANNOTATIONS:TOGGLE_DELETE_FT_MODAL'; -export const CONFIRM_DELETE_FEATURE = 'ANNOTATIONS:CONFIRM_DELETE_FEATURE'; -export const CHANGE_FORMAT = 'ANNOTATIONS:CHANGE_FORMAT'; -export const UPDATE_SYMBOLS = 'ANNOTATIONS:UPDATE_SYMBOLS'; -export const ERROR_SYMBOLS = 'ANNOTATIONS:ERROR_SYMBOLS'; -export const SET_DEFAULT_STYLE = 'ANNOTATIONS:SET_DEFAULT_STYLE'; -export const LOAD_DEFAULT_STYLES = 'ANNOTATIONS:LOAD_DEFAULT_STYLES'; -export const LOADING = 'ANNOTATIONS:LOADING'; -export const CHANGE_GEOMETRY_TITLE = 'ANNOTATIONS:CHANGE_GEOMETRY_TITLE'; -export const FILTER_MARKER = 'ANNOTATIONS:FILTER_MARKER'; -export const HIDE_MEASURE_WARNING = 'ANNOTATIONS:HIDE_MEASURE_WARNING'; -export const TOGGLE_SHOW_AGAIN = 'ANNOTATIONS:TOGGLE_SHOW_AGAIN'; -export const GEOMETRY_HIGHLIGHT = 'ANNOTATIONS:GEOMETRY_HIGHLIGHT'; -export const UNSELECT_FEATURE = 'ANNOTATIONS:UNSELECT_FEATURE'; -export const VALIDATE_FEATURE = 'ANNOTATIONS:VALIDATE_FEATURE'; - -export const initPlugin = () => ({ - type: INIT_PLUGIN -}); - -export const updateSymbols = (symbols = []) => ({ - type: UPDATE_SYMBOLS, - symbols -}); -export const setErrorSymbol = (symbolErrors) => ({ - type: ERROR_SYMBOLS, - symbolErrors -}); - -export const loadAnnotations = (features, override = false) => { - return { - type: LOAD_ANNOTATIONS, - features, - override - }; -}; -export const confirmDeleteFeature = () => { - return { - type: CONFIRM_DELETE_FEATURE - }; -}; -export const openEditor = (id) => { - return { - type: OPEN_EDITOR, - id - }; -}; -export const changeFormat = (format) => { - return { - type: CHANGE_FORMAT, - format - }; -}; -export const toggleDeleteFtModal = () => { - return { - type: TOGGLE_DELETE_FT_MODAL - }; -}; - -export const highlightPoint = (point) => { - return { - type: HIGHLIGHT_POINT, - point - }; -}; - -export const download = (annotation) => { - return { - type: DOWNLOAD, - annotation - }; -}; - -import { head } from 'lodash'; - -export const editAnnotation = (id) => { - return (dispatch, getState) => { - const feature = head(head(getState().layers.flat.filter(l => l.id === 'annotations')).features.filter(f => f.properties.id === id)); - if (feature.type === "FeatureCollection") { - dispatch({ - type: EDIT_ANNOTATION, - feature, - featureType: feature.type - }); - } else { - dispatch({ - type: EDIT_ANNOTATION, - feature, - featureType: feature.geometry.type - }); - } - }; -}; -export const newAnnotation = () => { - return { - type: NEW_ANNOTATION - }; -}; -export const changeSelected = (coordinates, radius, text, crs) => { - return { - type: CHANGED_SELECTED, - coordinates, - radius, - text, - crs - }; -}; -export const setInvalidSelected = (errorFrom, coordinates) => { - return { - type: SET_INVALID_SELECTED, - errorFrom, - coordinates - }; -}; -export const addText = () => { - return { - type: ADD_TEXT - }; -}; - -export const toggleVisibilityAnnotation = (id, visibility) => { - return { - type: TOGGLE_ANNOTATION_VISIBILITY, - id, - visibility - }; -}; - -export const changedProperties = (field, value) => { - return { - type: CHANGED_PROPERTIES, - field, - value - }; -}; -export const removeAnnotation = (id) => { - return { - type: REMOVE_ANNOTATION, - id - }; -}; -export const removeAnnotationGeometry = (id) => { - return { - type: REMOVE_ANNOTATION_GEOMETRY, - id - }; -}; -export const confirmRemoveAnnotation = (id, attribute) => { - return { - type: CONFIRM_REMOVE_ANNOTATION, - id, - attribute - }; -}; -export const cancelRemoveAnnotation = () => { - return { - type: CANCEL_REMOVE_ANNOTATION - }; -}; -export const cancelEditAnnotation = (properties) => { - return { - type: CANCEL_EDIT_ANNOTATION, - properties - }; -}; -export const saveAnnotation = (id, fields, geometry, style, newFeature, properties) => { - return { - type: SAVE_ANNOTATION, - id, - fields, - geometry, - style, - newFeature, - properties - }; -}; -export const toggleAdd = (featureType) => { - return { - type: TOGGLE_ADD, - featureType - }; -}; -export const toggleStyle = (styling) => { - return { - type: TOGGLE_STYLE, - styling - }; -}; -export const restoreStyle = () => { - return { - type: RESTORE_STYLE - }; -}; -export const setStyle = (style) => { - return { - type: SET_STYLE, - style - }; -}; -export const updateAnnotationGeometry = (geometry, textChanged, circleChanged) => { - return { - type: UPDATE_ANNOTATION_GEOMETRY, - geometry, - textChanged, - circleChanged - }; -}; -export const validationError = (errors) => { - return { - type: VALIDATION_ERROR, - errors - }; -}; -export const highlight = (id) => { - return { - type: HIGHLIGHT, - id - }; -}; -export const cleanHighlight = () => { - return { - type: CLEAN_HIGHLIGHT - }; -}; -export const showAnnotation = (id) => { - return { - type: SHOW_ANNOTATION, - id - }; -}; -export const cancelShowAnnotation = () => { - return { - type: CANCEL_SHOW_ANNOTATION - }; -}; -export const filterAnnotations = (filter) => { - return { - type: FILTER_ANNOTATIONS, - filter - }; -}; -export const closeAnnotations = () => { - return { - type: CLOSE_ANNOTATIONS - }; -}; -export const confirmCloseAnnotations = (properties) => { - return { - type: CONFIRM_CLOSE_ANNOTATIONS, - properties - }; -}; -export const setUnsavedChanges = (unsavedChanges) => { - return { - type: UNSAVED_CHANGES, - unsavedChanges - }; -}; -export const setUnsavedStyle = (unsavedStyle) => { - return { - type: UNSAVED_STYLE, - unsavedStyle - }; -}; -export const addNewFeature = () => { - return { - type: ADD_NEW_FEATURE - }; -}; -export const setEditingFeature = (feature) => { - return { - type: SET_EDITING_FEATURE, - feature - }; -}; -export const cancelCloseAnnotations = () => { - return { - type: CANCEL_CLOSE_ANNOTATIONS - }; -}; -export const startDrawing = (options = {}) => { - return { - type: START_DRAWING, - options - }; -}; -export const toggleUnsavedChangesModal = () => { - return { - type: TOGGLE_CHANGES_MODAL - }; -}; -export const toggleUnsavedGeometryModal = () => { - return { - type: TOGGLE_GEOMETRY_MODAL - }; -}; -export const toggleUnsavedStyleModal = () => { - return { - type: TOGGLE_STYLE_MODAL - }; -}; -export const resetCoordEditor = () => { - return { - type: RESET_COORD_EDITOR - }; -}; -export const unSelectFeature = () => { - return { - type: UNSELECT_FEATURE - }; -}; -export const changeRadius = (radius, components, crs) => { - return { - type: CHANGE_RADIUS, - radius, - components, - crs - }; -}; - -export const changeText = (text, components) => { - return { - type: CHANGE_TEXT, - text, - components - }; -}; - -export const setDefaultStyle = (path, style) => ({ - type: SET_DEFAULT_STYLE, - path, - style -}); - -export const loadDefaultStyles = (shape, size, fillColor, strokeColor, symbolsPath) => ({ - type: LOAD_DEFAULT_STYLES, - shape, - size, - fillColor, - strokeColor, - symbolsPath -}); - -export const changeGeometryTitle = (title) => ({ - type: CHANGE_GEOMETRY_TITLE, - title -}); - -export const loading = (value, name = "loading") => ({ - type: LOADING, - name, - value -}); - -export const filterMarker = (filter) => ({ - type: FILTER_MARKER, - filter -}); - - -export const geometryHighlight = (id, state) => ({ - type: GEOMETRY_HIGHLIGHT, - id, - state -}); - -export const hideMeasureWarning = () => ({ - type: HIDE_MEASURE_WARNING -}); - -export const toggleShowAgain = () => ({ - type: TOGGLE_SHOW_AGAIN -}); - -export const validateFeature = () => ({ - type: VALIDATE_FEATURE -}); - diff --git a/web/client/actions/mapInfo.js b/web/client/actions/mapInfo.js index 17eb7e7f13..fdbdc37bce 100644 --- a/web/client/actions/mapInfo.js +++ b/web/client/actions/mapInfo.js @@ -18,7 +18,6 @@ export const SHOW_MAPINFO_MARKER = 'SHOW_MAPINFO_MARKER'; export const HIDE_MAPINFO_MARKER = 'HIDE_MAPINFO_MARKER'; export const SHOW_REVERSE_GEOCODE = 'SHOW_REVERSE_GEOCODE'; export const HIDE_REVERSE_GEOCODE = 'HIDE_REVERSE_GEOCODE'; -export const GET_VECTOR_INFO = 'GET_VECTOR_INFO'; export const NO_QUERYABLE_LAYERS = 'NO_QUERYABLE_LAYERS'; export const CLEAR_WARNING = 'CLEAR_WARNING'; export const FEATURE_INFO_CLICK = 'FEATURE_INFO_CLICK'; @@ -106,19 +105,6 @@ export function newMapInfoRequest(reqId, reqConfig) { }; } -/** - * @deprecated - */ -export function getVectorInfo(layer, request, metadata, queryableLayers) { - return { - type: GET_VECTOR_INFO, - layer, - request, - metadata, - queryableLayers - }; -} - export function changeMapInfoState(enabled) { return { type: CHANGE_MAPINFO_STATE, diff --git a/web/client/components/I18N/IntlNumberFormControl.jsx b/web/client/components/I18N/IntlNumberFormControl.jsx index 39792c5612..a05bfbb2a5 100644 --- a/web/client/components/I18N/IntlNumberFormControl.jsx +++ b/web/client/components/I18N/IntlNumberFormControl.jsx @@ -68,7 +68,7 @@ class IntlNumberFormControl extends React.Component { allow !== null && e.preventDefault(); }} componentClass={"input"} - className="form-control" + className="form-control intl-numeric" /> ); } diff --git a/web/client/components/TOC/DefaultGroup.jsx b/web/client/components/TOC/DefaultGroup.jsx index 487ec1b7bf..8b08eedf48 100644 --- a/web/client/components/TOC/DefaultGroup.jsx +++ b/web/client/components/TOC/DefaultGroup.jsx @@ -86,7 +86,7 @@ class DefaultGroup extends React.Component { let {children, onToggle, connectDragPreview, connectDragSource, connectDropTarget, ...other } = this.props; const selected = this.props.selectedNodes.filter((s) => s === this.props.node.id).length > 0 ? ' selected' : ''; const error = this.props.node.loadingError ? ' group-error' : ''; - const grab = other.isDraggable ? : ; + const grab = other.isDraggable ? : ; const groupHead = (
{grab} diff --git a/web/client/components/TOC/DefaultLayer.jsx b/web/client/components/TOC/DefaultLayer.jsx index c5a077fff6..ba1dd55839 100644 --- a/web/client/components/TOC/DefaultLayer.jsx +++ b/web/client/components/TOC/DefaultLayer.jsx @@ -21,7 +21,7 @@ import OpacitySlider from './fragments/OpacitySlider'; import ToggleFilter from './fragments/ToggleFilter'; import tooltip from '../misc/enhancers/tooltip'; import localizedProps from '../misc/enhancers/localizedProps'; -import { isInsideResolutionsLimits } from '../../utils/LayersUtils'; +import { isInsideResolutionsLimits, getLayerTypeGlyph } from '../../utils/LayersUtils'; import StyleBasedLegend from './fragments/StyleBasedLegend'; const GlyphIndicator = localizedProps('tooltip')(tooltip(Glyphicon)); @@ -175,11 +175,13 @@ class DefaultLayer extends React.Component { || ['wfs', 'vector'].includes(this.props.node.type) && this.props.node?.style?.format === 'geostyler' ) ); + const glyph = getLayerTypeGlyph(this.props.node); const head = (isDummy ?
:
{grab} {this.renderVisibility()} + {glyph && } s === this.props.node.id).length > 0 ? ' selected' : ''; const error = this.props.node.loadingError === 'Error' ? ' layer-error' : ''; const warning = this.props.node.loadingError === 'Warning' ? ' layer-warning' : ''; - const grab = other.isDraggable ? <LayersTool key="grabTool" tooltip="toc.grabLayerIcon" className="toc-grab" ref="target" glyph="menu-hamburger"/> : <span className="toc-layer-tool toc-grab"/>; + const grab = other.isDraggable ? <LayersTool key="grabTool" tooltip="toc.grabLayerIcon" className="toc-grab" ref="target" glyph="grab-handle"/> : <span className="toc-layer-tool toc-grab"/>; const isDummy = !!this.props.node.dummy; const filteredNode = !isDummy && this.filterLayers(this.props.node) ? this.renderNode(grab, hide, selected, error, warning, isDummy, other) : null; const tocListItem = ( @@ -227,7 +229,7 @@ class DefaultLayer extends React.Component { filterLayers = (layer) => { const translation = isObject(layer.title) ? layer.title[this.props.currentLocale] || layer.title.default : layer.title; const title = translation || layer.name; - return title.toLowerCase().indexOf(this.props.filterText.toLowerCase()) !== -1; + return (title || '').toLowerCase().indexOf(this.props.filterText.toLowerCase()) !== -1; }; } diff --git a/web/client/components/TOC/fragments/StyleBasedLegend.jsx b/web/client/components/TOC/fragments/StyleBasedLegend.jsx index d5edeca416..ea1fe5c3eb 100644 --- a/web/client/components/TOC/fragments/StyleBasedLegend.jsx +++ b/web/client/components/TOC/fragments/StyleBasedLegend.jsx @@ -26,7 +26,7 @@ function StyleBasedLegend({ style }) { fillOpacity, image, rotate - } = parseSymbolizerExpressions(symbolizer); + } = parseSymbolizerExpressions(symbolizer, { properties: {} }); switch (symbolizer.kind) { case 'Line': let displayWidth = width; diff --git a/web/client/components/data/identify/viewers/row/RowViewer.jsx b/web/client/components/data/identify/viewers/row/RowViewer.jsx index 91dca5e37a..b557f5fdd7 100644 --- a/web/client/components/data/identify/viewers/row/RowViewer.jsx +++ b/web/client/components/data/identify/viewers/row/RowViewer.jsx @@ -10,7 +10,7 @@ import React from 'react'; import { isString } from 'lodash'; import PropertiesViewer from './PropertiesViewer'; import { getRowViewer } from '../../../../../utils/MapInfoUtils'; -import { ANNOTATIONS } from '../../../../../utils/AnnotationsUtils'; +import { ANNOTATIONS } from '../../../../../plugins/Annotations/utils/AnnotationsUtils'; import PropTypes from 'prop-types'; import {omit} from "lodash/object"; diff --git a/web/client/components/data/identify/viewers/row/__tests__/RowViewer-test.jsx b/web/client/components/data/identify/viewers/row/__tests__/RowViewer-test.jsx index 6687c14e3c..b0fe32c1a5 100644 --- a/web/client/components/data/identify/viewers/row/__tests__/RowViewer-test.jsx +++ b/web/client/components/data/identify/viewers/row/__tests__/RowViewer-test.jsx @@ -10,7 +10,7 @@ import expect from 'expect'; import React from 'react'; import ReactDOM from 'react-dom'; import RowViewer from '../RowViewer'; -import { ANNOTATIONS } from '../../../../../../utils/AnnotationsUtils'; +import { ANNOTATIONS } from '../../../../../../plugins/Annotations/utils/AnnotationsUtils'; import { registerRowViewer } from '../../../../../../utils/MapInfoUtils'; describe('RowViewer', () => { diff --git a/web/client/components/import/dragZone/enhancers/__tests__/processFiles-test.jsx b/web/client/components/import/dragZone/enhancers/__tests__/processFiles-test.jsx index 1e0500ed33..455225a625 100644 --- a/web/client/components/import/dragZone/enhancers/__tests__/processFiles-test.jsx +++ b/web/client/components/import/dragZone/enhancers/__tests__/processFiles-test.jsx @@ -143,12 +143,16 @@ describe('processFiles enhancer', () => { .take(1) .switchMap(({ onDrop = () => { } }) => getAnnotationGeoJsonFile().map((file) => onDrop([file]))).ignoreElements())) )(createSink(props => { - expect(props).toBeTruthy(); - if (props.files) { - expect(props.files.layers.length).toBe(1); - expect(props.files.layers[0].name).toBe("Annotations"); - expect(props.files.layers[0].features).toBeTruthy(); - done(); + try { + expect(props).toBeTruthy(); + if (props.files) { + expect(props.files.layers.length).toBe(1); + expect(props.files.layers[0].name).toBe("Annotations"); + expect(props.files.layers[0].features).toBeTruthy(); + done(); + } + } catch (e) { + done(e); } })); ReactDOM.render(<Sink />, document.getElementById("container")); diff --git a/web/client/components/import/dragZone/enhancers/processFiles.jsx b/web/client/components/import/dragZone/enhancers/processFiles.jsx index c2cef1ba0f..65a62202cf 100644 --- a/web/client/components/import/dragZone/enhancers/processFiles.jsx +++ b/web/client/components/import/dragZone/enhancers/processFiles.jsx @@ -11,7 +11,7 @@ import { every, get, some } from 'lodash'; import { compose, createEventHandler, mapPropsStream } from 'recompose'; import Rx from 'rxjs'; -import { isAnnotation } from '../../../../utils/AnnotationsUtils'; +import { isAnnotation, importJSONToAnnotations } from '../../../../plugins/Annotations/utils/AnnotationsUtils'; import ConfigUtils from '../../../../utils/ConfigUtils'; import { MIME_LOOKUPS, @@ -146,7 +146,7 @@ export default compose( jsonObjects.filter(json => isGeoJSON(json)) .map(json => (isAnnotation(json) ? // annotation GeoJSON to layers - { name: "Annotations", features: json?.features || [], filename: json.filename} : + { name: "Annotations", features: importJSONToAnnotations(json), filename: json.filename} : // other GeoJSON to layers {...geoJSONToLayer(json), filename: json.filename})) ), diff --git a/web/client/components/import/style/StylePanel.jsx b/web/client/components/import/style/StylePanel.jsx index 9088651210..81d68f137e 100644 --- a/web/client/components/import/style/StylePanel.jsx +++ b/web/client/components/import/style/StylePanel.jsx @@ -13,7 +13,7 @@ import { Promise } from 'es6-promise'; import Message from '../../I18N/Message'; import { getMessageById } from '../../../utils/LocaleUtils'; -import { isAnnotation } from '../../../utils/AnnotationsUtils'; +import { isAnnotation } from '../../../plugins/Annotations/utils/AnnotationsUtils'; import { applyDefaultStyleToVectorLayer } from '../../../utils/StyleUtils'; import Button from '../../misc/Button'; diff --git a/web/client/components/map/cesium/EditGeoJSONSupport.jsx b/web/client/components/map/cesium/EditGeoJSONSupport.jsx index a8ae796fbe..8eb740165b 100644 --- a/web/client/components/map/cesium/EditGeoJSONSupport.jsx +++ b/web/client/components/map/cesium/EditGeoJSONSupport.jsx @@ -49,6 +49,7 @@ function EditGeoJSONSupport({ return () => { if (modify.current) { modify.current.remove(); + modify.current = null; } }; }, [map, active]); @@ -56,7 +57,6 @@ function EditGeoJSONSupport({ useEffect(() => { if (modify.current) { modify.current.setGeoJSON(geojson); - modify.current = null; } }, [geojson]); diff --git a/web/client/components/map/cesium/Map.jsx b/web/client/components/map/cesium/Map.jsx index a0f1f8ffc6..9caa4d90bd 100644 --- a/web/client/components/map/cesium/Map.jsx +++ b/web/client/components/map/cesium/Map.jsx @@ -274,12 +274,14 @@ class CesiumMap extends React.Component { const cartesian = this.map.camera.pickEllipsoid(movement.endPosition, this.map.scene.globe.ellipsoid); let cartographic = ClickUtils.getMouseXYZ(this.map, movement) || cartesian && Cesium.Cartographic.fromCartesian(cartesian); if (cartographic) { + const intersectedFeatures = this.getIntersectedFeatures(this.map, movement.endPosition); const elevation = Math.round(cartographic.height); this.props.onMouseMove({ y: cartographic.latitude * 180.0 / Math.PI, x: cartographic.longitude * 180.0 / Math.PI, z: elevation, - crs: "EPSG:4326" + crs: "EPSG:4326", + intersectedFeatures }); } } diff --git a/web/client/components/map/leaflet/Map.jsx b/web/client/components/map/leaflet/Map.jsx index e99ea2e8f0..702b442c84 100644 --- a/web/client/components/map/leaflet/Map.jsx +++ b/web/client/components/map/leaflet/Map.jsx @@ -476,6 +476,7 @@ class LeafletMap extends React.Component { mouseMoveEvent = (event) => { let pos = event.latlng.wrap(); + const intersectedFeatures = this.getIntersectedFeatures(this.map, event.latlng); this.props.onMouseMove({ x: pos.lng || 0.0, y: pos.lat || 0.0, @@ -490,7 +491,8 @@ class LeafletMap extends React.Component { lng: event.latlng.lng, z: this.elevationLayer && this.elevationLayer.getElevation(event.latlng, event.containerPoint) || undefined }, - rawPos: [event.latlng.lat, event.latlng.lng] + rawPos: [event.latlng.lat, event.latlng.lng], + intersectedFeatures }); }; diff --git a/web/client/components/map/leaflet/__tests__/Layer-test.jsx b/web/client/components/map/leaflet/__tests__/Layer-test.jsx index 4b2b283eec..354e529628 100644 --- a/web/client/components/map/leaflet/__tests__/Layer-test.jsx +++ b/web/client/components/map/leaflet/__tests__/Layer-test.jsx @@ -32,7 +32,7 @@ import '../plugins/VectorLayer'; let mockAxios; import { setStore } from '../../../../utils/SecurityUtils'; -import { DEFAULT_ANNOTATIONS_STYLES } from '../../../../utils/AnnotationsUtils'; +import { DEFAULT_ANNOTATIONS_STYLES } from '../../../../plugins/Annotations/utils/AnnotationsUtils'; import { setConfigProp } from '../../../../utils/ConfigUtils'; import { getResolutions } from '../../../../utils/MapUtils'; diff --git a/web/client/components/map/openlayers/DrawSupport.jsx b/web/client/components/map/openlayers/DrawSupport.jsx index f0fe801de6..d82714fb4e 100644 --- a/web/client/components/map/openlayers/DrawSupport.jsx +++ b/web/client/components/map/openlayers/DrawSupport.jsx @@ -26,7 +26,7 @@ import {isSimpleGeomType, getSimpleGeomType} from '../../../utils/MapUtils'; import {reprojectGeoJson, calculateDistance, reproject} from '../../../utils/CoordinatesUtils'; import {createStylesAsync} from '../../../utils/VectorStyleUtils'; import {transformPolygonToCircle} from '../../../utils/openlayers/DrawSupportUtils'; -import {isCompletePolygon} from '../../../utils/AnnotationsUtils'; +import {isCompletePolygon} from '../../../plugins/Annotations/utils/AnnotationsUtils'; import { parseStyles, getStyle, defaultStyles, getMarkerStyle, getMarkerStyleLegacy } from './VectorStyle'; import {GeoJSON} from 'ol/format'; diff --git a/web/client/components/map/openlayers/Map.jsx b/web/client/components/map/openlayers/Map.jsx index 0dd1312a0f..8bc0997ebe 100644 --- a/web/client/components/map/openlayers/Map.jsx +++ b/web/client/components/map/openlayers/Map.jsx @@ -201,7 +201,6 @@ class OpenlayersMap extends React.Component { } let layerInfo; - let groupIntersectedFeatures = {}; this.markerPresent = false; /* * Handle special case for vector features with handleClickOnLayer=true @@ -219,17 +218,8 @@ class OpenlayersMap extends React.Component { coords = { x: arr[0], y: arr[1] }; } } - if (layer?.get('msId')) { - const geoJSONFeature = geoJSONFormat.writeFeatureObject(feature, { - featureProjection: this.props.projection, - dataProjection: 'EPSG:4326' - }); - groupIntersectedFeatures[layer.get('msId')] = groupIntersectedFeatures[layer.get('msId')] - ? [ ...groupIntersectedFeatures[layer.get('msId')], geoJSONFeature ] - : [ geoJSONFeature ]; - } }); - const intersectedFeatures = Object.keys(groupIntersectedFeatures).map(id => ({ id, features: groupIntersectedFeatures[id] })); + const intersectedFeatures = this.getIntersectedFeatures(map, event?.pixel); const tLng = normalizeLng(coords.x); const getElevation = this.map.get('elevationLayer') && this.map.get('elevationLayer').get('getElevation'); this.props.onClick({ @@ -390,6 +380,23 @@ class OpenlayersMap extends React.Component { return view.getProjection().getExtent() || msGetProjection(props.projection).extent; }; + getIntersectedFeatures = (map, pixel) => { + let groupIntersectedFeatures = {}; + map.forEachFeatureAtPixel(pixel, (feature, layer) => { + if (layer?.get('msId')) { + const geoJSONFeature = geoJSONFormat.writeFeatureObject(feature, { + featureProjection: this.props.projection, + dataProjection: 'EPSG:4326' + }); + groupIntersectedFeatures[layer.get('msId')] = groupIntersectedFeatures[layer.get('msId')] + ? [ ...groupIntersectedFeatures[layer.get('msId')], geoJSONFeature ] + : [ geoJSONFeature ]; + } + }); + const intersectedFeatures = Object.keys(groupIntersectedFeatures).map(id => ({ id, features: groupIntersectedFeatures[id] })); + return intersectedFeatures; + }; + render() { const map = this.map; const children = map ? React.Children.map(this.props.children, child => { @@ -423,6 +430,7 @@ class OpenlayersMap extends React.Component { } else if (tLng > 180) { tLng = tLng - 360; } + const intersectedFeatures = this.getIntersectedFeatures(this.map, event?.pixel); this.props.onMouseMove({ y: coords[1] || 0.0, x: tLng || 0.0, @@ -439,7 +447,8 @@ class OpenlayersMap extends React.Component { }, lat: coords[1], lng: tLng, - rawPos: event.coordinate.slice() + rawPos: event.coordinate.slice(), + intersectedFeatures }); } }; diff --git a/web/client/components/map/openlayers/__tests__/DrawSupport-test.jsx b/web/client/components/map/openlayers/__tests__/DrawSupport-test.jsx index 35124b699e..06b7f19e5e 100644 --- a/web/client/components/map/openlayers/__tests__/DrawSupport-test.jsx +++ b/web/client/components/map/openlayers/__tests__/DrawSupport-test.jsx @@ -10,7 +10,7 @@ import ReactDOM from 'react-dom'; import expect from 'expect'; import assign from 'object-assign'; import DrawSupport from '../DrawSupport'; -import {DEFAULT_ANNOTATIONS_STYLES} from '../../../../utils/AnnotationsUtils'; +import {DEFAULT_ANNOTATIONS_STYLES} from '../../../../plugins/Annotations/utils/AnnotationsUtils'; import {circle, geomCollFeature} from '../../../../test-resources/drawsupport/features'; import {Map, View, Feature} from 'ol'; import {Point, Circle, Polygon, LineString, MultiPoint, MultiPolygon, MultiLineString} from 'ol/geom'; diff --git a/web/client/components/map/openlayers/__tests__/Feature-test.jsx b/web/client/components/map/openlayers/__tests__/Feature-test.jsx index 381fe40d57..3ab6f4c45e 100644 --- a/web/client/components/map/openlayers/__tests__/Feature-test.jsx +++ b/web/client/components/map/openlayers/__tests__/Feature-test.jsx @@ -10,7 +10,7 @@ import ReactDOM from 'react-dom'; import expect from 'expect'; import Feature from '../Feature'; import '../../../../utils/openlayers/Layers'; -import {DEFAULT_ANNOTATIONS_STYLES} from '../../../../utils/AnnotationsUtils'; +import {DEFAULT_ANNOTATIONS_STYLES} from '../../../../plugins/Annotations/utils/AnnotationsUtils'; import '../plugins/VectorLayer'; import { Map, View } from 'ol'; diff --git a/web/client/components/map/openlayers/__tests__/LegacyVectorStyle-test.js b/web/client/components/map/openlayers/__tests__/LegacyVectorStyle-test.js index 7b31689bc9..0effd05db5 100644 --- a/web/client/components/map/openlayers/__tests__/LegacyVectorStyle-test.js +++ b/web/client/components/map/openlayers/__tests__/LegacyVectorStyle-test.js @@ -9,7 +9,7 @@ import expect from 'expect'; import { getStyle, styleFunction, firstPointOfPolylineStyle, lastPointOfPolylineStyle, startEndPolylineStyle } from '../LegacyVectorStyle'; import {geomCollFeature, multipointFt, lineStringFt, polygonFt, multipolygonFt} from '../../../../test-resources/drawsupport/features'; -import {DEFAULT_ANNOTATIONS_STYLES, STYLE_CIRCLE, STYLE_POLYGON} from '../../../../utils/AnnotationsUtils'; +import {DEFAULT_ANNOTATIONS_STYLES, STYLE_CIRCLE, STYLE_POLYGON} from '../../../../plugins/Annotations/utils/AnnotationsUtils'; import Feature from 'ol/Feature'; import {Point, LineString, MultiLineString, Polygon, MultiPolygon} from 'ol/geom'; diff --git a/web/client/components/map/openlayers/plugins/VectorLayer.js b/web/client/components/map/openlayers/plugins/VectorLayer.js index 06b4143ad5..4063a49aa2 100644 --- a/web/client/components/map/openlayers/plugins/VectorLayer.js +++ b/web/client/components/map/openlayers/plugins/VectorLayer.js @@ -19,14 +19,14 @@ Layers.registerType('vector', { let features = []; const source = new VectorSource({ - features: features + features: features, // spatial index is removing feature that are not currently in view // usually vector layer has a low count of features (eg annotation) // so we could disable it (doc states it improve performance at false with low count of features) // this helps also to make the circle style visible even if the center is out of the view // when the spatial index is active the renderBuffer of vector layer is used to filter features - // we could implement a different loading strategy to visualize correctly the Circle style - // useSpatialIndex: false + // we could implement a different loading strategy to visualize correctly the Circle style and Geodesic lines + useSpatialIndex: false }); const layer = new VectorLayer({ diff --git a/web/client/components/mapcontrols/annotations/Annotations.jsx b/web/client/components/mapcontrols/annotations/Annotations.jsx index 015c426881..e9e0d60591 100644 --- a/web/client/components/mapcontrols/annotations/Annotations.jsx +++ b/web/client/components/mapcontrols/annotations/Annotations.jsx @@ -14,7 +14,7 @@ import React from 'react'; import { Glyphicon } from 'react-bootstrap'; import uuidv1 from 'uuid/v1'; -import { getGeometryGlyphInfo } from '../../../utils/AnnotationsUtils'; +import { getGeometryGlyphInfo } from '../../../utils/LegacyAnnotationsUtils'; import { getMessageById } from '../../../utils/LocaleUtils'; import Message from '../../I18N/Message'; import BorderLayout from '../../layout/BorderLayout'; diff --git a/web/client/components/mapcontrols/annotations/AnnotationsEditor.jsx b/web/client/components/mapcontrols/annotations/AnnotationsEditor.jsx index be2e860522..1c9fdc1997 100644 --- a/web/client/components/mapcontrols/annotations/AnnotationsEditor.jsx +++ b/web/client/components/mapcontrols/annotations/AnnotationsEditor.jsx @@ -30,7 +30,7 @@ import { getGeometryGlyphInfo, getGeometryType, validateCoords -} from '../../../utils/AnnotationsUtils'; +} from '../../../utils/LegacyAnnotationsUtils'; import { MEASURE_TYPE } from '../../../utils/MeasurementUtils'; import { handleExpression } from '../../../utils/PluginsUtils'; import Message from '../../I18N/Message'; @@ -40,7 +40,7 @@ import Toolbar from '../../misc/toolbar/Toolbar'; import Manager from '../../style/vector/Manager'; import defaultConfig from './AnnotationsConfig'; import FeaturesList from './FeaturesList'; -import GeometryEditor from './GeometryEditor'; +import GeometryEditor from '../../../plugins/Annotations/components/GeometryEditor'; import { getApi } from '../../../api/userPersistedStorage'; /** diff --git a/web/client/components/mapcontrols/annotations/CoordinatesEditor.jsx b/web/client/components/mapcontrols/annotations/CoordinatesEditor.jsx index 2257dd530f..e84603096c 100644 --- a/web/client/components/mapcontrols/annotations/CoordinatesEditor.jsx +++ b/web/client/components/mapcontrols/annotations/CoordinatesEditor.jsx @@ -27,7 +27,7 @@ import { getMessageById } from '../../../utils/LocaleUtils'; import Toolbar from '../../misc/toolbar/Toolbar'; import draggableContainer from '../../misc/enhancers/draggableContainer'; import Message from '../../I18N/Message'; -import { validateCoords, coordToArray } from '../../../utils/AnnotationsUtils'; +import { validateCoords, coordToArray } from '../../../plugins/Annotations/utils/AnnotationsUtils'; import CoordinatesRow from '../../misc/coordinateeditors/CoordinatesRow'; import MeasureEditor from './MeasureEditor'; @@ -82,7 +82,8 @@ class CoordinatesEditor extends React.Component { showLengthAndBearingLabel: PropTypes.bool, renderer: PropTypes.string, style: PropTypes.object, - onValidateFeature: PropTypes.func + onValidateFeature: PropTypes.func, + enableHeightField: PropTypes.bool }; static contextTypes = { @@ -120,7 +121,8 @@ class CoordinatesEditor extends React.Component { isMouseLeaveEnabled: false, properties: {}, type: "Point", - style: {display: 'flex', flexDirection: 'column', flex: 1} + style: {display: 'flex', flexDirection: 'column', flex: 1}, + enableHeightField: false }; getValidationStateRadius = (radius) => { @@ -132,7 +134,7 @@ class CoordinatesEditor extends React.Component { } renderCircle() { - return (<div style={{flex: 1, overflowY: 'auto', padding: "0 10px"}}> + return (<div className="ms-coordinates-editor-radius" style={{flex: 1, overflowY: 'auto', padding: "0 10px"}}> <div> <FormGroup validationState={this.getValidationStateRadius(this.props.properties.radius)}> <ControlLabel><Message msgId="annotations.editor.radius"/></ControlLabel> @@ -192,7 +194,8 @@ class CoordinatesEditor extends React.Component { { glyph: validationCompleteButton ? 'ok-sign text-success' : 'exclamation-mark text-danger', tooltipId: validationCompleteButton ? 'annotations.editor.valid' : componentsValidation[type].notValid, - visible: true + visible: true, + onClick: () => {} }, { Element: () => ( <DropdownButton @@ -278,6 +281,7 @@ class CoordinatesEditor extends React.Component { aeronauticalOptions={this.props.aeronauticalOptions} sortId={idx} key={idx + " key"} + enableHeightField={this.props.enableHeightField} disabled={this.props.properties.disabled && validateCoords(component)} renderer={this.props.renderer} isDraggable={this.props.isDraggable} @@ -377,7 +381,7 @@ class CoordinatesEditor extends React.Component { if (this.props.type === "Polygon") { const validComponents = components.filter(validateCoords); const coordinates = this.props.features[this.props.currentFeature]?.geometry?.coordinates?.[0] || []; - const invalidCoordinateIndex = coordinates !== undefined ? coordinates.findIndex(c=> !validateCoords({lon: c[0], lat: c[1]})) : -1; + const invalidCoordinateIndex = coordinates !== undefined ? coordinates.findIndex(c=> !validateCoords({lon: c[0], lat: c[1], ...(c[2] !== undefined && { height: c[2] }) })) : -1; return components.concat([validComponents.length && invalidCoordinateIndex !== 0 ? validComponents[0] : {lat: "", lon: ""}]); } return components; @@ -386,7 +390,8 @@ class CoordinatesEditor extends React.Component { let tempComps = this.props.components; const lat = isNaN(parseFloat(value.lat)) ? "" : parseFloat(value.lat); const lon = isNaN(parseFloat(value.lon)) ? "" : parseFloat(value.lon); - tempComps[id] = {lat, lon}; + const height = value.height !== undefined ? isNaN(parseFloat(value.height)) ? "" : parseFloat(value.height) : undefined; + tempComps[id] = {lat, lon, ...(height !== undefined && { height })}; let validComponents = this.addCoordPolygon(tempComps); this.props.onChange(validComponents, this.props.properties.radius, this.props.properties.valueText, this.props.mapProjection); if (!this.isValid(tempComps)) { diff --git a/web/client/components/mapcontrols/annotations/DropdownFeatureType.jsx b/web/client/components/mapcontrols/annotations/DropdownFeatureType.jsx index d574f15e76..a7c4b76823 100644 --- a/web/client/components/mapcontrols/annotations/DropdownFeatureType.jsx +++ b/web/client/components/mapcontrols/annotations/DropdownFeatureType.jsx @@ -8,7 +8,7 @@ import { Glyphicon, DropdownButton, MenuItem } from 'react-bootstrap'; import tooltip from '../../misc/enhancers/tooltip'; -import { DEFAULT_ANNOTATIONS_STYLES, getStartEndPointsForLinestring } from '../../../utils/AnnotationsUtils'; +import { DEFAULT_ANNOTATIONS_STYLES, getStartEndPointsForLinestring } from '../../../utils/LegacyAnnotationsUtils'; import React from 'react'; import uuidv1 from 'uuid/v1'; import assign from 'object-assign'; diff --git a/web/client/components/mapcontrols/annotations/FeaturesList.jsx b/web/client/components/mapcontrols/annotations/FeaturesList.jsx index 719e3721a2..c69fa022c3 100644 --- a/web/client/components/mapcontrols/annotations/FeaturesList.jsx +++ b/web/client/components/mapcontrols/annotations/FeaturesList.jsx @@ -14,7 +14,7 @@ import OverlayTrigger from '../../misc/OverlayTrigger'; import cs from 'classnames'; import Message from '../../I18N/Message'; import {get} from 'lodash'; -import {DEFAULT_ANNOTATIONS_STYLES, getStartEndPointsForLinestring, getGeometryGlyphInfo, getGeometryType} from '../../../utils/AnnotationsUtils'; +import {DEFAULT_ANNOTATIONS_STYLES, getStartEndPointsForLinestring, getGeometryGlyphInfo, getGeometryType} from '../../../utils/LegacyAnnotationsUtils'; /** * Feature List component for Annotation Viewer. diff --git a/web/client/components/mapcontrols/annotations/SelectAnnotationsFile.jsx b/web/client/components/mapcontrols/annotations/SelectAnnotationsFile.jsx index c06eddcdae..6eb6595d60 100644 --- a/web/client/components/mapcontrols/annotations/SelectAnnotationsFile.jsx +++ b/web/client/components/mapcontrols/annotations/SelectAnnotationsFile.jsx @@ -13,7 +13,7 @@ import { Checkbox } from 'react-bootstrap'; import Dropzone from 'react-dropzone'; import Spinner from 'react-spinkit'; -import { ANNOTATION_TYPE } from '../../../utils/AnnotationsUtils'; +import { ANNOTATION_TYPE } from '../../../plugins/Annotations/utils/AnnotationsUtils'; import { readGeoJson } from '../../../utils/FileUtils'; import Message from '../../I18N/Message'; import ResizableModal from '../../misc/ResizableModal'; diff --git a/web/client/components/mapcontrols/annotations/__tests__/CoordinatesEditor-test.js b/web/client/components/mapcontrols/annotations/__tests__/CoordinatesEditor-test.js index 655d39bec1..5375edc56f 100644 --- a/web/client/components/mapcontrols/annotations/__tests__/CoordinatesEditor-test.js +++ b/web/client/components/mapcontrols/annotations/__tests__/CoordinatesEditor-test.js @@ -61,7 +61,7 @@ describe("test the CoordinatesEditor Panel", () => { expect(editor).toExist(); const mainContainer = TestUtils.scryRenderedDOMComponentsWithClass(editor, "coordinates-editor"); expect(mainContainer).toExist(); - const hamburgerMenus = TestUtils.scryRenderedDOMComponentsWithClass(editor, "glyphicon-menu-hamburger"); + const hamburgerMenus = TestUtils.scryRenderedDOMComponentsWithClass(editor, "glyphicon-grab-handle"); expect(hamburgerMenus.length).toBe(0); const spans = TestUtils.scryRenderedDOMComponentsWithTag(editor, "span"); @@ -112,7 +112,7 @@ describe("test the CoordinatesEditor Panel", () => { />, document.getElementById("container") ); expect(editor).toExist(); - const hamburgerMenus = TestUtils.scryRenderedDOMComponentsWithClass(editor, "glyphicon-menu-hamburger"); + const hamburgerMenus = TestUtils.scryRenderedDOMComponentsWithClass(editor, "glyphicon-grab-handle"); expect(hamburgerMenus.length).toBe(0); const spans = TestUtils.scryRenderedDOMComponentsWithTag(editor, "span"); @@ -192,7 +192,7 @@ describe("test the CoordinatesEditor Panel", () => { />, document.getElementById("container") ); expect(editor).toExist(); - const hamburgerMenus = TestUtils.scryRenderedDOMComponentsWithClass(editor, "glyphicon-menu-hamburger"); + const hamburgerMenus = TestUtils.scryRenderedDOMComponentsWithClass(editor, "glyphicon-grab-handle"); expect(hamburgerMenus.length).toBe(3); const inputs = TestUtils.scryRenderedDOMComponentsWithTag(editor, "input"); const labelTexts = TestUtils.scryRenderedDOMComponentsWithClass(editor, "label-texts"); @@ -577,7 +577,7 @@ describe("test the CoordinatesEditor Panel", () => { ); expect(editor).toExist(); - const hamburgerMenus = TestUtils.scryRenderedDOMComponentsWithClass(editor, "glyphicon-menu-hamburger"); + const hamburgerMenus = TestUtils.scryRenderedDOMComponentsWithClass(editor, "glyphicon-grab-handle"); expect(hamburgerMenus.length).toBe(0); const inputs = TestUtils.scryRenderedDOMComponentsWithTag(editor, "input"); expect(inputs).toExist(); @@ -670,7 +670,7 @@ describe("test the CoordinatesEditor Panel", () => { inputLat.value = ""; TestUtils.Simulate.change(inputLat); - const hamburgerMenus = TestUtils.scryRenderedDOMComponentsWithClass(editor, "glyphicon-menu-hamburger"); + const hamburgerMenus = TestUtils.scryRenderedDOMComponentsWithClass(editor, "glyphicon-grab-handle"); expect(hamburgerMenus.length).toBe(0); expect(spyOnHighlightPoint).toNotHaveBeenCalled(); @@ -883,7 +883,7 @@ describe("test the CoordinatesEditor Panel", () => { ); expect(editor).toExist(); - const hamburgerMenus = TestUtils.scryRenderedDOMComponentsWithClass(editor, "glyphicon-menu-hamburger"); + const hamburgerMenus = TestUtils.scryRenderedDOMComponentsWithClass(editor, "glyphicon-grab-handle"); expect(hamburgerMenus.length).toBe(5); let buttons = TestUtils.scryRenderedDOMComponentsWithClass(editor, "btn-default"); expect(buttons.length).toBe(18); diff --git a/web/client/components/mapcontrols/annotations/img/markers_shadow.png b/web/client/components/mapcontrols/annotations/img/markers_shadow.png index 33cf95504706aa9d06ad40dbcd2fa168cbd43d13..70564e9227a0193b546cf7a626bbb7042f25ffae 100644 GIT binary patch literal 355 zcmV-p0i6DcP)<h;3K|Lk000e1NJLTq0015U001fo1^@s6q}%Hm0003hNkl<ZSi|j< z%WA_g6hzOBoYJ(Rv;+#J|NnD+*?~Ol+LF2%fs##ennf3PK**Mnj%KbUaJgJAm&@gH zxm+%n>)*)cP6#0wKuRfSzSZmGoEIkmvjk)yn^`oo9AnIO!A2Wk3EZj=z(S3xN5BM( zKo1=CoSGRx)1o)PquQO|i?aj^Fah7dUf(7l&H>jOxCfqr7htW86j%XHz#xZvxjjjD zE;uOS4e$y)Xe`UgSOF)s0zZ_PF98?$N>M-Qz0`0g*a7$gK7mf-{a?UYle3~*YJ5C{ zm9~}Jp{n_;sI&U0pJgj2jU2YX2k@@vRxSs9Pt_W;Yh3Es18=Hzr^Q>j?d0%S#hR~j zf#@$@tHvt<c8a>xF<$-V(wQxnNK>8Fv9957`T>Qsa)29OvI+nI002ovPDHLkV1jY5 Bo%8?z literal 535 zcmV+y0_gpTP)<h;3K|Lk000e1NJLTq001KZ000mO1^@s6oHxc=0005rNkl<Zc-qa> z;YUMJ9LDj?%v_nt)m$@krAcNsnI+jwmXs_h*_0I1l(LjkN~I{3^dGP1#rMT==4>za zro+dw-OhQ=@BYr2==b~ohHFF&QHddL@L-x8!b2P}iLwT)VFmCcAyeYZw4@|J+LCcd zBgGt31dLmO_yhbHCxp)=Gm?{e$xA_shLS@O1<5l<$ejLQAa{^JW|?eJs<I*ttPauO z*}BwZnK?>qD5OfsQDHnvnUgXTZ^^E-W#7^^w0LeunzBK-x-1c9PO_|#7#1eR0~!9Y z!2%sQlb+>5&iSp&bH{QZdu(Ej>Qp4pD-WoO$C{C0VX~C9$pY8%D9?sRxtCkHBG`!> zQKcqTS$0*#48qYK2$PhMvhJ|+CwZ4|`H~NLBh;N-${9iS2vRqy5lY}XMaDhjcuj<1 z$1eo=l^^-!y9c?VB8ReVRHG<4=JM_SfPLu=HZZ$bpaDDV{*~&y5~4?lwrtX0i&kGy z3FCsZhVuqCs^fD6tCanezPTYpmy@)`5w1{)SqaQL#BNYNM~7iVjaQYI8jH5DE$aj= z3ytaO32~0mVIoYHv@X61ix)=*u*SGyqDG*Uq**+qVktt<l<uAwKMYvJLjsdlfH4MP Z@CQ6S_Q=hH$vXf5002ovPDHLkV1ihP_nrU% diff --git a/web/client/components/misc/coordinateeditors/CoordinatesRow.jsx b/web/client/components/misc/coordinateeditors/CoordinatesRow.jsx index b9e73f9630..0053e96988 100644 --- a/web/client/components/misc/coordinateeditors/CoordinatesRow.jsx +++ b/web/client/components/misc/coordinateeditors/CoordinatesRow.jsx @@ -9,14 +9,17 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Glyphicon, InputGroup } from 'react-bootstrap'; +import { Glyphicon, InputGroup, FormGroup } from 'react-bootstrap'; import Toolbar from '../toolbar/Toolbar'; import draggableComponent from '../enhancers/draggableComponent'; import CoordinateEntry from './CoordinateEntry'; import Message from '../../I18N/Message'; import { isEqual, isNumber } from 'lodash'; import DropdownToolbarOptions from '../toolbar/DropdownToolbarOptions'; +import MSIntlNumberFormControl from '../../I18N/IntlNumberFormControl'; +import localizedProps from '../../misc/enhancers/localizedProps'; +const IntlNumberFormControl = localizedProps('placeholder')(MSIntlNumberFormControl); class CoordinatesRow extends React.Component { static propTypes = { @@ -42,7 +45,8 @@ class CoordinatesRow extends React.Component { removeEnabled: PropTypes.bool, renderer: PropTypes.string, disabled: PropTypes.bool, - onValidateFeature: PropTypes.func + onValidateFeature: PropTypes.func, + enableHeightField: PropTypes.bool }; static defaultProps = { @@ -52,7 +56,8 @@ class CoordinatesRow extends React.Component { onMouseLeave: () => {}, onValidateFeature: () => {}, showToolButtons: true, - disabled: false + disabled: false, + enableHeightField: false }; constructor(props) { @@ -60,6 +65,7 @@ class CoordinatesRow extends React.Component { this.state = { lat: isNumber(this.props.component.lat) ? this.props.component.lat : "", lon: isNumber(this.props.component.lon) ? this.props.component.lon : "", + ...(this.props.component.height !== undefined && { height: isNumber(this.props.component.height) ? this.props.component.height : "" }), disabledApplyChange: true }; } @@ -68,15 +74,24 @@ class CoordinatesRow extends React.Component { if (!isEqual(newProps.component, this.props.component)) { const lat = isNumber(newProps.component.lat) ? newProps.component.lat : ""; const lon = isNumber(newProps.component.lon) ? newProps.component.lon : ""; - this.setState({lat, lon, disabledApplyChange: true}); + const height = isNumber(newProps.component.height) ? newProps.component.height : ""; + this.setState({ + lat, + lon, + ...(newProps.component.height !== undefined && { height }), + disabledApplyChange: true + }); } } - onChangeLatLon = (coord, val) => { + onChangeLatLonHeight = (coord, val) => { this.setState({...this.state, [coord]: parseFloat(val)}, ()=>{ const changeLat = parseFloat(this.state.lat) !== parseFloat(this.props.component.lat); const changeLon = parseFloat(this.state.lon) !== parseFloat(this.props.component.lon); - this.setState({...this.state, disabledApplyChange: !(changeLat || changeLon)}, ()=> { + const changeHeight = this.state.height !== undefined + ? parseFloat(this.state.height) !== parseFloat(this.props.component.height) + : false; + this.setState({...this.state, disabledApplyChange: !(changeLat || changeLon || changeHeight)}, ()=> { this.props.onValidateFeature(); // Auto save on coordinate change for annotations this.props.renderer === "annotations" && this.props.onSubmit(this.props.idx, this.state); @@ -133,12 +148,12 @@ class CoordinatesRow extends React.Component { // drag button cannot be a button since IE/Edge doesn't support drag operation on button const dragButton = ( <div role="button" className="square-button-md no-border btn btn-default" - style={{display: "table", + style={{display: "inline-flex", alignItems: 'center', justifyContent: 'center', width: 'auto', color: !this.props.isDraggableEnabled && "#999999", pointerEvents: !this.props.isDraggableEnabled ? "none" : "auto", cursor: this.props.isDraggableEnabled && 'grab' }}> <Glyphicon - glyph="menu-hamburger" + glyph="grab-handle" /> </div>); @@ -166,7 +181,7 @@ class CoordinatesRow extends React.Component { coordinate="lat" idx={idx} value={this.state.lat} - onChange={(dd) => this.onChangeLatLon("lat", dd)} + onChange={(dd) => this.onChangeLatLonHeight("lat", dd)} constraints={{ decimal: { lat: { @@ -193,7 +208,7 @@ class CoordinatesRow extends React.Component { coordinate="lon" idx={idx} value={this.state.lon} - onChange={(dd) => this.onChangeLatLon("lon", dd)} + onChange={(dd) => this.onChangeLatLonHeight("lon", dd)} constraints={{ decimal: { lat: { @@ -210,6 +225,31 @@ class CoordinatesRow extends React.Component { /> </InputGroup> </div> + {this.props.enableHeightField && <div className="input-group-container"> + <InputGroup> + <InputGroup.Addon><Message msgId="height"/></InputGroup.Addon> + <FormGroup> + <IntlNumberFormControl + disabled={this.props.disabled} + key="height" + value={this.state.height} + onChange={val => this.onChangeLatLonHeight("height", val)} + onKeyDown={(event) => { + if (event.keyCode === 69) { + event.preventDefault(); + } + if (event.keyCode === 13) { + event.preventDefault(); + event.stopPropagation(); + this.onSubmit(event); + } + }} + step={1} + type="number" + /> + </FormGroup> + </InputGroup> + </div>} </div> {this.props.showToolButtons && <div key="tools"> <Toolbar diff --git a/web/client/components/style/TextStyler.jsx b/web/client/components/style/TextStyler.jsx index c703465a12..67bc560ec6 100644 --- a/web/client/components/style/TextStyler.jsx +++ b/web/client/components/style/TextStyler.jsx @@ -17,7 +17,7 @@ import StyleCanvas from './StyleCanvas'; import numberLocalizer from 'react-widgets/lib/localizers/simple-number'; numberLocalizer(); import { getMessageById } from '../../utils/LocaleUtils'; -import { createFont } from '../../utils/AnnotationsUtils'; +import { createFont } from '../../utils/LegacyAnnotationsUtils'; import Message from '../I18N/Message'; import tinycolor from 'tinycolor2'; import IntlNumberFormControl from '../I18N/IntlNumberFormControl'; diff --git a/web/client/components/style/thumbGeoms/__tests__/LineThumb-test.js b/web/client/components/style/thumbGeoms/__tests__/LineThumb-test.js index a208f842a2..77011584ee 100644 --- a/web/client/components/style/thumbGeoms/__tests__/LineThumb-test.js +++ b/web/client/components/style/thumbGeoms/__tests__/LineThumb-test.js @@ -3,7 +3,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import TestUtils from 'react-dom/test-utils'; -import {DEFAULT_ANNOTATIONS_STYLES} from '../../../../utils/AnnotationsUtils'; +import {DEFAULT_ANNOTATIONS_STYLES} from '../../../../plugins/Annotations/utils/AnnotationsUtils'; import LineThumb from '../LineThumb'; describe("Test the LineThumb component", () => { diff --git a/web/client/components/style/thumbGeoms/__tests__/MultiGeomThumb-test.js b/web/client/components/style/thumbGeoms/__tests__/MultiGeomThumb-test.js index 4a760ceab2..15dfba7b1a 100644 --- a/web/client/components/style/thumbGeoms/__tests__/MultiGeomThumb-test.js +++ b/web/client/components/style/thumbGeoms/__tests__/MultiGeomThumb-test.js @@ -3,7 +3,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import TestUtils from 'react-dom/test-utils'; -import {DEFAULT_ANNOTATIONS_STYLES} from '../../../../utils/AnnotationsUtils'; +import {DEFAULT_ANNOTATIONS_STYLES} from '../../../../utils/LegacyAnnotationsUtils'; import MultiGeomThumb from '../MultiGeomThumb'; describe("Test the MultiGeomThumb component", () => { diff --git a/web/client/components/style/thumbGeoms/__tests__/PolygonThumb-test.js b/web/client/components/style/thumbGeoms/__tests__/PolygonThumb-test.js index a78ad18f49..93691d931f 100644 --- a/web/client/components/style/thumbGeoms/__tests__/PolygonThumb-test.js +++ b/web/client/components/style/thumbGeoms/__tests__/PolygonThumb-test.js @@ -3,7 +3,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import TestUtils from 'react-dom/test-utils'; -import {DEFAULT_ANNOTATIONS_STYLES} from '../../../../utils/AnnotationsUtils'; +import {DEFAULT_ANNOTATIONS_STYLES} from '../../../../plugins/Annotations/utils/AnnotationsUtils'; import PolygonThumb from '../PolygonThumb'; describe("Test the PolygonThumb component", () => { diff --git a/web/client/components/style/vector/Manager.jsx b/web/client/components/style/vector/Manager.jsx index 7ee6592c25..1e072d1224 100644 --- a/web/client/components/style/vector/Manager.jsx +++ b/web/client/components/style/vector/Manager.jsx @@ -15,7 +15,7 @@ import { Grid } from 'react-bootstrap'; import tinycolor from 'tinycolor2'; import uuidv1 from 'uuid/v1'; -import { DEFAULT_PATH, DEFAULT_SHAPE, checkSymbolsError } from '../../../utils/AnnotationsUtils'; +import { DEFAULT_PATH, DEFAULT_SHAPE, checkSymbolsError } from '../../../utils/LegacyAnnotationsUtils'; import { arrayUpdate } from '../../../utils/ImmutableUtils'; import { addOpacityToColor, diff --git a/web/client/components/style/vector/Text.jsx b/web/client/components/style/vector/Text.jsx index 2a1f39a12a..d131df60d6 100644 --- a/web/client/components/style/vector/Text.jsx +++ b/web/client/components/style/vector/Text.jsx @@ -18,7 +18,7 @@ numberLocalizer(); import Message from '../../I18N/Message'; import { getMessageById } from '../../../utils/LocaleUtils'; -import { createFont } from '../../../utils/AnnotationsUtils'; +import { createFont } from '../../../utils/LegacyAnnotationsUtils'; /** * Styler for the stroke properties of a vector style diff --git a/web/client/components/style/vector/marker/SymbolLayout.jsx b/web/client/components/style/vector/marker/SymbolLayout.jsx index dab6880411..c8df5fd8cc 100644 --- a/web/client/components/style/vector/marker/SymbolLayout.jsx +++ b/web/client/components/style/vector/marker/SymbolLayout.jsx @@ -15,7 +15,7 @@ import { isArray, find, filter, isEqual } from 'lodash'; import axios from 'axios'; import Slider from '../../../misc/Slider'; import Message from '../../../I18N/Message'; -import { DEFAULT_SHAPE, DEFAULT_PATH, checkSymbolsError } from '../../../../utils/AnnotationsUtils'; +import { DEFAULT_SHAPE, DEFAULT_PATH, checkSymbolsError } from '../../../../utils/LegacyAnnotationsUtils'; /** * Styler for the layout of the symbol diff --git a/web/client/components/styleeditor/RulesEditor.jsx b/web/client/components/styleeditor/RulesEditor.jsx index 009331ca00..cd1297cdc0 100644 --- a/web/client/components/styleeditor/RulesEditor.jsx +++ b/web/client/components/styleeditor/RulesEditor.jsx @@ -257,7 +257,8 @@ const RulesEditor = forwardRef(({ ruleId, kind: ruleKind, errorId: ruleErrorId, - msgParams: ruleMsgParams + msgParams: ruleMsgParams, + mandatory } = rule; const { @@ -324,14 +325,14 @@ const RulesEditor = forwardRef(({ zoom={zoom} onChange={(values) => handleChanges({ values, ruleId }, true)} />} - <Button + {!mandatory && <Button className="square-button-md no-border" tooltipId="styleeditor.removeRule" onClick={() => handleRemove(ruleId)}> <Glyphicon glyph="trash" /> - </Button> + </Button>} </> } > diff --git a/web/client/components/styleeditor/config/blocks.js b/web/client/components/styleeditor/config/blocks.js index 2e02d82cb9..0c5aa58c18 100644 --- a/web/client/components/styleeditor/config/blocks.js +++ b/web/client/components/styleeditor/config/blocks.js @@ -201,7 +201,16 @@ const getBlocks = ({ glyph: '1-point', glyphAdd: '1-point-add', tooltipAddId: 'styleeditor.addMarkRule', - supportedTypes: ['point', 'linestring', 'polygon', 'vector'], + supportedTypes: [ + 'point', + 'linestring', + 'polygon', + 'vector', + 'annotation-point', + 'annotation-linestring', + 'annotation-polygon', + 'annotation-circle' + ], params: { wellKnownName: property.shape({ label: 'styleeditor.shape' @@ -258,7 +267,16 @@ const getBlocks = ({ glyph: 'point', glyphAdd: 'point-plus', tooltipAddId: 'styleeditor.addIconRule', - supportedTypes: ['point', 'linestring', 'polygon', 'vector'], + supportedTypes: [ + 'point', + 'linestring', + 'polygon', + 'vector', + 'annotation-point', + 'annotation-linestring', + 'annotation-polygon', + 'annotation-circle' + ], hideMenu: true, params: { image: property.image({ @@ -492,7 +510,16 @@ const getBlocks = ({ glyphAdd: 'model-plus', disableAdd: () => !enable3dStyleOptions, tooltipAddId: 'styleeditor.addModelRule', - supportedTypes: ['point', 'linestring', 'polygon', 'vector'], + supportedTypes: [ + 'point', + 'linestring', + 'polygon', + 'vector', + 'annotation-point', + 'annotation-linestring', + 'annotation-polygon', + 'annotation-circle' + ], hideMenu: true, params: { model: property.model({ diff --git a/web/client/configs/localConfig.json b/web/client/configs/localConfig.json index 78ed021e9b..28387fa81d 100644 --- a/web/client/configs/localConfig.json +++ b/web/client/configs/localConfig.json @@ -65,13 +65,6 @@ "projectionDefs": [], "initialState": { "defaultState": { - "annotations": { - "config": { - "multiGeometry": true, - "validationErrors": {} - }, - "defaultTextAnnotation": "New" - }, "catalog": { "default": { "newService": { @@ -398,10 +391,7 @@ } } }, "AutoMapUpdate", "HelpLink", "DrawerMenu", "Notifications", "BackgroundSelector", "Swipe", { - "name": "Annotations", - "cfg": { - "measurementAnnotationEdit": false - } + "name": "Annotations" }, { "name": "Share", diff --git a/web/client/epics/__tests__/annotations-test.js b/web/client/epics/__tests__/annotations-test.js deleted file mode 100644 index c7d2a9f736..0000000000 --- a/web/client/epics/__tests__/annotations-test.js +++ /dev/null @@ -1,1357 +0,0 @@ -/* - * Copyright 2018, GeoSolutions Sas. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. -*/ - -import expect from 'expect'; - -import axios from 'axios'; -import MockAdapter from 'axios-mock-adapter'; -import { find } from 'lodash'; -import configureMockStore from 'redux-mock-store'; -import { createEpicMiddleware, combineEpics } from 'redux-observable'; -import { ADD_LAYER, UPDATE_NODE, changeLayerProperties, changeGroupProperties } from '../../actions/layers'; -import { - CHANGE_DRAWING_STATUS, - drawingFeatures, - DRAWING_FEATURE, - selectFeatures -} from '../../actions/draw'; -import { set } from '../../utils/ImmutableUtils'; -import { CLOSE_IDENTIFY, HIDE_MAPINFO_MARKER, PURGE_MAPINFO_RESULTS, purgeMapInfoResults } from '../../actions/mapInfo'; -import { configureMap } from '../../actions/config'; - -import { - confirmRemoveAnnotation, - saveAnnotation, - startDrawing, - cancelEditAnnotation, - setStyle, - highlight, - cleanHighlight, - download, - loadAnnotations, - SET_STYLE, - toggleStyle, - resetCoordEditor, - changeRadius, - changeText, - changeSelected, - confirmDeleteFeature, - openEditor, - SHOW_ANNOTATION, - loadDefaultStyles, - LOADING, - SET_DEFAULT_STYLE, - toggleVisibilityAnnotation, - geometryHighlight, EDIT_ANNOTATION, CLEAN_HIGHLIGHT, TOGGLE_ANNOTATION_VISIBILITY, - addNewFeature, - setEditingFeature -} from '../../actions/annotations'; - -import { toggleControl, SET_CONTROL_PROPERTY } from '../../actions/controls'; -import {ANNOTATIONS, STYLE_POINT_MARKER} from '../../utils/AnnotationsUtils'; -import annotationsEpics from '../annotations'; -import { testEpic, addTimeoutEpic, TEST_TIMEOUT } from './epicTestUtils'; -import {registerEventListener} from "../../actions/map"; - -const { - addAnnotationsLayerEpic, editAnnotationEpic, removeAnnotationEpic, saveAnnotationEpic, setEditingFeatureEpic, newAnnotationEpic, addAnnotationEpic, - disableInteractionsEpic, cancelEditAnnotationEpic, startDrawingMultiGeomEpic, endDrawGeomEpic, - setAnnotationStyleEpic, restoreStyleEpic, highlightAnnotationEpic, cleanHighlightAnnotationEpic, closeAnnotationsEpic, confirmCloseAnnotationsEpic, - downloadAnnotations, onLoadAnnotations, onChangedSelectedFeatureEpic, onBackToEditingFeatureEpic, redrawOnChangeRadiusEpic, redrawOnChangeTextEpic, - editSelectedFeatureEpic, editCircleFeatureEpic, purgeMapInfoEpic, tearDownByDrawingToolsEpic, openEditorEpic, loadDefaultAnnotationsStylesEpic, showHideAnnotationEpic, hideAnnotationGroupEpic, highlightGeometryEpic -} = annotationsEpics; - -const rootEpic = combineEpics(addAnnotationsLayerEpic, editAnnotationEpic, removeAnnotationEpic, setEditingFeatureEpic, saveAnnotationEpic, newAnnotationEpic, addAnnotationEpic, - disableInteractionsEpic, cancelEditAnnotationEpic, startDrawingMultiGeomEpic, endDrawGeomEpic, - setAnnotationStyleEpic, restoreStyleEpic, highlightAnnotationEpic, cleanHighlightAnnotationEpic, closeAnnotationsEpic, confirmCloseAnnotationsEpic, - downloadAnnotations, onLoadAnnotations, onChangedSelectedFeatureEpic, onBackToEditingFeatureEpic, redrawOnChangeRadiusEpic, redrawOnChangeTextEpic, - editSelectedFeatureEpic, editCircleFeatureEpic, purgeMapInfoEpic, tearDownByDrawingToolsEpic, openEditorEpic, loadDefaultAnnotationsStylesEpic, showHideAnnotationEpic, hideAnnotationGroupEpic, highlightGeometryEpic -); -const epicMiddleware = createEpicMiddleware(rootEpic); -const mockStore = configureMockStore([epicMiddleware]); -const ft = { - type: "Feature", - geometry: { - type: "Point", - coordinates: [1, 1] - }, - properties: { - id: "is a point" - } -}; - - -const annotationsLayerWithTextFeature = { - "flat": [ - { - "id": "annotations", - "features": [ - { - type: "FeatureCollection", - features: [{ - "properties": { - "id": "1", - isText: true, - valueText: "my text" - }, - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - 1, - 1 - ] - } - }], - style: { - type: "Text", - id: "id.1.text.5", - "Text": { - color: "#FF0000", - font: "Arial 14px", - label: "my text" - } - } - } - ] - } - ] -}; - -const annotationsLayerWithCircleFeature = { - "flat": [ - { - "id": "annotations", - "features": [ - { - type: "FeatureCollection", - features: [{ - "properties": { - "id": "1", - isCircle: true, - center: [] - }, - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - 1, - 1 - ] - } - }], - style: { - type: "Circle", - id: "id.1.2.3.4.5", - "Circle": { - color: "#FF0000" - } - } - } - ] - } - ] -}; -const annotationsLayerWithLineStringFeature = { - "flat": [ - { - "id": "annotations", - "features": [ - { - type: "FeatureCollection", - features: [{ - "properties": { - "id": "1" - }, - "type": "Feature", - "geometry": { - "type": "LineString", - "coordinates": [ - [ 1, 1 ], - [ 12, 12 ] - ] - } - }], - style: { - type: "LineString", - id: "id.1.2.3.4.5", - "LineString": { - color: "#FF0000" - } - } - } - ] - } - ] -}; -const annotationsLayerWithPointFeatureAndSymbol = { - "flat": [ - { - "id": "annotations", - "features": [ - { - type: "FeatureCollection", - features: [{ - "properties": { - "id": "1" - }, - "type": "Feature", - "geometry": { - "type": "LineString", - "coordinates": [ - [ 1, 1 ], - [ 12, 12 ] - ] - }, - style: [{ - type: "Point", - id: "id.1.2.3.4.5", - iconUrl: "/path/symbol.svg", - symbolUrlCustomized: "/path/symbol.svg" - }] - }] - } - ] - } - ] -}; - -const triangleSvg = `<?xml version="1.0" encoding="iso-8859-1"?> -<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<svg - id="triangle" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - version="1.1" - x="0px" - y="0px" - class="svg-triangle" - width="64px" - height="64px" - viewBox="0 0 100 100"> - <polygon points="50,0 100,100 0,100"/> -</svg> -`; - -describe('annotations Epics', () => { - let store; - let mockAxios; - const defaultState = { - annotations: { - config: {multiGeometry: false, defaultPointType: 'symbol'}, - editing: { - style: {}, - features: [ft], - type: "FeatureCollection", - properties: { - id: "is a point" - } - }, - styling: false, - drawingText: { - drawing: true - }, - featureType: "Point", - originalStyle: {}, - selected: ft - }, - layers: { - flat: [{ - id: 'annotations', - features: [{ - properties: { - id: '1' - }, - type: "Feature", - geometry: { - type: "Point", - coordinates: [1, 1] - } - }] - }] - }, - controls: {annotations: {enabled: true}}, - draw: { - drawOwner: ANNOTATIONS - } - }; - beforeEach(() => { - store = mockStore(defaultState); - mockAxios = new MockAdapter(axios); - }); - - afterEach(() => { - epicMiddleware.replaceEpic(rootEpic); - mockAxios.restore(); - }); - - it('set style', (done) => { - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[0].type).toBe(SET_STYLE); - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[1].status).toBe("updateStyle"); - done(); - } - }); - const action = setStyle({}); - store.dispatch(action); - }); - it('MAP_CONFIG_LOADED with missing annotations layer', (done) => { - const state = { - annotations: { - editing: { - style: {} - }, - originalStyle: {} - }, - layers: { - flat: [] - } - }; - testEpic(addTimeoutEpic(addAnnotationsLayerEpic, 88), 1, configureMap({}), actions => { - expect(actions.length).toBe(1); - actions.map((action) => { - switch (action.type) { - case TEST_TIMEOUT: - break; - default: - expect(false).toBe(true); - } - }); - done(); - }, state); - }); - it('update annotations layer, MAP_CONFIG_LOADED', (done) => { - let action = configureMap({}); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(UPDATE_NODE); - done(); - } - }); - - store.dispatch(action); - }); - it('edit annotation', (done) => { - const state = { - annotations: {editing: defaultState.annotations.editing, featureType: "Point"}, - layers: {flat: [{id: "annotations", features: [{...ft, properties: {id: '1'}}]}]} - }; - const feature = state.layers.flat[0].features[0]; - testEpic(addTimeoutEpic(editAnnotationEpic, 100), 3, { type: EDIT_ANNOTATION, feature, - featureType: feature.geometry.type - }, actions => { - expect(actions.length).toBe(3); - actions.map((action) => { - switch (action.type) { - case TOGGLE_ANNOTATION_VISIBILITY: - break; - case CHANGE_DRAWING_STATUS: - break; - case HIDE_MAPINFO_MARKER: - break; - default: - expect(false).toBe(true); - } - }); - done(); - }, state); - }); - it('update annotations layer with LineString Feature, with old style structure, MAP_CONFIG_LOADED', (done) => { - let action = configureMap({}); - - store = mockStore({ - annotations: { - editing: { - style: {} - }, - originalStyle: {} - }, - layers: annotationsLayerWithLineStringFeature - }); - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(UPDATE_NODE); - const features = actions[1].options.features[0]; - expect(features.features[0].style.length).toBe(2); - done(); - } - }); - - store.dispatch(action); - }); - it('update annotations layer with text Feature, with old style structure, MAP_CONFIG_LOADED', (done) => { - let action = configureMap({}); - - store = mockStore({ - annotations: { - editing: { - style: {} - }, - originalStyle: {} - }, - layers: annotationsLayerWithTextFeature - }); - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(UPDATE_NODE); - done(); - } - }); - - store.dispatch(action); - }); - it('update annotations layer with Point Feature, with new symbol style structure, MAP_CONFIG_LOADED', (done) => { - let action = configureMap({}); - - store = mockStore({ - annotations: { - editing: { - style: {} - }, - originalStyle: {} - }, - layers: annotationsLayerWithPointFeatureAndSymbol - }); - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(UPDATE_NODE); - expect(actions[1].options.features[0].features[0].style[0].symbolUrlCustomized).toBe(undefined); - done(); - } - }); - - store.dispatch(action); - }); - it('update annotations layer with Circle Feature, with old style structure, MAP_CONFIG_LOADED', (done) => { - let action = configureMap({}); - - store = mockStore({ - annotations: { - editing: { - style: {} - }, - originalStyle: {} - }, - layers: annotationsLayerWithCircleFeature - }); - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(UPDATE_NODE); - expect(actions[1].options.features[0].features[0].style.length).toBe(2); - done(); - } - }); - - store.dispatch(action); - }); - it('update annotations layer visibility MAP_CONFIG_LOADED', (done) => { - let action = configureMap({}); - - store = mockStore({ - annotations: { - editing: { - style: {} - }, - originalStyle: {} - }, - layers: annotationsLayerWithLineStringFeature - }); - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(UPDATE_NODE); - expect(actions[1].options.features.length).toBe(1); - expect(actions[1].options.visibility).toBe(false); - done(); - } - }); - - store.dispatch(action); - }); - /** - TOFIX: - . some previous test seems to break this test, uncomment the following check about CLOSE_IDENTIFY when solved. - . update the actions.length check to the proper number. - . there are 2 CHANGE_DRAWING_STATUS actions that come between CONFIRM_REMOVE_ANNOTATION and UPDATE_NODE - */ - it('remove annotation', (done) => { - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 6) { - expect(actions[3].type).toBe(UPDATE_NODE); // if the previous test are commented out this is the first actions - expect(actions[4].type).toBe(HIDE_MAPINFO_MARKER); - expect(actions[5].type).toBe(PURGE_MAPINFO_RESULTS); - // ensure it triggers identify - // expect(actions.filter(({type}) => type === CLOSE_IDENTIFY).length).toBe(1); - done(); - } - }); - const action = confirmRemoveAnnotation('1', 'features'); - store.dispatch(action); - }); - it('remove annotation geometry', (done) => { - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - done(); - } - }); - const action = confirmRemoveAnnotation('1', 'geometry'); - store.dispatch(action); - }); - it('remove annotation geometry of type Circle', (done) => { - const tempStore = mockStore({ - ...defaultState, - annotations: { - ...defaultState.annotations, - featureType: "Circle" - } - }); - tempStore.subscribe(() => { - const actions = tempStore.getActions(); - if (actions.length >= 3) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[1].status).toBe('replace'); - expect(actions[1].method).toBe('Circle'); - expect(actions[2].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[2].status).toBe('drawOrEdit'); - expect(actions[2].method).toBe('Circle'); - expect(actions[2].options.drawEnabled).toBe(false); - expect(actions[2].options.editEnabled).toBe(true); - expect(actions[2].options.selectEnabled).toBe(true); - expect(actions[2].options.useSelectedStyle).toBe(true); - expect(actions[2].options.addClickCallback).toBe(true); - expect(typeof actions[2].options.editFilter).toBe('function'); - done(); - } - }); - const action = confirmRemoveAnnotation('1', 'geometry'); - tempStore.dispatch(action); - }); - - it('remove annotation geometry when initial state is not set', (done) => { - const tempStore = mockStore({ - annotations: { - editing: { - style: {}, - features: [], - type: "FeatureCollection" - } - } - }); - tempStore.subscribe(() => { - const actions = tempStore.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - done(); - } - }); - const action = confirmRemoveAnnotation('1', 'geometry'); - tempStore.dispatch(action); - }); - it('add annotation', (done) => { - const state = { - draw: {drawMethod: "Test"}, - annotations: {editing: defaultState.annotations.editing, featureType: "Point"}, - layers: {flat: [{id: "annotations", features: [{...ft, properties: {id: '1'}}]}]} - }; - testEpic(addTimeoutEpic(addAnnotationEpic, 100), 3, addNewFeature(), actions => { - expect(actions.length).toBe(3); - actions.map((action) => { - switch (action.type) { - case TOGGLE_ANNOTATION_VISIBILITY: - break; - case CHANGE_DRAWING_STATUS: - break; - case HIDE_MAPINFO_MARKER: - break; - default: - expect(false).toBe(true); - } - }); - done(); - }, state); - }); - it('add annotations layer on first save', (done) => { - store = mockStore({ - annotations: { - editing: { - style: {} - }, - originalStyle: {} - }, - layers: { - flat: [] - } - }); - let action = saveAnnotation('1', {}, {}, {}, true, {}); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 4) { - expect(actions[1].type).toBe(ADD_LAYER); - expect(actions[2].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[3].type).toBe("ANNOTATIONS:VISIBILITY"); - expect(actions[3].visibility).toBe(true); - expect(actions[3].id).toBe("1"); - done(); - } - }); - - store.dispatch(action); - }); - it('set measurement editing feature annotation', (done) => { - const state = { - draw: {drawMethod: "Test"}, - annotations: {editing: defaultState.annotations.editing, featureType: "LineString"}, - layers: {flat: [{id: "annotations", features: [{...ft, properties: {id: '1'}}]}]} - }; - testEpic(addTimeoutEpic(setEditingFeatureEpic, 100), 3, setEditingFeature({...ft, visibility: false}), actions => { - expect(actions.length).toBe(3); - actions.map((action) => { - switch (action.type) { - case TOGGLE_ANNOTATION_VISIBILITY: - break; - case CHANGE_DRAWING_STATUS: - break; - case HIDE_MAPINFO_MARKER: - break; - default: - expect(false).toBe(true); - } - }); - done(); - }, state); - }); - it('toggle annotation visibility to set annotation layer visibility', (done) => { - const tempStore = mockStore({ - layers: { - flat: [ - {id: "annotations", features: [{properties: {id: '1'}}]} - ] - } - }); - tempStore.subscribe(() => { - const actions = tempStore.getActions(); - if (actions.length >= 2) { - expect(actions[0].type).toBe("ANNOTATIONS:VISIBILITY"); - expect(actions[1].type).toBe(UPDATE_NODE); - expect(actions[1].options.visibility).toBe(false); - expect(actions[1].options.features[0].properties).toEqual({id: "1", visibility: false}); - done(); - } - }); - const action = toggleVisibilityAnnotation('1'); - tempStore.dispatch(action); - }); - it('toggle annotation visibility of one feature/annotation', (done) => { - const tempStore = mockStore({ - layers: { - flat: [ - {id: "annotations", features: [{properties: {id: '1', visibility: false}}]} - ] - } - }); - tempStore.subscribe(() => { - const actions = tempStore.getActions(); - if (actions.length >= 2) { - expect(actions[0].type).toBe("ANNOTATIONS:VISIBILITY"); - expect(actions[1].type).toBe(UPDATE_NODE); - expect(actions[1].options.features[0].properties).toEqual({id: "1", visibility: true}); - done(); - } - }); - const action = toggleVisibilityAnnotation('1'); - tempStore.dispatch(action); - }); - it('test showHideAnnotationEpic on non-annotation layer', (done) => { - store = mockStore({ - layers: { - flat: [ - {id: "1", features: [{properties: {id: '1'}}]} - ] - } - }); - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 1) { - const types = actions.map(a=>a.type); - expect(types.includes(UPDATE_NODE)).toBe(false); - done(); - } - }); - const action = changeLayerProperties('1', {visibility: true}); - store.dispatch(action); - }); - it('toggle annotation visibility on CHANGE_LAYER_PROPERTIES', (done) => { - const tempStore = mockStore({ - layers: { - flat: [ - {id: "annotations", features: [{properties: {id: '1'}}]} - ] - } - }); - tempStore.subscribe(() => { - const actions = tempStore.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(UPDATE_NODE); - expect(actions[1].options.features.length).toBe(1); - expect(actions[1].options.features[0].properties).toEqual({"id": "1", "visibility": true}); - expect(actions[1].options.visibility).toBe(true); - done(); - } - }); - const action = changeLayerProperties('annotations', {visibility: true}); - tempStore.dispatch(action); - }); - it('toggle annotation visibility on CHANGE_GROUP_PROPERTIES', (done) => { - const tempStore = mockStore({ - layers: { - flat: [ - {id: "annotations", features: [{properties: {id: '1'}}], visibility: false} - ], - groups: [ - { - id: 1, title: "Group1", nodes: ["annotations"] - } - ] - } - }); - tempStore.subscribe(() => { - const actions = tempStore.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(UPDATE_NODE); - expect(actions[1].options.features.length).toBe(1); - expect(actions[1].options.features[0].properties).toEqual({"id": "1", "visibility": true}); - done(); - } - }); - const action = changeGroupProperties(1, {visibility: true}); - tempStore.dispatch(action); - }); - it('test on close annotations panel', (done) => { - const state = { - controls: {annotations: {enabled: false}} - }; - testEpic(addTimeoutEpic(closeAnnotationsEpic, 100), 2, toggleControl("annotations"), actions => { - expect(actions.length).toBe(2); - actions.map((action) => { - switch (action.type) { - case CLEAN_HIGHLIGHT: - break; - case CHANGE_DRAWING_STATUS: - expect(action.status).toBe("clean"); - break; - default: - expect(false).toBe(true); - } - }); - done(); - }, state); - }); - it('test on close annotations panel by another drawing tool', (done) => { - const state = { - controls: {annotations: {enabled: true}} - }; - testEpic(addTimeoutEpic(tearDownByDrawingToolsEpic, 100), 1, registerEventListener("click", "anotherPlugin"), actions => { - expect(actions.length).toBe(1); - actions.map((action) => { - switch (action.type) { - case PURGE_MAPINFO_RESULTS: - break; - default: - expect(false).toBe(true); - } - }); - done(); - }, state); - }); - it('save annotation', (done) => { - const state = { - annotations: {featureType: "Point"}, - layers: {flat: [{id: "annotations", features: [{...ft, properties: {id: '1'}}]}]} - }; - testEpic(addTimeoutEpic(saveAnnotationEpic, 100), 2, saveAnnotation('1', {}, {}), actions => { - expect(actions.length).toBe(2); - actions.map((action) => { - switch (action.type) { - case UPDATE_NODE: - expect(action.options.features).toBeTruthy(); - expect(action.options.visibility).toBe(false); - break; - case CHANGE_DRAWING_STATUS: - expect(action.owner).toBe('annotations'); - expect(action.method).toBe('Point'); - break; - default: - expect(false).toBe(true); - } - }); - done(); - }, state); - }); - it('cancel edit annotation', (done) => { - const customStore = mockStore({ - annotations: { - featureType: "Point" - } - }); - customStore.subscribe(() => { - const actions = customStore.getActions(); - if (actions.length >= 3) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[2].type).toBe(TOGGLE_ANNOTATION_VISIBILITY); - done(); - } - }); - const action = cancelEditAnnotation(); - customStore.dispatch(action); - }); - it('highlight annotation', (done) => { - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(UPDATE_NODE); - done(); - } - }); - const action = highlight('1'); - store.dispatch(action); - }); - it('clean highlight annotation', (done) => { - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(UPDATE_NODE); - done(); - } - }); - const action = cleanHighlight('1'); - store.dispatch(action); - }); - it('clean highlight without layer', (done) => { - const state = { - annotations: { - editing: { - style: {} - }, - originalStyle: {} - }, - layers: { - flat: [] - } - }; - testEpic(addTimeoutEpic(cleanHighlightAnnotationEpic, 88), 1, cleanHighlight('1'), actions => { - expect(actions.length).toBe(1); - actions.map((action) => { - switch (action.type) { - case TEST_TIMEOUT: - break; - default: - expect(false).toBe(true); - } - }); - done(); - }, state); - }); - it('export annotations fail', (done) => { - const state = { - layers: { - flat: [] - } - }; - testEpic(downloadAnnotations, 1, download(), actions => { - expect(actions.length).toBe(1); - actions.map((action) => { - switch (action.type) { - case "SHOW_NOTIFICATION": - break; - default: - expect(false).toBe(true); - } - }); - done(); - }, state); - }); - it('load annotations', done => { - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(UPDATE_NODE); - done(); - } - }); - const action = loadAnnotations([{ "coordinates": [ - 4.6142578125, - 45.67548217560647 - ], - "type": "Point" - }]); - store.dispatch(action); - - }); - it('load annotations and create layer', done => { - store = mockStore({ - layers: { - flat: [] - } - }); - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(ADD_LAYER); - done(); - } - }); - const action = loadAnnotations([]); - store.dispatch(action); - }); - it('when the styler is opened, clicks on the map does not add new points to the feature, styling=true', (done) => { - - let newState = set("annotations.styling", true, defaultState); - newState = set("annotations.selected", {style: {iconGliph: "comment", iconShape: "square", iconColor: "blue"}}, newState); - newState = set("draw.drawMethod", "Polygon", newState); - - store = mockStore( - newState - ); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - done(); - } - }); - const action = toggleStyle({}); - store.dispatch(action); - }); - it('when the styler is opened, clicks on the map does not add new points to the feature, styling=false', (done) => { - let newState = set("annotations.styling", true, defaultState); - newState = set("annotations.selected", {style: {iconGliph: "comment", iconShape: "square", iconColor: "blue"}}, newState); - newState = set("draw.drawMethod", "Polygon", newState); - - store = mockStore( - set("annotations.styling", false, newState) - ); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - done(); - } - }); - const action = toggleStyle({}); - store.dispatch(action); - - }); - it('clicked on back from coord editor, should enabled only select ', (done) => { - store = mockStore( - set("annotations.styling", false, defaultState) - ); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[1].options.selectEnabled).toBe(true); - expect(actions[1].options.drawEnabled).toBe(false); - expect(actions[1].options.editEnabled).toBe(false); - done(); - } - }); - const action = resetCoordEditor({}); - store.dispatch(action); - - }); - it('clicked on confirm delete of a feature ', (done) => { - store = mockStore( - set("annotations.styling", false, defaultState) - ); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[1].options.selectEnabled).toBe(true); - expect(actions[1].options.drawEnabled).toBe(false); - expect(actions[1].options.editEnabled).toBe(false); - done(); - } - }); - const action = confirmDeleteFeature(); - store.dispatch(action); - - }); - it('clicked on map adding a point to Circle ', (done) => { - store = mockStore( defaultState ); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - done(); - } - }); - const polygonGeom = { - type: "Polygon", - coordinates: [[[1, 2]]] - }; - const feature = { - type: "Feature", - geometry: polygonGeom, - properties: { - canEdit: true, - isCircle: true, - polygonGeom, - id: "Sdfaf" - } - }; - const action = drawingFeatures([feature]); - store.dispatch(action); - - }); - it('clicked on map adding a point to LineString ', (done) => { - store = mockStore( defaultState ); - - store.subscribe(() => { - const actions = store.getActions(); - expect(actions[0].type).toBe(DRAWING_FEATURE); - if (actions.length >= 0) { - done(); - } - }); - const lineGeom = { - type: "LineString", - coordinates: [[1, 2]] - }; - const feature = { - type: "Feature", - geometry: lineGeom, - properties: { - canEdit: true, - id: "Sdfaf" - } - }; - const action = drawingFeatures([feature]); - store.dispatch(action); - - }); - it('clicked on map selecting a feature LineString ', (done) => { - store = mockStore( defaultState ); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 3) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[2].type).toBe(CHANGE_DRAWING_STATUS); - done(); - } - }); - const action = selectFeatures([ft]); - store.dispatch(action); - - }); - it('clicked on map selecting a Circle ', (done) => { - store = mockStore( { - ...defaultState, - annotations: { - ...defaultState.annotations, - config: { - geodesic: true - }, - editing: { - ...defaultState.annotations.editing, - features: [{ - type: "Feature", - geometry: { - type: "Polygon", - coordinates: [[[1, 2], [1, 3], [1, 1], [1, 5], [1, 2]]] - }, - properties: { - id: "is a circle", - isCircle: true - } - } - ] - - } - } - } ); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 3) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[2].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[2].options.geodesic).toBe(true); - done(); - } - }); - const action = selectFeatures([ft]); - store.dispatch(action); - }); - it('changed the radius from the coordinate editor ', (done) => { - store = mockStore( defaultState ); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - done(); - } - }); - const action = changeRadius(500, [[1, 1]]); - store.dispatch(action); - - }); - it('changed the text from the coordinate editor form', (done) => { - store = mockStore( defaultState ); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - done(); - } - }); - const action = changeText("500", [[1, 1]]); - store.dispatch(action); - }); - it('changed the coordinate value of a Polygon with an invalid coord', (done) => { - let selected = ft; - const polygonCoords = [[[1, 2], [1, 3], [1, undefined], [1, 5], [1, 2]]]; - selected = set("geometry", { - type: "Polygon", - coordinates: polygonCoords - }, selected); - selected = set("properties", { id: "Polygon1"}, selected); - store = mockStore( - set("annotations.selected", selected, set("annotations.editing.features", defaultState.annotations.editing.features.concat([selected]), defaultState)) - ); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[1].features[0].features[1].geometry.coordinates[0].length).toBe(4); - done(); - } - }); - const action = changeSelected(polygonCoords, undefined, undefined); - store.dispatch(action); - }); - it('changed the coordinate value of a Text with a valid coord', (done) => { - let selected = ft; - const textCoords = [1, 3]; - selected = set("geometry", { - type: "Text", - coordinates: textCoords - }, selected); - selected = set("properties", { id: "text1", isText: true, isValidFeature: true, valueText: "text"}, selected); - store = mockStore( - set("annotations.selected", selected, set("annotations.editing.features", defaultState.annotations.editing.features.concat([selected]), defaultState)) - ); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[1].features[0].features[1].properties.valueText).toBe("text"); - done(); - } - }); - const action = changeSelected(textCoords, undefined, "text"); - store.dispatch(action); - }); - it('changed the coordinate value of a Circle with a valid coord', (done) => { - let selected = ft; - const polygonCoords = [[[1, 2], [1, 3], [1, 5], [1, 2]]]; - const polygonGeom = { - type: "Polygon", - coordinates: polygonCoords - }; - selected = set("geometry", polygonGeom, selected); - selected = set("properties", { id: "text1", radius: 200, center: [2, 2], isCircle: true, polygonGeom}, selected); - store = mockStore( - set("annotations.selected", selected, set("annotations.editing.features", defaultState.annotations.editing.features.concat([selected]), defaultState)) - ); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[1].features[0].features[1].properties.radius).toBe(200); - expect(actions[1].features[0].features[1].geometry.type).toBe("Polygon"); - done(); - } - }); - const action = changeSelected(polygonCoords, 200, undefined); - store.dispatch(action); - }); - - it('purgeMapInfoEpic', (done) => { - let action = purgeMapInfoResults(); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - done(); - } - }); - - store.dispatch(action); - }); - it('should safely start drawing annotation when no annotation config provided', (done) => { - store = mockStore({ - annotations: { - editing: { - features: [{}] - } - } - }); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - done(); - } - }); - const action = startDrawing(); - store.dispatch(action); - }); - it('openEditorEpic', (done) => { - let action = openEditor("1"); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 4) { - expect(actions[1].type).toBe(CLOSE_IDENTIFY); - expect(actions[2].type).toBe(SET_CONTROL_PROPERTY); - expect(actions[3].type).toBe(SHOW_ANNOTATION); - done(); - } - }); - - store.dispatch(action); - }); - it('default styles are loaded on loadDefaultStyles', (done) => { - store = mockStore({ - annotations: {} - }); - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 5) { - try { - expect(actions[1].type).toBe(LOADING); - expect(actions[1].value).toBe(true); - expect(actions[2].type).toBe(SET_DEFAULT_STYLE); - expect(actions[3].type).toBe(SET_DEFAULT_STYLE); - - const styleActions = actions.slice(2, 4); - const symbol = find(styleActions, {path: 'POINT.symbol'}); - const marker = find(styleActions, {path: 'POINT.marker'}); - expect(symbol).toExist(); - expect(symbol.style).toExist(); - expect(symbol.style.size).toBe(24); - expect(symbol.style.fillColor).toBe('#0000FF'); - expect(symbol.style.color).toBe('#00FF00'); - expect(marker).toExist(); - expect(marker.style).toExist(); - expect(marker.style).toEqual(STYLE_POINT_MARKER); - - expect(actions[4].type).toBe(LOADING); - expect(actions[4].value).toBe(false); - - done(); - } catch (e) { - done(e); - } - } - }); - mockAxios.onGet('/path/to/symbols/triangle.svg').reply(200, triangleSvg); - store.dispatch(loadDefaultStyles('triangle', 24, '#0000FF', '#00FF00', '/path/to/symbols/')); - }); - it('highlightGeometryEpic', (done) => { - store = mockStore({ - annotations: { - config: {multiGeometry: false, defaultPointType: 'symbol'}, - editing: { - style: {}, - features: [{...ft, properties: {id: '1'}}], - type: "FeatureCollection", - properties: {id: "1"} - }, - styling: false, - featureType: "Point" - } - }); - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 3) { - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[1].status).toBe('clean'); - expect(actions[2].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[2].status).toBe('updateStyle'); - const [feature] = actions[2].features[0].features; - expect(feature.style[0].highlight).toBe(true); - done(); - } - }); - const action = geometryHighlight("1"); - store.dispatch(action); - }); - it('edit circle annotation with geodesic property ', (done) => { - store = mockStore({...defaultState, annotations: {...defaultState.annotations, config: {...defaultState.annotations.config, geodesic: true}}} ); - - store.subscribe(() => { - const actions = store.getActions(); - if (actions.length >= 2) { - expect(actions[0].type).toBe(DRAWING_FEATURE); - expect(actions[1].type).toBe(CHANGE_DRAWING_STATUS); - expect(actions[1].options).toContain({ - geodesic: true, - editEnabled: true, - transformToFeatureCollection: true, - addClickCallback: true - }); - done(); - } - }); - const circleGeom = { - type: "Polygon", - coordinates: [[1, 2], [2, 3]] - }; - const feature = { - type: "Feature", - geometry: circleGeom, - properties: { - canEdit: true, - id: "12345", - isCircle: true - } - }; - const action = drawingFeatures([feature]); - store.dispatch(action); - - }); -}); diff --git a/web/client/epics/__tests__/identify-test.js b/web/client/epics/__tests__/identify-test.js index 722d454d1d..2a6890d220 100644 --- a/web/client/epics/__tests__/identify-test.js +++ b/web/client/epics/__tests__/identify-test.js @@ -29,7 +29,6 @@ import { EXCEPTIONS_FEATURE_INFO, SHOW_MAPINFO_MARKER, HIDE_MAPINFO_MARKER, - GET_VECTOR_INFO, SET_CURRENT_EDIT_FEATURE_QUERY, CLEAR_WARNING, loadFeatureInfo, @@ -59,7 +58,7 @@ import { removePopupOnUnregister, setMapTriggerEpic } from '../identify'; -import { CLOSE_ANNOTATIONS } from '../../actions/annotations'; +import { CLOSE_ANNOTATIONS } from '../../plugins/Annotations/actions/annotations'; import { testEpic, TEST_TIMEOUT, addTimeoutEpic } from './epicTestUtils'; import { @@ -480,17 +479,15 @@ describe('identify Epics', () => { layers: LAYERS }; const sentActions = [featureInfoClick({ latlng: { lat: 36.95, lng: -79.84 } })]; - testEpic(getFeatureInfoOnFeatureInfoClick, 5, sentActions, ([a0, a1, a2, a3, a4]) => { + testEpic(getFeatureInfoOnFeatureInfoClick, 5, sentActions, (actions) => { try { - expect(a0).toExist(); - expect(a0.type).toBe(PURGE_MAPINFO_RESULTS); - expect(a1).toExist(); - expect(a1.type).toBe(GET_VECTOR_INFO); - expect(a2.type).toBe(FORCE_UPDATE_MAP_LAYOUT); - expect(a3.type).toBe(NEW_MAPINFO_REQUEST); - expect(a3.reqId).toExist(); - expect(a3.request).toExist(); - expect(a4.type).toBe(LOAD_FEATURE_INFO); + expect(actions.map(action => action.type)).toEqual([ + PURGE_MAPINFO_RESULTS, + NEW_MAPINFO_REQUEST, + NEW_MAPINFO_REQUEST, + LOAD_FEATURE_INFO, + FORCE_UPDATE_MAP_LAYOUT + ]); done(); } catch (ex) { done(ex); @@ -649,9 +646,9 @@ describe('identify Epics', () => { done(); }, {}); }); - it('handleMapInfoMarker hide when layer is present', done => { + it('handleMapInfoMarker should display the marker even when layer is present', done => { testEpic(handleMapInfoMarker, 1, featureInfoClick("POINT", "LAYER"), ([ a ]) => { - expect(a.type).toBe(HIDE_MAPINFO_MARKER); + expect(a.type).toBe(SHOW_MAPINFO_MARKER); done(); }, {}); }); diff --git a/web/client/epics/__tests__/maplayout-test.js b/web/client/epics/__tests__/maplayout-test.js index 0ef7fe8df1..a94a733718 100644 --- a/web/client/epics/__tests__/maplayout-test.js +++ b/web/client/epics/__tests__/maplayout-test.js @@ -225,7 +225,7 @@ describe('map layout epics', () => { }); describe('tests layout updated for left panels', () => { - const epicResult = (done, left = 300) => actions => { + const epicResult = (done, left = 600) => actions => { try { expect(actions.length).toBe(1); actions.map((action) => { diff --git a/web/client/epics/__tests__/measurement-test.jsx b/web/client/epics/__tests__/measurement-test.jsx index 26ce88192b..81aa23b8b3 100644 --- a/web/client/epics/__tests__/measurement-test.jsx +++ b/web/client/epics/__tests__/measurement-test.jsx @@ -9,16 +9,22 @@ import expect from 'expect'; import { addTimeoutEpic, testEpic } from './epicTestUtils'; import { addAnnotationFromMeasureEpic, addAsLayerEpic, openMeasureEpic, setMeasureStateFromAnnotationEpic, closeMeasureEpics, addCoordinatesEpic } from '../measurement'; -import {addAnnotation, addAsLayer, setAnnotationMeasurement} from '../../actions/measurement'; +import { addAnnotation, addAsLayer, setAnnotationMeasurement, CHANGE_MEASUREMENT_TOOL } from '../../actions/measurement'; import { ADD_LAYER } from '../../actions/layers'; -import { clickOnMap } from '../../actions/map'; +import { + clickOnMap, + UNREGISTER_EVENT_LISTENER +} from '../../actions/map'; +import { UPDATE_DOCK_PANELS } from '../../actions/maplayout'; import {setControlProperty, toggleControl} from '../../actions/controls'; +import { EDIT_ANNOTATION } from '../../plugins/Annotations/actions/annotations'; describe('measurement epics', () => { const testData = { "features": [ { "type": "Feature", + "id": "feature-01", "geometry": { "type": "LineString", "coordinates": [ @@ -106,23 +112,44 @@ describe('measurement epics', () => { NUMBER_OF_ACTIONS, [ addAnnotation(features, textLabels, uom, false, {id: 1}) ], actions => { - expect(actions.length).toBe(NUMBER_OF_ACTIONS); - expect(actions[0].type).toBe("SET_CONTROL_PROPERTY"); - expect(actions[1].type).toBe("ANNOTATIONS:NEW"); - expect(actions[2].type).toBe("MEASUREMENT:SET_MEASUREMENT_CONFIG"); - expect(actions[2].property).toBe("exportToAnnotation"); - expect(actions[2].value).toBe(false); - expect(actions[3].type).toBe("ANNOTATIONS:SET_EDITING_FEATURE"); - expect(actions[3].feature.features).toBeTruthy(); - expect(actions[3].feature.features.length).toBe(4); - expect(actions[3].feature.features[0].geometry.type).toBe("LineString"); - expect(actions[3].feature.features[1].geometry.type).toBe("Point"); - expect(actions[3].feature.features[2].geometry.type).toBe("Point"); - expect(actions[3].feature.features[3].geometry.type).toBe("Point"); - expect(actions[3].feature.properties.id).toBe(1); - expect(actions[3].feature.visibility).toBe(true); + try { + expect(actions.length).toBe(NUMBER_OF_ACTIONS); + + let dispatchedActions = []; + + actions.forEach(action => { + if (action?.type) { + dispatchedActions.push(action.type); + } else { + action((a) => { + dispatchedActions.push(a.type); + return a; + }); + } + }); + expect(dispatchedActions).toEqual([ + CHANGE_MEASUREMENT_TOOL, + CHANGE_MEASUREMENT_TOOL, + ADD_LAYER, + EDIT_ANNOTATION + ]); + expect(actions[2].layer.features).toBeTruthy(); + expect(actions[2].layer.features.length).toBe(3); + expect(actions[2].layer.features[0].geometry.type).toBe("LineString"); + expect(actions[2].layer.features[1].geometry.type).toBe("Point"); + expect(actions[2].layer.features[2].geometry.type).toBe("Point"); + expect(actions[2].layer.id).toBe('annotations:1'); + expect(actions[2].layer.visibility).toBe(true); + } catch (e) { + done(e); + } done(); - }, null); + }, { + layers: { + flat: [], + selected: [] + } + }); }); it('test addAnnotationFromMeasureEpic with textLabels', (done) => { const NUMBER_OF_ACTIONS = 4; @@ -133,23 +160,46 @@ describe('measurement epics', () => { NUMBER_OF_ACTIONS, [ addAnnotation(features, textLabels, uom, true, {id: 1, visibility: false}) ], actions => { - expect(actions.length).toBe(NUMBER_OF_ACTIONS); - const resultFeatures = actions[3].feature.features; - const properties = actions[3].feature.properties; - const style = actions[3].feature.style; - expect(resultFeatures).toExist(); - expect(properties).toExist(); - expect(style).toExist(); - expect(resultFeatures.length).toBe(4); - expect(resultFeatures[0].geometry).toExist(); - expect(resultFeatures[0].geometry.textLabels).toExist(); - expect(resultFeatures[0].geometry.textLabels[0].text).toBe("2,937,911.16 m | 061.17°"); - expect(resultFeatures[0].geometry.textLabels[1].text).toBe("1,837,281.12 m | 140.72°"); - expect(resultFeatures[0].properties).toExist(); - expect(resultFeatures[0].properties.geometryGeodesic).toExist(); - expect(actions[3].feature.visibility).toBe(false); + try { + expect(actions.length).toBe(NUMBER_OF_ACTIONS); + + let dispatchedActions = []; + + actions.forEach(action => { + if (action?.type) { + dispatchedActions.push(action.type); + } else { + action((a) => { + dispatchedActions.push(a.type); + return a; + }); + } + }); + expect(dispatchedActions).toEqual([ + CHANGE_MEASUREMENT_TOOL, + CHANGE_MEASUREMENT_TOOL, + ADD_LAYER, + EDIT_ANNOTATION + ]); + expect(actions[2].layer.features).toBeTruthy(); + expect(actions[2].layer.features.length).toBe(3); + expect(actions[2].layer.features[0].geometry.type).toBe("LineString"); + expect(actions[2].layer.features[1].geometry.type).toBe("Point"); + expect(actions[2].layer.features[1].properties.label).toBe("2,937,911.16 m | 061.17°"); + expect(actions[2].layer.features[2].geometry.type).toBe("Point"); + expect(actions[2].layer.features[2].properties.label).toBe("1,837,281.12 m | 140.72°"); + expect(actions[2].layer.id).toBe('annotations:1'); + expect(actions[2].layer.visibility).toBe(false); + } catch (e) { + done(e); + } done(); - }, null); + }, { + layers: { + flat: [], + selected: [] + } + }); }); it('test addAsLayerEpic', (done) => { const NUMBER_OF_ACTIONS = 1; @@ -201,7 +251,7 @@ describe('measurement epics', () => { }, state); }); it('test setMeasureStateFromAnnotationEpic', (done) => { - const NUMBER_OF_ACTIONS = 4; + const NUMBER_OF_ACTIONS = 3; const state = { controls: { measure: { @@ -224,13 +274,11 @@ describe('measurement epics', () => { expect(actions[2].control).toBe("annotations"); expect(actions[2].property).toBe("enabled"); expect(actions[2].value).toBe(false); - expect(actions[3].type).toBe("ANNOTATIONS:VISIBILITY"); - expect(actions[3].visibility).toBe(false); done(); }, state); }); it('test closeMeasureEpics', (done) => { - const NUMBER_OF_ACTIONS = 2; + const NUMBER_OF_ACTIONS = 3; const state = { controls: { measure: { @@ -245,8 +293,28 @@ describe('measurement epics', () => { NUMBER_OF_ACTIONS, [ toggleControl('measure', null) ], actions => { - expect(actions.length).toBe(NUMBER_OF_ACTIONS); - expect(actions[1].type).toBe("ANNOTATIONS:CLEAN_HIGHLIGHT"); + try { + expect(actions.length).toBe(NUMBER_OF_ACTIONS); + let dispatchedActions = []; + + actions.forEach(action => { + if (action?.type) { + dispatchedActions.push(action.type); + } else { + action((a) => { + dispatchedActions.push(a.type); + return a; + }); + } + }); + expect(dispatchedActions).toEqual([ + CHANGE_MEASUREMENT_TOOL, + UNREGISTER_EVENT_LISTENER, + UPDATE_DOCK_PANELS + ]); + } catch (e) { + done(e); + } done(); }, state); }); diff --git a/web/client/epics/annotations.js b/web/client/epics/annotations.js deleted file mode 100644 index b0c9b7324d..0000000000 --- a/web/client/epics/annotations.js +++ /dev/null @@ -1,808 +0,0 @@ -/* - * Copyright 2017, GeoSolutions Sas. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. - */ - -import Rx from 'rxjs'; -import { head, findIndex, castArray, isArray, find, values, isEmpty, isUndefined, get } from 'lodash'; -import assign from 'object-assign'; -import axios from 'axios'; -import uuidv1 from 'uuid/v1'; -import { saveAs } from 'file-saver'; - -import { MAP_CONFIG_LOADED } from '../actions/config'; -import { TOGGLE_CONTROL, toggleControl, setControlProperty } from '../actions/controls'; -import { addLayer, updateNode, removeLayer, CHANGE_LAYER_PROPERTIES, CHANGE_GROUP_PROPERTIES } from '../actions/layers'; -import { changeMeasurement } from '../actions/measurement'; -import { error } from '../actions/notifications'; -import { hideMapinfoMarker, purgeMapInfoResults, closeIdentify, PURGE_MAPINFO_RESULTS } from '../actions/mapInfo'; -import { - updateAnnotationGeometry, - setStyle, - toggleStyle, - cleanHighlight, - toggleAdd, - showAnnotation, - editAnnotation, - setDefaultStyle, - setErrorSymbol, - loading, - CONFIRM_REMOVE_ANNOTATION, - SAVE_ANNOTATION, - EDIT_ANNOTATION, - CANCEL_EDIT_ANNOTATION, - SET_STYLE, - RESTORE_STYLE, - HIGHLIGHT, - CLEAN_HIGHLIGHT, - CONFIRM_CLOSE_ANNOTATIONS, - START_DRAWING, - DOWNLOAD, - LOAD_ANNOTATIONS, - CHANGED_SELECTED, - RESET_COORD_EDITOR, - CHANGE_RADIUS, - ADD_NEW_FEATURE, - SET_EDITING_FEATURE, - CHANGE_TEXT, - NEW_ANNOTATION, - TOGGLE_STYLE, - CONFIRM_DELETE_FEATURE, - OPEN_EDITOR, - TOGGLE_ANNOTATION_VISIBILITY, - LOAD_DEFAULT_STYLES, - GEOMETRY_HIGHLIGHT, - UNSELECT_FEATURE, - toggleVisibilityAnnotation -} from '../actions/annotations'; -import { FEATURES_SELECTED, GEOMETRY_CHANGED, DRAWING_FEATURE, changeDrawingStatus } from '../actions/draw'; - -import { set } from '../utils/ImmutableUtils'; -import { reprojectGeoJson } from '../utils/CoordinatesUtils'; -import { - ANNOTATION_TYPE, - normalizeAnnotation, - removeDuplicate, - validateCoordsArray, - getStartEndPointsForLinestring, - modifySelectedInEdited, - DEFAULT_ANNOTATIONS_STYLES, - STYLE_POINT_MARKER, - STYLE_POINT_SYMBOL, - DEFAULT_SHAPE, - DEFAULT_PATH, ANNOTATIONS -} from '../utils/AnnotationsUtils'; -import { MEASURE_TYPE } from '../utils/MeasurementUtils'; -import { createSvgUrl } from '../utils/VectorStyleUtils'; - -import { annotationsLayerSelector, multiGeometrySelector, symbolErrorsSelector, editingSelector } from '../selectors/annotations'; -import { mapNameSelector } from '../selectors/map'; -import { groupsSelector } from '../selectors/layers'; - - -import symbolMissing from '../product/assets/symbols/symbolMissing.svg'; -import {shutdownToolOnAnotherToolDrawing} from "../utils/ControlUtils"; -/** - * Epics for annotations - * @name epics.annotations - * @type {Object} - */ - -/** - * TODO test this and move it into utils -*/ -const validateFeatureCollection = (feature) => { - let features = feature.features.map(f => { - let coords = []; - if (!f.geometry ) { - return f; - } - if (f.geometry.type === "LineString" || f.geometry.type === "MultiPoint") { - coords = f.geometry.coordinates.filter(validateCoordsArray); - } else if (f.geometry.type === "Polygon") { - coords = f.geometry.coordinates[0] ? [f.geometry.coordinates[0].filter(validateCoordsArray)] : [[]]; - } else { - coords = [f.geometry.coordinates].filter(validateCoordsArray); - coords = coords.length ? coords[0] : []; - } - return set("geometry.coordinates", coords, f); - }); - return set("features", features, feature); -}; - -/** - * Get geodesic property from the annotation config - * @param state - * @param drawMethod - * @return {boolean} - */ -const getGeodesicProperty = (state) => { - return get(state.annotations, "config.geodesic", false); -}; - -const getSelectDrawStatus = (state) => { - let feature = state.annotations.editing; - const multiGeom = multiGeometrySelector(state); - const drawOptions = { - featureProjection: "EPSG:4326", - stopAfterDrawing: !multiGeom, - editEnabled: false, - selectEnabled: true, - drawEnabled: false, - translateEnabled: false, - transformToFeatureCollection: true, - geodesic: getGeodesicProperty(state) - }; - - feature = validateFeatureCollection(feature); - return changeDrawingStatus("drawOrEdit", state.draw.drawMethod, ANNOTATIONS, [feature], drawOptions, assign({}, feature.style, {highlight: false})); -}; -const getReadOnlyDrawStatus = (state) => { - let feature = state.annotations.editing; - const multiGeom = multiGeometrySelector(state); - const drawOptions = { - featureProjection: "EPSG:4326", - stopAfterDrawing: !multiGeom, - editEnabled: false, - selectEnabled: false, - translateEnabled: false, - drawEnabled: false, - transformToFeatureCollection: true, - geodesic: getGeodesicProperty(state) - }; - feature = validateFeatureCollection(feature); - return changeDrawingStatus("drawOrEdit", state.draw.drawMethod, ANNOTATIONS, [feature], drawOptions, feature.style); -}; -const getEditingGeomDrawStatus = (state) => { - let feature = state.annotations.editing; - const multiGeom = multiGeometrySelector(state); - const drawOptions = { - featureProjection: "EPSG:4326", - stopAfterDrawing: !multiGeom, - editEnabled: true, - selectEnabled: false, - drawEnabled: false, - editFilter: (f) => f.getProperties().canEdit, - translateEnabled: false, - addClickCallback: true, - useSelectedStyle: true, - transformToFeatureCollection: true, - geodesic: getGeodesicProperty(state) - }; - feature = validateFeatureCollection(feature); - return changeDrawingStatus("drawOrEdit", state.draw.drawMethod, ANNOTATIONS, [feature], drawOptions, feature.style); -}; -const mergeGeometry = (features) => { - if (features[0].type === "FeatureCollection") { - return features[0]; - } - return features.reduce((previous, feature) => { - if (previous.type === 'Empty') { - if (feature.type === "FeatureCollection") { - return mergeGeometry(feature.features); - } - return feature.geometry; - } - if (previous.type === 'Point') { - return { - type: 'MultiPoint', - coordinates: [previous.coordinates, feature.geometry.coordinates] - }; - } - return { - type: 'MultiPoint', - coordinates: previous.coordinates.concat([feature.geometry.coordinates]) // TODO missing a wrapper [ ] ? - }; - }, { - type: 'Empty' - }); -}; - - -const createNewFeature = (action) => { - return { - type: "FeatureCollection", - properties: assign({}, action.properties, action.fields, {id: action.id}, {visibility: true}), - features: action.geometry, - style: assign({}, action.style, {highlight: false}) - }; -}; - - -export default { - addAnnotationsLayerEpic: (action$, store) => action$.ofType(MAP_CONFIG_LOADED) - .switchMap(() => { - const annotationsLayer = annotationsLayerSelector(store.getState()); - if (annotationsLayer) { - const {visibility = false, features: annotationFeatures = []} = annotationsLayer; - // parsing old style structure - let features = annotationFeatures.map(ftColl => { - return {...ftColl, style: {}, features: (ftColl.features || []).map(ft => { - let styleType = ft.properties.isCircle && "Circle" || ft.properties.isText && "Text" || ft.geometry.type; - let extraStyles = []; - if (styleType === "Circle") { - // Default style object for circle's center style - extraStyles.push({...DEFAULT_ANNOTATIONS_STYLES.Point, iconAnchor: [0.5, 0.5], type: "Point", title: "Center Style", filtering: false, geometry: "centerPoint"}); - } - if (styleType === "LineString") { - // Default style object for linestring's start and end point - extraStyles.push(getStartEndPointsForLinestring()); - } - // Update style object of the annotation - return {...ft, - style: isArray(ft.style) ? ft.style.map(ftStyle => { - const {symbolUrlCustomized, ...filteredStyle} = ftStyle; - return filteredStyle; - }) : [{...ftColl.style[styleType], id: ftColl.style[styleType].id || uuidv1(), symbolUrlCustomized: undefined}].concat(extraStyles)}; // Update feature with old style structure - })}; - }); - - return Rx.Observable.of(updateNode(ANNOTATIONS, 'layer', { - features, - style: {}, - visibility - })); - } - return Rx.Observable.empty(); - }), - editAnnotationEpic: (action$, store) => action$.ofType(EDIT_ANNOTATION) - .switchMap(() => { - const state = store.getState(); - const feature = state.annotations.editing; - const type = state.annotations.featureType; - const multiGeom = multiGeometrySelector(state); - const drawOptions = { - featureProjection: "EPSG:4326", - stopAfterDrawing: !multiGeom, - editEnabled: false, - selectEnabled: true, - drawEnabled: false, - transformToFeatureCollection: true, - geodesic: getGeodesicProperty(state) - }; - const isMeasureType = feature.properties?.type === MEASURE_TYPE || false; - let actions = [ - toggleVisibilityAnnotation(feature?.properties?.id, false), - changeDrawingStatus("drawOrEdit", type, ANNOTATIONS, [feature], drawOptions, assign({}, feature.style, { - highlight: false - })), - hideMapinfoMarker() - ]; - actions = isMeasureType ? actions.concat(changeMeasurement({geomType: null})) : actions; - // parsing styles searching for missing symbols, therefore updating it with a missing symbol - return Rx.Observable.from(actions); - }), - newAnnotationEpic: (action$) => action$.ofType(NEW_ANNOTATION) - .switchMap(() => { - return Rx.Observable.from([ - hideMapinfoMarker() - ]); - }), - addAnnotationEpic: (action$, store) => action$.ofType(ADD_NEW_FEATURE) - .switchMap(() => { - const state = store.getState(); - const feature = state.annotations.editing; - return Rx.Observable.from([ - toggleVisibilityAnnotation(feature?.properties?.id, false), - getSelectDrawStatus(store.getState()), - hideMapinfoMarker() - ]); - }), - setEditingFeatureEpic: (action$, store) => action$.ofType(SET_EDITING_FEATURE) - .switchMap((action) => { - const {properties, visibility} = action.feature || {}; - return Rx.Observable.of( - toggleVisibilityAnnotation(properties.id, visibility), - getSelectDrawStatus(store.getState()), - hideMapinfoMarker() - ); - }), - disableInteractionsEpic: (action$, store) => action$.ofType(TOGGLE_STYLE) - .switchMap(() => { - const isStylingActive = store.getState() && store.getState().annotations && store.getState().annotations.styling; - return Rx.Observable.from([ - isStylingActive ? getReadOnlyDrawStatus(store.getState()) : getEditingGeomDrawStatus(store.getState()) - ]); - }), - removeAnnotationEpic: (action$, store) => action$.ofType(CONFIRM_REMOVE_ANNOTATION) - .switchMap((action) => { - if (action.attribute === 'geometry') { - let state = store.getState(); - let { editing: feature } = modifySelectedInEdited(state.annotations.selected, state.annotations.editing); - const type = state.annotations.featureType; - const multiGeom = multiGeometrySelector(state); - const drawOptions = { - featureProjection: "EPSG:4326", - stopAfterDrawing: !multiGeom, - editEnabled: true, - drawEnabled: false, - selectEnabled: true, - editFilter: (f) => f.getProperties().canEdit, - useSelectedStyle: true, - transformToFeatureCollection: true, - addClickCallback: true, - geodesic: getGeodesicProperty(state) - }; - - return Rx.Observable.from([ - changeDrawingStatus("replace", type, ANNOTATIONS, [feature], {}), - changeDrawingStatus("drawOrEdit", type, ANNOTATIONS, [feature], drawOptions, assign({}, feature.style, {highlight: false})) - ]); - } - const newFeatures = annotationsLayerSelector(store.getState()).features.filter(f => f.properties.id !== action.id); - return Rx.Observable.from([ - updateNode(ANNOTATIONS, 'layer', { - features: newFeatures - }), - hideMapinfoMarker(), - // TODO: not sure if necessary to purge also results. closeIdentify may purge automatically if annotations are disabled - purgeMapInfoResults(), - closeIdentify() - ].concat(newFeatures.length === 0 ? [removeLayer(ANNOTATIONS)] : [])); - }), - openEditorEpic: action$ => action$.ofType(OPEN_EDITOR) - .switchMap((action) => { - return Rx.Observable.from([ - closeIdentify(), - setControlProperty(ANNOTATIONS, "enabled", true), - showAnnotation(action.id), - editAnnotation(action.id) - ]); - }), - saveAnnotationEpic: (action$, store) => action$.ofType(SAVE_ANNOTATION) - .switchMap((action) => { - const annotationsLayer = head(store.getState().layers.flat.filter(l => l.id === ANNOTATIONS)); - const featureCollection = action.geometry; - return Rx.Observable.from((annotationsLayer ? [updateNode(ANNOTATIONS, 'layer', { - features: annotationsLayerSelector(store.getState()).features.map(f => assign({}, f, { - properties: f.properties.id === action.id ? assign({}, f.properties, action.properties, action.fields) : f.properties, - features: f.properties.id === action.id ? featureCollection : f.features, - style: f.properties.id === action.id ? action.style : f.style - })).concat(action.newFeature ? [createNewFeature(action)] : []), - visibility: !isUndefined(action?.properties?.visibility) ? action.properties.visibility : false - })] : [ - addLayer({ - type: 'vector', - visibility: true, - id: ANNOTATIONS, - name: "Annotations", - hideLoading: true, - style: action.style, - features: [createNewFeature(action)], - handleClickOnLayer: true - }) - ]).concat([ - changeDrawingStatus("clean", store.getState().annotations.featureType || '', ANNOTATIONS, [], {}), - ...(action.newFeature ? [toggleVisibilityAnnotation(action.id, true)] : []) - ])); - }), - cancelEditAnnotationEpic: (action$, store) => action$.ofType(CANCEL_EDIT_ANNOTATION) - .switchMap((action) => { - const {id, visibility} = action?.properties || {}; - return Rx.Observable.from([ - changeDrawingStatus("clean", store.getState().annotations.featureType || '', ANNOTATIONS, [], {}), - toggleVisibilityAnnotation(id, visibility) - ]); - }), - purgeMapInfoEpic: (action$, store) => action$.ofType( PURGE_MAPINFO_RESULTS) - .filter(() => get(store.getState(), 'draw.drawOwner', '') === ANNOTATIONS) - .switchMap(() => { - return Rx.Observable.from([ - changeDrawingStatus("clean", store.getState().annotations.featureType || '', ANNOTATIONS, [], {}) - ]); - }), - startDrawingMultiGeomEpic: (action$, store) => action$.ofType(START_DRAWING) - .filter(() => store.getState().annotations.editing.features && !!store.getState().annotations.editing.features.length || store.getState().annotations.featureType === "Circle") - .switchMap( () => { - const state = store.getState(); - const feature = state.annotations.editing; - const type = state.annotations.featureType; - const defaultTextAnnotation = state.annotations.defaultTextAnnotation; - const drawOptions = { - featureProjection: "EPSG:4326", - stopAfterDrawing: !multiGeometrySelector, - editEnabled: type !== "Circle", - translateEnabled: false, - drawEnabled: type === "Circle", - useSelectedStyle: true, - editFilter: (f) => f.getProperties().canEdit, - defaultTextAnnotation, - transformToFeatureCollection: true, - addClickCallback: true, - geodesic: getGeodesicProperty(state) - }; - return Rx.Observable.of(changeDrawingStatus("drawOrEdit", type, ANNOTATIONS, [feature], drawOptions, assign({}, feature.style, {highlight: false}))); - }), - endDrawGeomEpic: (action$, store) => action$.ofType(GEOMETRY_CHANGED) - .filter(action => action.owner === ANNOTATIONS) - .switchMap( (action) => { - return Rx.Observable.from([ - updateAnnotationGeometry(mergeGeometry(action.features), action.textChanged, action.circleChanged) - ].concat(!multiGeometrySelector(store.getState()) && store.getState().annotations.drawing ? [toggleAdd()] : [])); - }), - setAnnotationStyleEpic: (action$, store) => action$.ofType(SET_STYLE) - .switchMap( () => { - // TODO verify if we need to override the style here or in the store - let feature = validateFeatureCollection(store.getState().annotations.editing); - const features = feature.features; - const selected = store.getState().annotations.selected; - let ftChanged = find(features, f => f.properties.id === selected.properties.id); // can use also selected.style - - let projectedFeature = reprojectGeoJson(ftChanged, "EPSG:4326", "EPSG:3857"); - return Rx.Observable.from([ - changeDrawingStatus("updateStyle", store.getState().annotations.featureType, ANNOTATIONS, [projectedFeature], {}, assign({}, selected.style, {highlight: false})) - ] - ); - }), - restoreStyleEpic: (action$, store) => action$.ofType(RESTORE_STYLE) - .switchMap( () => { - const {styling, editing} = store.getState().annotations; - const {style, ...feature} = editing; - return Rx.Observable.from([ - changeDrawingStatus("replace", store.getState().annotations.featureType, ANNOTATIONS, [feature], {}, style), - setStyle(store.getState().annotations.originalStyle), - getSelectDrawStatus(store.getState()), - toggleStyle(!styling) - ] - ); - }), - highlightAnnotationEpic: (action$, store) => action$.ofType(HIGHLIGHT) - .switchMap((action) => { - return Rx.Observable.of( - updateNode(ANNOTATIONS, 'layer', { - features: annotationsLayerSelector(store.getState()).features.map(f => f.properties.id === action.id ? assign({}, f, { - features: f.features && f.features.length && f.features.map(highlightedFt => assign({}, highlightedFt, { - style: castArray(highlightedFt.style).map(s => assign({}, s, { - highlight: true - })) - })) || [] - }) : f) - }) - ); - }), - showHideAnnotationEpic: (action$, store) => action$.ofType(TOGGLE_ANNOTATION_VISIBILITY, CHANGE_LAYER_PROPERTIES) - .filter(action=> - (action.type === CHANGE_LAYER_PROPERTIES && action.layer === ANNOTATIONS && !isUndefined(action.newProperties.visibility)) - || (action.type === TOGGLE_ANNOTATION_VISIBILITY)) - .switchMap((action) => { - const feature = (f, visibility = false) => assign({}, f, { - properties: {...f.properties, visibility} - }); - const state = store.getState(); - let isLayerPropertyChange = action.layer === ANNOTATIONS; - const annotationLayers = annotationsLayerSelector(state); - const isAnnotationEditing = !isEmpty(editingSelector(state)); - - // Update visibility of annotations from TOC or annotation panel - if (!isEmpty(annotationLayers)) { - // Update any missing visibility properties of the annotation (Happens with old annotation) - let features = (annotationLayers.features || []).map(ft=> ({...ft, properties: {...ft.properties, visibility: isUndefined(ft.properties.visibility) ? true : ft.properties.visibility}})); - features = features.map(f => isLayerPropertyChange ? feature(f, action?.newProperties?.visibility) - : (f.properties.id === action.id) - ? feature(f, !isUndefined(action.visibility) ? action.visibility : !f.properties.visibility) : f); - const layerVisibility = !!features?.filter(f => f.properties.visibility)?.length; - return Rx.Observable.of(updateNode(ANNOTATIONS, 'layer', {features, - // Update visibility of the layer when not in edit mode - ...(!isAnnotationEditing && {visibility: layerVisibility}) - })); - } - return Rx.Observable.empty(); - }), - hideAnnotationGroupEpic: (action$, store) => action$.ofType(CHANGE_GROUP_PROPERTIES) - .filter(action=> { - const groupUpdated = head((groupsSelector(store.getState()) || []).filter(group => group.id === action.group)); - return findIndex(groupUpdated.nodes, node => node.id === ANNOTATIONS) !== -1 && !isUndefined(action.newProperties.visibility); - }).switchMap(action=> { - const state = store.getState(); - const annotationLayers = annotationsLayerSelector(state); - if (!isEmpty(annotationLayers) && !isEmpty(annotationLayers.features)) { - const features = annotationLayers.features.map(ft=> ({...ft, properties: {...ft.properties, visibility: action.newProperties.visibility}})); - return Rx.Observable.of(updateNode(ANNOTATIONS, 'layer', {features})); - } - return Rx.Observable.empty(); - }), - cleanHighlightAnnotationEpic: (action$, store) => action$.ofType(CLEAN_HIGHLIGHT) - .switchMap(() => { - const annotationsLayer = annotationsLayerSelector(store.getState()); - if (annotationsLayer && annotationsLayer.features && annotationsLayer.features.length) { - return Rx.Observable.of( - updateNode(ANNOTATIONS, 'layer', { - features: annotationsLayer.features.map(f => assign({}, f, { - features: f.features && f.features.length && f.features.map(highlightedFt => assign({}, highlightedFt, { - style: castArray(highlightedFt.style).map(s => assign({}, s, { - highlight: false - })) - })) || [] - })) - }) - ); - } - return Rx.Observable.empty(); - }), - /** - this epic closes annotation once other tools takes control over drawing - */ - tearDownByDrawingToolsEpic: (action$, store) => shutdownToolOnAnotherToolDrawing(action$, store, 'annotations', - () => Rx.Observable.of(purgeMapInfoResults())), - closeAnnotationsEpic: (action$, store) => action$.ofType(TOGGLE_CONTROL) - .filter((action) => action.control === ANNOTATIONS && !store.getState().controls.annotations.enabled) - .switchMap(() => { - return Rx.Observable.from([ - cleanHighlight(), - changeDrawingStatus("clean", store.getState().annotations?.featureType || '', ANNOTATIONS, [], {}) - ]); - }), - confirmCloseAnnotationsEpic: (action$, store) => action$.ofType(CONFIRM_CLOSE_ANNOTATIONS) - .switchMap((action) => { - const {id, visibility} = action?.properties || {}; - return Rx.Observable.from(( - store.getState().controls.annotations && store.getState().controls.annotations.enabled ? - [toggleControl(ANNOTATIONS), toggleVisibilityAnnotation(id, visibility)] : []) - .concat([purgeMapInfoResults()])); - }), - downloadAnnotations: (action$, {getState}) => action$.ofType(DOWNLOAD) - .switchMap(({annotation}) => { - try { - const annotations = annotation && [annotation] || (annotationsLayerSelector(getState())).features; - const mapName = mapNameSelector(getState()); - saveAs(new Blob([JSON.stringify({features: annotations, type: ANNOTATION_TYPE})], {type: "application/json;charset=utf-8"}), `${ mapName.length > 0 && mapName || "Annotations"}.json`); - return Rx.Observable.empty(); - } catch (e) { - return Rx.Observable.of(error({ - title: "annotations.title", - message: "annotations.downloadError", - autoDismiss: 5, - position: "tr" - })); - } - }), - onLoadAnnotations: (action$, {getState}) => action$.ofType(LOAD_ANNOTATIONS) - .switchMap(({features, override}) => { - const annotationsLayer = annotationsLayerSelector(getState()); - const {messages = {}} = (getState()).locale || {}; - const oldFeature = annotationsLayer && annotationsLayer.features || []; - const normFeatures = features.map((a) => normalizeAnnotation(a, messages)); - const newFeatures = override ? normFeatures : oldFeature.concat(normFeatures); - const action = annotationsLayer ? updateNode(ANNOTATIONS, 'layer', { - features: removeDuplicate(newFeatures)}) : addLayer({ - type: 'vector', - visibility: true, - id: ANNOTATIONS, - name: "Annotations", - hideLoading: true, - features: newFeatures, - handleClickOnLayer: true - }); - return Rx.Observable.of(action); - }), - onChangedSelectedFeatureEpic: (action$, {getState}) => action$.ofType(CHANGED_SELECTED ) - .switchMap(({}) => { - const state = getState(); - let { selected, editing: feature } = modifySelectedInEdited(state.annotations.selected, state.annotations.editing); - - let method = selected.geometry.type; - if (selected.properties?.isCircle) method = "Circle"; - if (selected.properties?.isText) method = "Text"; - - const multiGeometry = multiGeometrySelector(state); - const style = feature.style; - const action = changeDrawingStatus("drawOrEdit", method, ANNOTATIONS, [feature], { - featureProjection: "EPSG:4326", - stopAfterDrawing: !multiGeometry, - editEnabled: true, - translateEnabled: false, - editFilter: (f) => f.getProperties().canEdit, - useSelectedStyle: true, - drawEnabled: false, - transformToFeatureCollection: true, - addClickCallback: true, - geodesic: getGeodesicProperty(state) - }, assign({}, style, {highlight: false})); - return Rx.Observable.of(action); - }), - onBackToEditingFeatureEpic: (action$, {getState}) => action$.ofType( RESET_COORD_EDITOR, CONFIRM_DELETE_FEATURE, UNSELECT_FEATURE ) - .switchMap(({}) => { - const state = getState(); - const feature = state.annotations.editing; - const multiGeometry = multiGeometrySelector(state); - const style = feature.style; - - const action = changeDrawingStatus("drawOrEdit", "", ANNOTATIONS, [feature], { - featureProjection: "EPSG:4326", - stopAfterDrawing: !multiGeometry, - editEnabled: false, - drawEnabled: false, - selectEnabled: true, - transformToFeatureCollection: true - }, assign({}, style, {highlight: false})); - return Rx.Observable.of(action); - }), - redrawOnChangeTextEpic: (action$, {getState}) => action$.ofType( CHANGE_TEXT ) - .switchMap(() => { - const state = getState(); - let feature = state.annotations.editing; - let selected = state.annotations.selected; - const multiGeometry = multiGeometrySelector(state); - const style = feature.style; - - selected = set("geometry.coordinates", [selected.geometry.coordinates].filter(validateCoordsArray)[0] || [], selected); - selected = set("geometry.type", "Point", selected); - let selectedIndex = findIndex(feature.features, (f) => f.properties.id === selected.properties.id); - if (validateCoordsArray(selected.geometry.coordinates) ) { - // if it has at least the coords valid draw the small circle for the text, - // text will be drawn if present - if (selectedIndex === -1) { - feature = set(`features`, feature.features.concat([selected]), feature); - } else { - feature = set(`features[${selectedIndex}]`, selected, feature); - } - } else { - // if coords ar not valid do not draw anything - selected = set("geometry", null, selected); - if (selectedIndex !== -1) { - feature = set(`features[${selectedIndex}]`, selected, feature); - } else { - feature = set(`features`, feature.features.concat([selected]), feature); - } - } - const action = changeDrawingStatus("drawOrEdit", "Text", ANNOTATIONS, [feature], { - featureProjection: "EPSG:4326", - stopAfterDrawing: !multiGeometry, - editEnabled: true, - translateEnabled: false, - editFilter: (f) => f.getProperties().canEdit, - drawEnabled: false, - useSelectedStyle: true, - transformToFeatureCollection: true, - addClickCallback: true - }, assign({}, style, {highlight: false})); - return Rx.Observable.of(action); - }), - redrawOnChangeRadiusEpic: (action$, {getState}) => action$.ofType( CHANGE_RADIUS ) - .switchMap(() => { - const state = getState(); - let feature = state.annotations.editing; - let selected = state.annotations.selected; - const multiGeometry = multiGeometrySelector(state); - const style = feature.style; - - // selected = set("geometry.coordinates", [selected.geometry.coordinates].filter(validateCoordsArray)[0] || [], selected); - // selected = set("geometry.type", "Polygon", selected); - let selectedIndex = findIndex(feature.features, (f) => f.properties.id === selected.properties.id); - if (!selected.properties.isValidFeature) { - selected = set("geometry", { - type: "Polygon", - coordinates: [[]] - }, selected); - } else { - selected = set("geometry", selected.properties.polygonGeom, selected); - } - if (selectedIndex === -1) { - feature = set(`features`, feature.features.concat([selected]), feature); - } else { - feature = set(`features[${selectedIndex}]`, selected, feature); - } - // this should run only if the feature has a valid geom - const action = changeDrawingStatus("drawOrEdit", "Circle", ANNOTATIONS, [feature], { - featureProjection: "EPSG:4326", - stopAfterDrawing: !multiGeometry, - editEnabled: true, - translateEnabled: false, - editFilter: (f) => f.getProperties().canEdit, - drawEnabled: false, - useSelectedStyle: true, - transformToFeatureCollection: true, - addClickCallback: true, - geodesic: getGeodesicProperty(state) - }, assign({}, style, {highlight: false})); - return Rx.Observable.of(action); - }), - editSelectedFeatureEpic: (action$, {getState}) => action$.ofType(FEATURES_SELECTED) - .switchMap(() => { - const state = getState(); - const feature = state.annotations.editing; - const selected = state.annotations.selected; - const multiGeometry = multiGeometrySelector(state); - const style = feature.style; - let method = selected.geometry.type; - if (selected.properties.isCircle) { - method = "Circle"; - } - if (selected.properties.isText) { - method = "Text"; - } - const action = changeDrawingStatus("drawOrEdit", method, ANNOTATIONS, [feature], { - featureProjection: "EPSG:4326", - stopAfterDrawing: !multiGeometry, - editEnabled: true, - translateEnabled: false, - editFilter: (f) => f.getProperties().canEdit, - drawEnabled: false, - useSelectedStyle: true, - transformToFeatureCollection: true, - addClickCallback: true, - geodesic: getGeodesicProperty(state) - }, assign({}, style, {highlight: false})); - return Rx.Observable.of( changeDrawingStatus("clean"), action); - }), - highlightGeometryEpic: (action$, {getState}) => action$.ofType(GEOMETRY_HIGHLIGHT) - .switchMap(({id = '', state: highlight = true}) => { - const state = getState(); - const {editing, featureType: type} = state.annotations; - const ftChangedIndex = findIndex(editing.features, (f) => f.properties.id === id); - const selectedGeoJSON = editing.features[ftChangedIndex]; - const styleChanged = castArray(selectedGeoJSON.style).map(s => ({...s, highlight})); - const action = changeDrawingStatus("updateStyle", type, ANNOTATIONS, [ - set(`features[${ftChangedIndex}]`, set("style", styleChanged, selectedGeoJSON), editing)], {transformToFeatureCollection: true}, assign({}, editing.style, {highlight: false})); - return Rx.Observable.of( changeDrawingStatus("clean"), action); - }), - editCircleFeatureEpic: (action$, {getState}) => action$.ofType(DRAWING_FEATURE) - .filter(a => a.features[0].properties && a.features[0].properties.isCircle) - .delay(300) - .switchMap(() => { - const state = getState(); - const feature = state.annotations.editing; - const multiGeometry = multiGeometrySelector(state); - const style = feature.style; - - const action = changeDrawingStatus("drawOrEdit", "Circle", ANNOTATIONS, [feature], { - featureProjection: "EPSG:4326", - stopAfterDrawing: !multiGeometry, - editEnabled: true, - translateEnabled: false, - editFilter: (f) => f.getProperties().canEdit, - drawEnabled: false, - useSelectedStyle: true, - transformToFeatureCollection: true, - addClickCallback: true, - geodesic: getGeodesicProperty(state) - }, assign({}, style, {highlight: false})); - return Rx.Observable.of(action); - }), - /** - * Fetches style information from server and sets default styles using specified parameters. - * Currently handles symbol and marker point type styles. - */ - loadDefaultAnnotationsStylesEpic: (action$, store) => action$.ofType(LOAD_DEFAULT_STYLES) - .switchMap(({shape = DEFAULT_SHAPE, size = 64, fillColor = '#000000', strokeColor = '#000000', symbolsPath = DEFAULT_PATH}) => { - const symbolErrors = symbolErrorsSelector(store.getState()) || []; - - const pointTypesFlows = { - symbol: () => { - const defaultSymbolStyle = { - ...STYLE_POINT_SYMBOL, - shape, - size, - fillColor, - color: strokeColor, - symbolUrl: symbolsPath + shape + ".svg" - }; - return Rx.Observable.defer(() => axios.get(defaultSymbolStyle.symbolUrl) - .then(() => createSvgUrl(defaultSymbolStyle, defaultSymbolStyle.symbolUrlCustomized || defaultSymbolStyle.symbolUrl))) - .map((symbolUrlCustomized) => setDefaultStyle('POINT.symbol', {...defaultSymbolStyle, symbolUrlCustomized})) - .catch(() => { - return Rx.Observable.of( - setErrorSymbol(symbolErrors.concat(['loading_symbol' + shape])), - setDefaultStyle('POINT.symbol', { - ...defaultSymbolStyle, - symbolUrlCustomized: symbolMissing, - symbolUrl: symbolsPath + shape + ".svg", - shape - }) - ); - }); - }, - marker: () => { - return Rx.Observable.of(setDefaultStyle('POINT.marker', STYLE_POINT_MARKER)); - } - }; - - return Rx.Observable.merge(...values(pointTypesFlows).map(flowFunc => flowFunc())) - .startWith(loading(true)) - .concat(Rx.Observable.of(loading(false))); - }) - -}; diff --git a/web/client/epics/identify.js b/web/client/epics/identify.js index 24912b22f8..1d71dffbba 100644 --- a/web/client/epics/identify.js +++ b/web/client/epics/identify.js @@ -11,13 +11,13 @@ import { get, find, reverse} from 'lodash'; import uuid from 'uuid'; import { LOCATION_CHANGE } from 'connected-react-router'; import { - LOAD_FEATURE_INFO, ERROR_FEATURE_INFO, GET_VECTOR_INFO, + LOAD_FEATURE_INFO, ERROR_FEATURE_INFO, FEATURE_INFO_CLICK, CLOSE_IDENTIFY, TOGGLE_HIGHLIGHT_FEATURE, PURGE_MAPINFO_RESULTS, EDIT_LAYER_FEATURES, UPDATE_FEATURE_INFO_CLICK_POINT, featureInfoClick, updateCenterToMarker, purgeMapInfoResults, exceptionsFeatureInfo, loadFeatureInfo, errorFeatureInfo, - noQueryableLayers, newMapInfoRequest, getVectorInfo, + noQueryableLayers, newMapInfoRequest, showMapinfoMarker, hideMapinfoMarker, setCurrentEditFeatureQuery, SET_MAP_TRIGGER, CLEAR_WARNING } from '../actions/mapInfo'; @@ -29,7 +29,7 @@ import { QUERY_CREATE } from '../actions/wfsquery'; import { CHANGE_MOUSE_POINTER, CLICK_ON_MAP, UNREGISTER_EVENT_LISTENER, CHANGE_MAP_VIEW, MOUSE_MOVE, zoomToPoint, changeMapView, registerEventListener, unRegisterEventListener } from '../actions/map'; import { browseData } from '../actions/layers'; -import { closeAnnotations } from '../actions/annotations'; +import { closeAnnotations } from '../plugins/Annotations/actions/annotations'; import { MAP_CONFIG_LOADED } from '../actions/config'; import {addPopup, cleanPopups, removePopup, REMOVE_MAP_POPUP} from '../actions/mapPopups'; import { cancelSelectedItem } from '../actions/search'; @@ -146,7 +146,7 @@ export const getFeatureInfoOnFeatureInfoClick = (action$, { getState = () => { } })) .startWith(newMapInfoRequest(reqId, param)); } - return Rx.Observable.of(getVectorInfo(layer, request, metadata, queryableLayers), forceUpdateMapLayout()); + return Rx.Observable.of(forceUpdateMapLayout()); }); // NOTE: multiSelection is inside the event // TODO: move this flag in the application state @@ -161,12 +161,12 @@ export const getFeatureInfoOnFeatureInfoClick = (action$, { getState = () => { } */ export const handleMapInfoMarker = (action$, {getState}) => action$.ofType(FEATURE_INFO_CLICK).filter(() => !isMapPopup(getState())) - .map(({ layer }) => layer - ? hideMapinfoMarker() - : showMapinfoMarker() + // we should not hide the marker anymore + // the visibility of the marker should manage by the identify tool + .map(() => showMapinfoMarker() ); export const closeFeatureGridFromIdentifyEpic = (action$, store) => - action$.ofType(LOAD_FEATURE_INFO, GET_VECTOR_INFO) + action$.ofType(LOAD_FEATURE_INFO) .switchMap(() => { if (isFeatureGridOpen(store.getState())) { return Rx.Observable.of(closeFeatureGrid()); @@ -306,7 +306,7 @@ export const closeFeatureInfoOnCatalogOpenEpic = (action$, store) => * Clean state on annotation open */ export const closeFeatureInfoOnAnnotationOpenEpic = (action$, {getState}) => - action$.ofType(TOGGLE_CONTROL) + action$.ofType(TOGGLE_CONTROL, SET_CONTROL_PROPERTY) .filter(({control} = {}) => control === 'annotations' && get(getState(), "controls.annotations.enabled", false)) .mapTo(purgeMapInfoResults()); /** diff --git a/web/client/epics/maplayout.js b/web/client/epics/maplayout.js index 1a3a6ff6cc..81f597ccab 100644 --- a/web/client/epics/maplayout.js +++ b/web/client/epics/maplayout.js @@ -109,7 +109,7 @@ export const updateMapLayoutEpic = (action$, store) => const leftPanels = head([ get(state, "controls.queryPanel.enabled") && {left: mapLayout.left.lg} || null, - get(state, "controls.annotations.enabled") && {left: mapLayout.left.sm} || null, + get(state, "controls.annotations.enabled") && {left: mapLayout.left.lg} || null, get(state, "controls.widgetBuilder.enabled") && {left: mapLayout.left.md} || null, get(state, "layers.settings.expanded") && {left: mapLayout.left.md} || null, get(state, "controls.drawer.enabled") && { left: resizedDrawer || mapLayout.left.sm} || null diff --git a/web/client/epics/measurement.js b/web/client/epics/measurement.js index c373ad2f00..faee4f562b 100644 --- a/web/client/epics/measurement.js +++ b/web/client/epics/measurement.js @@ -19,12 +19,10 @@ import { ADD_MEASURE_AS_ANNOTATION, ADD_AS_LAYER, SET_ANNOTATION_MEASUREMENT, - setMeasurementConfig, changeMeasurement, changeCoordinates } from '../actions/measurement'; -import {addLayer} from '../actions/layers'; -import {STYLE_TEXT} from '../utils/AnnotationsUtils'; +import { addLayer } from '../actions/layers'; import { setControlProperty, SET_CONTROL_PROPERTY, @@ -35,33 +33,42 @@ import {createControlEnabledSelector, measureSelector} from '../selectors/contro import {geomTypeSelector, isActiveSelector} from '../selectors/measurement'; import {CLICK_ON_MAP, registerEventListener, unRegisterEventListener} from '../actions/map'; import { - newAnnotation, - setEditingFeature, - cleanHighlight, - toggleVisibilityAnnotation -} from '../actions/annotations'; + editAnnotation, + mergeAnnotationsFeatures +} from '../plugins/Annotations/actions/annotations'; import {updateDockPanelsList} from "../actions/maplayout"; +import { getSelectedAnnotationLayer } from '../plugins/Annotations/selectors/annotations'; import {shutdownToolOnAnotherToolDrawing} from "../utils/ControlUtils"; +import { ANNOTATIONS } from '../plugins/Annotations/utils/AnnotationsUtils'; export const addAnnotationFromMeasureEpic = (action$, store) => action$.ofType(ADD_MEASURE_AS_ANNOTATION) - .switchMap((a) => { + .switchMap((action) => { // transform measure feature into geometry collection // add feature property to manage text annotation with value and uom - const {features, textLabels, uom, save, properties} = a; - const {id = uuidv1(), visibility = true} = properties || {}; - const newFeature = { - ...convertMeasuresToAnnotation(features, textLabels, uom, id, 'Annotations created from measurements', STYLE_TEXT), - newFeature: save, - visibility - }; - - return Rx.Observable.from([ - ...(createControlEnabledSelector('annotations')(store.getState()) ? [] : [setControlProperty('annotations', 'enabled', true)]), - newAnnotation(), - setMeasurementConfig("exportToAnnotation", false), - setEditingFeature(newFeature) - ]); + const { features, textLabels, uom, properties } = action; + const { id = uuidv1(), visibility = true } = properties || {}; + const annotation = convertMeasuresToAnnotation(features, textLabels, uom, id, 'Annotations created from measurements'); + const state = store.getState(); + const selected = getSelectedAnnotationLayer(state); + const commonActions = [ + changeMeasurement(null), + changeMeasurement('LineString') + ]; + if (selected && createControlEnabledSelector(ANNOTATIONS)(state)) { + return Rx.Observable.of( + ...commonActions, + mergeAnnotationsFeatures(selected.id, annotation) + ); + } + return Rx.Observable.of( + ...commonActions, + addLayer({ + ...annotation, + visibility + }), + editAnnotation(annotation.id) + ); }); export const addAsLayerEpic = (action$) => @@ -118,7 +125,7 @@ export const closeMeasureEpics = (action$, store) => area: 0, bearing: 0 }; - const actions = [changeMeasurement(newMeasureState), cleanHighlight(), unRegisterEventListener('click', 'measure')]; + const actions = [changeMeasurement(newMeasureState), unRegisterEventListener('click', 'measure')]; const {showCoordinateEditor} = store.getState()?.controls?.measure || {}; if (showCoordinateEditor) { @@ -129,12 +136,11 @@ export const closeMeasureEpics = (action$, store) => export const setMeasureStateFromAnnotationEpic = (action$, store) => action$.ofType(SET_ANNOTATION_MEASUREMENT) - .switchMap(({features, properties}) => { + .switchMap(({features}) => { const isGeomSelected = geomTypeSelector(store.getState()) === getGeomTypeSelected(features)?.[0]; return Rx.Observable.of( !isGeomSelected && changeMeasurement({geomType: getGeomTypeSelected(features)?.[0]}), setControlProperty("measure", "enabled", true), - setControlProperty("annotations", "enabled", false), - toggleVisibilityAnnotation(properties.id, false)); + setControlProperty("annotations", "enabled", false)); }); export const addCoordinatesEpic = (action$, {getState = () => {}}) => diff --git a/web/client/plugins/Annotations.jsx b/web/client/plugins/Annotations.jsx deleted file mode 100644 index 2425ffc7a1..0000000000 --- a/web/client/plugins/Annotations.jsx +++ /dev/null @@ -1,363 +0,0 @@ -/* - * Copyright 2017, GeoSolutions Sas. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. -*/ - -import React from 'react'; -import assign from 'object-assign'; -import PropTypes from 'prop-types'; -import { createSelector } from 'reselect'; -import isEmpty from 'lodash/isEmpty'; - -import { createPlugin, connect } from '../utils/PluginsUtils'; -import { on, toggleControl } from '../actions/controls'; -import AnnotationsEditorComp from '../components/mapcontrols/annotations/AnnotationsEditor'; -import AnnotationsComp from '../components/mapcontrols/annotations/Annotations'; -import annotationsReducer from '../reducers/annotations'; -import { - cancelRemoveAnnotation, - confirmRemoveAnnotation, - editAnnotation, - newAnnotation, - removeAnnotation, - cancelEditAnnotation, - saveAnnotation, - toggleAdd, - validationError, - removeAnnotationGeometry, - toggleStyle, - setStyle, - restoreStyle, - highlight, - cleanHighlight, - showAnnotation, - cancelShowAnnotation, - filterAnnotations, - closeAnnotations, - cancelCloseAnnotations, - confirmCloseAnnotations, - startDrawing, - setUnsavedChanges, - toggleUnsavedChangesModal, - changedProperties, - setUnsavedStyle, - toggleUnsavedStyleModal, - addText, - download, - loadAnnotations, - changeSelected, - resetCoordEditor, - changeRadius, - changeText, - toggleUnsavedGeometryModal, - addNewFeature, - setInvalidSelected, - highlightPoint, - confirmDeleteFeature, - toggleDeleteFtModal, - changeFormat, - openEditor, - updateSymbols, - setErrorSymbol, - toggleVisibilityAnnotation, - loadDefaultStyles, - changeGeometryTitle, - filterMarker, - toggleShowAgain, - hideMeasureWarning, - initPlugin, - geometryHighlight, - unSelectFeature, - validateFeature -} from '../actions/annotations'; - -import annotationsEpics from '../epics/annotations'; -import { selectFeatures } from '../actions/draw'; -import { setAnnotationMeasurement } from '../actions/measurement'; -import { zoomToExtent } from '../actions/map'; -import { annotationsInfoSelector, annotationsListSelector } from '../selectors/annotations'; -import { mapLayoutValuesSelector } from '../selectors/maplayout'; -import { ANNOTATIONS } from '../utils/AnnotationsUtils'; -import { registerRowViewer } from '../utils/MapInfoUtils'; -import ResponsivePanel from "../components/misc/panels/ResponsivePanel"; -import {Glyphicon, Tooltip} from "react-bootstrap"; -import Button from "../components/misc/Button"; -import OverlayTrigger from "../components/misc/OverlayTrigger"; -import Message from "../components/I18N/Message"; - -const commonEditorActions = { - onUpdateSymbols: updateSymbols, - onSetErrorSymbol: setErrorSymbol, - onEdit: editAnnotation, - onCancelEdit: cancelEditAnnotation, - onChangeFormat: changeFormat, - onConfirmDeleteFeature: confirmDeleteFeature, - onCleanHighlight: cleanHighlight, - onHighlightPoint: highlightPoint, - onHighlight: highlight, - onError: validationError, - onSave: saveAnnotation, - onRemove: removeAnnotation, - onAddGeometry: toggleAdd, - onAddText: addText, - onSetUnsavedChanges: setUnsavedChanges, - onSetUnsavedStyle: setUnsavedStyle, - onChangeProperties: changedProperties, - onToggleDeleteFtModal: toggleDeleteFtModal, - onToggleUnsavedChangesModal: toggleUnsavedChangesModal, - onToggleUnsavedGeometryModal: toggleUnsavedGeometryModal, - onToggleUnsavedStyleModal: toggleUnsavedStyleModal, - onAddNewFeature: addNewFeature, - onResetCoordEditor: resetCoordEditor, - onStyleGeometry: toggleStyle, - onCancelStyle: restoreStyle, - onChangeSelected: changeSelected, - onSaveStyle: toggleStyle, - onSetStyle: setStyle, - onStartDrawing: startDrawing, - onDeleteGeometry: removeAnnotationGeometry, - onZoom: zoomToExtent, - onSelectFeature: selectFeatures, - onChangeRadius: changeRadius, - onSetInvalidSelected: setInvalidSelected, - onChangeText: changeText, - onChangeGeometryTitle: changeGeometryTitle, - onCancelRemove: cancelRemoveAnnotation, - onCancelClose: cancelCloseAnnotations, - onConfirmClose: confirmCloseAnnotations, - onConfirmRemove: confirmRemoveAnnotation, - onDownload: download, - onFilterMarker: filterMarker, - onGeometryHighlight: geometryHighlight, - onSetAnnotationMeasurement: setAnnotationMeasurement, - onHideMeasureWarning: hideMeasureWarning, - onToggleShowAgain: toggleShowAgain, - onInitPlugin: initPlugin, - onUnSelectFeature: unSelectFeature, - onValidateFeature: validateFeature -}; -const AnnotationsEditor = connect(annotationsInfoSelector, - { - onCancel: cancelShowAnnotation, - ...commonEditorActions - })(AnnotationsEditorComp); - -const AnnotationsInfoViewer = connect(annotationsInfoSelector, - { - ...commonEditorActions, - onEdit: openEditor - })(AnnotationsEditorComp); - -const panelSelector = createSelector([annotationsListSelector], (list) => ({ - ...list, - editor: AnnotationsEditor -})); - -const Annotations = connect(panelSelector, { - onCancelRemove: cancelRemoveAnnotation, - onCancelStyle: restoreStyle, - onCancelEdit: cancelEditAnnotation, - onToggleUnsavedChangesModal: toggleUnsavedChangesModal, - onToggleUnsavedStyleModal: toggleUnsavedStyleModal, - onToggleUnsavedGeometryModal: toggleUnsavedGeometryModal, - onConfirmRemove: confirmRemoveAnnotation, - onToggleVisibility: toggleVisibilityAnnotation, - onCancelClose: cancelCloseAnnotations, - onConfirmClose: confirmCloseAnnotations, - onAdd: newAnnotation, - onEdit: editAnnotation, - onHighlight: highlight, - onCleanHighlight: cleanHighlight, - onDetail: showAnnotation, - onFilter: filterAnnotations, - onDownload: download, - onZoom: zoomToExtent, - onLoadAnnotations: loadAnnotations, - onLoadDefaultStyles: loadDefaultStyles -})(AnnotationsComp); - -class AnnotationsPanel extends React.Component { - static propTypes = { - id: PropTypes.string, - active: PropTypes.bool, - wrap: PropTypes.bool, - wrapWithPanel: PropTypes.bool, - panelStyle: PropTypes.object, - panelClassName: PropTypes.string, - toggleControl: PropTypes.func, - closeGlyph: PropTypes.string, - buttonStyle: PropTypes.object, - style: PropTypes.object, - dockProps: PropTypes.object, - dockStyle: PropTypes.object, - - // side panel properties - width: PropTypes.number - }; - - - static defaultProps = { - id: "mapstore-annotations-panel", - active: false, - wrap: false, - modal: true, - wrapWithPanel: false, - panelStyle: { - zIndex: 100, - overflow: "hidden", - height: "100%" - }, - panelClassName: "annotations-panel", - toggleControl: () => {}, - closeGlyph: "1-close", - - // side panel properties - width: 300, - dockProps: { - dimMode: "none", - position: "left", - zIndex: 1030 - }, - dockStyle: {} - }; - - componentDidMount() { - // register the viewer using the constant layer id of annotation - registerRowViewer(ANNOTATIONS, AnnotationsInfoViewer); - } - - componentWillUnmount() { - registerRowViewer(ANNOTATIONS, undefined); - } - - render() { - return this.props.active ? ( - <ResponsivePanel - containerId="annotations-panel" - className="ms-annotations-panel" - containerStyle={this.props.dockStyle} - hideHeader - style={this.props.dockStyle} - open={this.props.active} - size={this.props.width} - {...this.props.dockProps} - > - <Annotations {...this.props} width={this.props.width}/> - </ResponsivePanel> - ) : null; - } -} - -const conditionalToggle = on.bind(null, toggleControl('annotations', null), (state) => - !(state.controls && state.controls.annotations && state.controls.annotations.enabled && state.annotations && state.annotations.editing) -, closeAnnotations); - -/** - * Annotations Plugin. Implements annotations handling on maps. - * Adds: - * - a new vector layer, with id 'annotations', to show user created annotations on the map - * - a new menu in the BurgerMenu to handle current annotations - * - a custom template for Identify applied to annotations geometries that also allows editing {@link #components.mapControls.annotations.AnnotationsEditor} - * - styling of the annotation - * Annotations are geometries (currently only markers are supported) with a set of properties. By default a title and - * a description are managed, but you can configure a different set of fields, and other stuff in localConfig.json. - * Look at {@link #components.mapControls.annotations.AnnotationsConfig} for more documentation on configuration options - * @prop {object[]} lineDashOptions [{value: [line1 gap1 line2 gap2 line3...]}, {...}] defines how dashed lines are displayed. - * Use values without unit identifier. - * If an odd number of values is inserted then they are added again to reach an even number of values - * for more information see [this page](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray) - * @prop {string} defaultShape the default symbol used when switching for the symbol styler - * @prop {string} defaultShapeStrokeColor default symbol stroke color - * @prop {string} defaultShapeFillColor default symbol fill color - * @prop {string} defaultShapeSize default symbol shape size in px - * @prop {string} symbolsPath the relative path to the symbols folder where symbols.json and SVGs are located (starting from the index.html folder, i.e. the root) symbols.json can be structured like [this](https://github.com/geosolutions-it/MapStore2/blob/90fb33465fd3ff56c4bbaafb5ab0ed492826622c/web/client/product/assets/symbols/symbols.json) - * @prop {boolean} measurementAnnotationEdit flag for measurement specific annotation features. Enabling this will allow user to edit measurements saved as annotation - * @prop {boolean} geodesic draw geodesic annotation. By default geodesic is true (Currently applicable only for Circle annotation) - * @class Annotations - * @memberof plugins - * @static - * @example - * symbols.json present in symbolsPath folder is mandatory and it contains the list of symbols to be used in the Annotations Plugin - * - width and height of SVGs should be 64px - * - the name is related to the filename of the s symbol - * - the label is used in the symbol dropdown menu - * [ - * {"name": "filename", "label": "label"}, - * {"name": "square", "label": "Square"} - * ] - * - * Typical configuration of the plugin - * - * { - * "name": "Annotations", - * "cfg": { - * measurementAnnotationEdit: false, - * geodesic: true - * } - * } - */ - -const annotationsSelector = createSelector([ - state => (state.controls && state.controls.annotations && state.controls.annotations.enabled) || (state.annotations && state.annotations.closing) || false, - state => mapLayoutValuesSelector(state, {height: true}), - annotationsListSelector -], (active, dockStyle, list) => ({ - active, - dockStyle, - width: !isEmpty(list?.selected) ? 600 : 300 -})); - -const AnnotationsPlugin = connect(annotationsSelector, { - toggleControl: conditionalToggle -})(AnnotationsPanel); - -export default createPlugin('Annotations', { - component: assign(AnnotationsPlugin, { - disablePluginIf: "{state('mapType') === 'cesium' || state('mapType') === 'leaflet' }" - }), - containers: { - TOC: { - doNotHide: true, - name: "Annotations", - target: 'toolbar', - selector: () => true, - Component: connect(() => ({}), { - onClick: conditionalToggle - })(({onClick, layers, selectedLayers, status}) => { - if (status === 'DESELECT' && layers.filter(l => l.id === 'annotations').length === 0) { - return (<OverlayTrigger - key="annotations" - placement="top" - overlay={<Tooltip - id="legend-tooltip-annotations"><Message msgId="toc.addAnnotations"/></Tooltip>}> - <Button key="annotations" bsStyle={'primary'} className="square-button-md" - onClick={onClick}> - <Glyphicon glyph="comment"/> - </Button> - </OverlayTrigger>); - } - if (selectedLayers[0]?.id === 'annotations') { - return ( - <OverlayTrigger - key="annotations-edit" - placement="top" - overlay={<Tooltip - id="legend-tooltip-annotations-edit"><Message msgId="toc.editAnnotations"/></Tooltip>}> - <Button key="annotations" bsStyle={'primary'} className="square-button-md" - onClick={onClick}> - <Glyphicon glyph="pencil"/> - </Button> - </OverlayTrigger>); - } - return false; - }) - } - }, - reducers: { - annotations: annotationsReducer - }, - epics: annotationsEpics -}); diff --git a/web/client/plugins/__tests__/Annotations-test.jsx b/web/client/plugins/Annotations/__tests__/Annotations-test.jsx similarity index 59% rename from web/client/plugins/__tests__/Annotations-test.jsx rename to web/client/plugins/Annotations/__tests__/Annotations-test.jsx index bcdbb0c62a..722ce447bb 100644 --- a/web/client/plugins/__tests__/Annotations-test.jsx +++ b/web/client/plugins/Annotations/__tests__/Annotations-test.jsx @@ -9,8 +9,9 @@ import expect from 'expect'; import React from 'react'; import ReactDOM from 'react-dom'; -import AnnotationsPlugin from '../Annotations'; -import { getPluginForTest } from './pluginsTestUtils'; +import AnnotationsPlugin from '../index'; +import { createAnnotationId, ANNOTATIONS } from '../utils/AnnotationsUtils'; +import { getPluginForTest } from '../../__tests__/pluginsTestUtils'; describe('Annotations Plugin', () => { beforeEach((done) => { @@ -25,18 +26,27 @@ describe('Annotations Plugin', () => { }); it('creates a Annotations plugin', () => { + const id = createAnnotationId('1'); const { Plugin } = getPluginForTest(AnnotationsPlugin, { controls: { annotations: { enabled: true } + }, + layers: { + flat: [ + { + id, + rowViewer: ANNOTATIONS, + type: 'vector', + features: [] + } + ], + selected: [id] } }); - ReactDOM.render(<Plugin />, document.getElementById("container")); + ReactDOM.render(<Plugin />, document.getElementById('container')); const panel = document.querySelector('.ms-annotations-panel'); - expect(panel).toExist(); - // check the annotation panel has the classes that fits even with headers (for embedded or other, not full window size context) - expect(panel.className.split(" ")).toInclude("ms-side-panel"); - expect(panel.className.split(" ")).toInclude("ms-absolute-dock"); + expect(panel).toBeTruthy(); }); }); diff --git a/web/client/plugins/Annotations/actions/__tests__/annotations-test.js b/web/client/plugins/Annotations/actions/__tests__/annotations-test.js new file mode 100644 index 0000000000..c5d5b7ffb9 --- /dev/null +++ b/web/client/plugins/Annotations/actions/__tests__/annotations-test.js @@ -0,0 +1,94 @@ +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +import expect from 'expect'; +import { + EDIT_ANNOTATION, + DOWNLOAD, + LOAD_ANNOTATIONS, + NEW_ANNOTATION, + CLOSE_ANNOTATIONS, + CONFIRM_CLOSE_ANNOTATIONS, + CANCEL_CLOSE_ANNOTATIONS, + REMOVE_ANNOTATION, + STORE_ANNOTATIONS_SESSION, + MERGE_ANNOTATIONS_FEATURES, + SELECT_ANNOTATION_FEATURE, + editAnnotation, + download, + loadAnnotations, + newAnnotation, + closeAnnotations, + confirmCloseAnnotations, + cancelCloseAnnotations, + removeAnnotation, + storeAnnotationsSession, + mergeAnnotationsFeatures, + selectAnnotationFeature +} from '../annotations'; + +describe('annotations actions', () => { + it('edit annotation', () => { + const result = editAnnotation('1'); + expect(result.type).toBe(EDIT_ANNOTATION); + expect(result.id).toBe('1'); + }); + it('creates new annotation', () => { + const result = newAnnotation(); + expect(result.type).toBe(NEW_ANNOTATION); + }); + it('close annotations', () => { + const result = closeAnnotations(); + expect(result.type).toBe(CLOSE_ANNOTATIONS); + }); + it('load annotations', () => { + const result = loadAnnotations([]); + expect(result.type).toBe(LOAD_ANNOTATIONS); + expect(result.features).toBeTruthy(); + expect(result.override).toBe(false); + }); + it('download annotations', () => { + const result = download(); + expect(result.type).toBe(DOWNLOAD); + }); + it('confirm close annotations', () => { + const result = confirmCloseAnnotations({ id: 'annotations:1' }); + expect(result.type).toBe(CONFIRM_CLOSE_ANNOTATIONS); + expect(result.layer).toEqual({ id: 'annotations:1' }); + }); + it('cancel close annotations', () => { + const result = cancelCloseAnnotations(); + expect(result.type).toBe(CANCEL_CLOSE_ANNOTATIONS); + }); + it('remove annotations', () => { + const id = 'annotations:1'; + const result = removeAnnotation(id); + expect(result.type).toBe(REMOVE_ANNOTATION); + expect(result.id).toBe(id); + }); + it('store annotations session', () => { + const session = { features: [], style: { format: 'geostyler', body: { name: '', rules: [] } } }; + const result = storeAnnotationsSession(session); + expect(result.type).toBe(STORE_ANNOTATIONS_SESSION); + expect(result.session).toEqual(session); + }); + it('merge annotations features', () => { + const id = 'annotations:1'; + const annotation = { id: 'annotations:2', features: [], style: { format: 'geostyler', body: { name: '', rules: [] } } }; + const result = mergeAnnotationsFeatures(id, annotation); + expect(result.type).toBe(MERGE_ANNOTATIONS_FEATURES); + expect(result.id).toBe(id); + expect(result.annotation).toEqual(annotation); + }); + it('select annotation feature', () => { + const id = 'feature-1'; + const result = selectAnnotationFeature(id); + expect(result.type).toBe(SELECT_ANNOTATION_FEATURE); + expect(result.id).toBe(id); + }); +}); diff --git a/web/client/plugins/Annotations/actions/annotations.js b/web/client/plugins/Annotations/actions/annotations.js new file mode 100644 index 0000000000..12fdbad889 --- /dev/null +++ b/web/client/plugins/Annotations/actions/annotations.js @@ -0,0 +1,135 @@ +/* + * Copyright 2018, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ +export const EDIT_ANNOTATION = 'ANNOTATIONS:EDIT'; +export const DOWNLOAD = 'ANNOTATIONS:DOWNLOAD'; +export const LOAD_ANNOTATIONS = 'ANNOTATIONS:LOAD_ANNOTATIONS'; +export const NEW_ANNOTATION = 'ANNOTATIONS:NEW'; +export const CLOSE_ANNOTATIONS = 'ANNOTATIONS:CLOSE'; +export const CONFIRM_CLOSE_ANNOTATIONS = 'ANNOTATIONS:CONFIRM_CLOSE'; +export const CANCEL_CLOSE_ANNOTATIONS = 'ANNOTATIONS:CANCEL_CLOSE'; +export const REMOVE_ANNOTATION = 'ANNOTATIONS:REMOVE'; +export const STORE_ANNOTATIONS_SESSION = 'ANNOTATIONS:STORE_SESSION'; +export const MERGE_ANNOTATIONS_FEATURES = 'ANNOTATIONS:MERGE_FEATURES'; +export const SELECT_ANNOTATION_FEATURE = 'ANNOTATIONS:SELECT_FEATURE'; +/** + * Enable the tools to edit an annotation layer + * @param {string} id identifier of the annotation to edit + * @return {object} of type `EDIT_ANNOTATION` with id + */ +export const editAnnotation = (id) => ({ + type: EDIT_ANNOTATION, + id +}); +/** + * Download an array of annotations layers + * @param {array} annotations an array of annotations layers + * @return {object} of type `DOWNLOAD` with annotations + */ +export const download = (annotations) => { + return { + type: DOWNLOAD, + annotations + }; +}; +/** + * Loads new annotation in map + * @param {array} features list of annotations layers + * @param {boolean} override if true remove existing annotations + * @return {object} of type `LOAD_ANNOTATIONS` with features and override + */ +export const loadAnnotations = (features, override = false) => { + return { + type: LOAD_ANNOTATIONS, + features, + override + }; +}; +/** + * Creates a new annotations layer + * @return {object} of type `NEW_ANNOTATION` + */ +export const newAnnotation = () => { + return { + type: NEW_ANNOTATION + }; +}; +/** + * Close annotations panel + * @return {object} of type `CLOSE_ANNOTATIONS` + */ +export const closeAnnotations = () => { + return { + type: CLOSE_ANNOTATIONS + }; +}; +/** + * Confirm closing of annotation panel + * @param {object} layer annotation layer + * @return {object} of type `CONFIRM_CLOSE_ANNOTATIONS` and layer + */ +export const confirmCloseAnnotations = (layer) => { + return { + type: CONFIRM_CLOSE_ANNOTATIONS, + layer + }; +}; +/** + * Cancel closing of annotation panel + * @return {object} of type `CANCEL_CLOSE_ANNOTATIONS` + */ +export const cancelCloseAnnotations = () => { + return { + type: CANCEL_CLOSE_ANNOTATIONS + }; +}; +/** + * Remove an annotations layer using the id + * @param {string} id + * @return {object} of type `REMOVE_ANNOTATION` with id + */ +export const removeAnnotation = (id) => { + return { + type: REMOVE_ANNOTATION, + id + }; +}; +/** + * Store the current editing state of the annotation panel in state + * @param {object} session the present state of editing + * @return {object} of type `STORE_ANNOTATIONS_SESSION` with session + */ +export const storeAnnotationsSession = (session) => { + return { + type: STORE_ANNOTATIONS_SESSION, + session + }; +}; +/** + * Merge an annotation layer to another + * @param {string} id annotation layer to target + * @param {object} annotation features and style to merge + * @return {object} of type `MERGE_ANNOTATIONS_FEATURES` with id and annotation + */ +export const mergeAnnotationsFeatures = (id, annotation) => { + return { + type: MERGE_ANNOTATIONS_FEATURES, + id, + annotation + }; +}; +/** + * Select a feature identifier of a annotation + * @param {string} id identifier of the selected feature + * @return {object} of type `SELECT_ANNOTATION_FEATURE` with id + */ +export const selectAnnotationFeature = (id) => { + return { + type: SELECT_ANNOTATION_FEATURE, + id + }; +}; diff --git a/web/client/plugins/Annotations/components/AnnotationsFields.jsx b/web/client/plugins/Annotations/components/AnnotationsFields.jsx new file mode 100644 index 0000000000..f61398f768 --- /dev/null +++ b/web/client/plugins/Annotations/components/AnnotationsFields.jsx @@ -0,0 +1,121 @@ +/* + * Copyright 2017, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. +*/ + +import React, { useState } from 'react'; +import isFunction from 'lodash/isFunction'; +import { FormGroup, FormControl, ControlLabel, HelpBlock } from "react-bootstrap"; +import Message from '../../../components/I18N/Message'; +import { htmlToDraftJSEditorState, draftJSEditorStateToHtml } from '../../../utils/EditorUtils'; +import withDebounceOnCallback from '../../../components/misc/enhancers/withDebounceOnCallback'; +import CompactRichTextEditor from '../../../components/mapviews/settings/CompactRichTextEditor'; + +const DescriptionEditor = withDebounceOnCallback('onEditorStateChange', 'editorState')(CompactRichTextEditor); + +function AnnotationsFields({ + preview, + properties = {}, + fields = [ + { + name: 'title', + type: 'text', + validator: (val) => val, + validateError: 'annotations.mandatory', + showLabel: true, + editable: true + }, + { + name: 'description', + type: 'html', + showLabel: true, + editable: true + } + ], + onChange = () => {} +}) { + const [editorState, setEditorState] = useState(fields.filter(field => field.type === 'html').reduce((acc, field) => ({ ...acc, [field.name]: htmlToDraftJSEditorState(properties[field.name] || '') }), {})); + + if (preview) { + return (<div className="ms-annotations-fields preview"> + {fields.map((field) => { + const showLabel = field.showLabel; + return ( + <div key={field.name} className="ms-annotations-field"> + {showLabel && <div className="ms-annotations-field-label"> + <Message msgId={`annotations.field.${field.name}`} /> + </div>} + <div className="ms-annotations-field-value" dangerouslySetInnerHTML={{ __html: properties[field.name] }} /> + </div> + ); + })} + </div>); + } + + return ( + <form className="ms-annotations-fields"> + {fields.map((field) => { + const validator = isFunction(field.validator) ? field.validator : null; + const isValid = validator && validator(properties[field.name]); + const validateError = field.validateError || 'annotations.mandatory'; + const showLabel = field.showLabel; + const isEditable = field.editable; + if (field.type === 'text') { + return ( + <FormGroup + key={field.name} + controlId={`annotations-${field.name}`} + validationState={validator ? isValid ? 'success' : 'error' : null} + > + {showLabel && <ControlLabel> + <Message msgId={`annotations.field.${field.name}`} /> + </ControlLabel>} + <FormControl + disabled={!isEditable} + type="text" + value={properties[field.name]} + onChange={(event) => onChange({ + [field.name]: event.target.value + })} + /> + {validator && !isValid && <HelpBlock><Message msgId={validateError} /></HelpBlock>} + </FormGroup> + ); + } + if (field.type === 'html') { + return ( + <FormGroup + key={field.name} + controlId={`annotations-${field.name}`} + validationState={validator ? isValid ? 'success' : 'error' : null} + > + {showLabel && <ControlLabel> + <Message msgId={`annotations.field.${field.name}`} /> + </ControlLabel>} + {isEditable + ? <DescriptionEditor + editorState={editorState[field.name]} + onEditorStateChange={(newEditorState) => { + const previousHTML = draftJSEditorStateToHtml(editorState[field.name]); + const newHTML = draftJSEditorStateToHtml(newEditorState); + if (newHTML !== previousHTML) { + onChange({ [field.name]: draftJSEditorStateToHtml(newEditorState) }); + setEditorState((prevEditorState) => ({ ...prevEditorState, [field.name]: newEditorState })); + } + }} + /> + : <div dangerouslySetInnerHTML={{ __html: properties[field.name] }} />} + {validator && !isValid && <HelpBlock><Message msgId={validateError} /></HelpBlock>} + </FormGroup> + ); + } + return null; + })} + </form> + ); +} + +export default AnnotationsFields; diff --git a/web/client/plugins/Annotations/components/FeaturesEditor.jsx b/web/client/plugins/Annotations/components/FeaturesEditor.jsx new file mode 100644 index 0000000000..eb6838b95c --- /dev/null +++ b/web/client/plugins/Annotations/components/FeaturesEditor.jsx @@ -0,0 +1,544 @@ + +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. +*/ + +import React, { useReducer, useEffect } from 'react'; +import { Glyphicon, ButtonGroup, Nav, NavItem, FormGroup, ControlLabel, FormControl } from "react-bootstrap"; +import uuid from 'uuid/v1'; +import undoable from 'redux-undo'; +import bbox from '@turf/bbox'; +import identity from 'lodash/identity'; +import RulesEditor from '../../../components/styleeditor/RulesEditor'; +import { MapLibraries } from '../../../utils/MapTypeUtils'; +import MSButton from '../../../components/misc/Button'; +import tooltip from '../../../components/misc/enhancers/tooltip'; +import { + ANNOTATIONS, + annotationsSymbolizerDefaultProperties, + createDefaultStyleSymbolizer, + validateFeature, + applyDefaultCoordinates, + parseUpdatedCoordinates, + getFeatureIcon +} from '../utils/AnnotationsUtils'; +import { computeFeatureMeasurement } from '../../../utils/MeasurementUtils'; +import GeometryEditor from './GeometryEditor'; +import Message from '../../../components/I18N/Message'; +import getBlocks from '../../../components/styleeditor/config/blocks'; +import { injectIntl } from 'react-intl'; + +const Button = tooltip(MSButton); + +const UPDATE_ANNOTATIONS_FEATURES = 'UPDATE_ANNOTATIONS_FEATURES'; +const UNDO_ANNOTATIONS_FEATURES = 'UNDO_ANNOTATIONS_FEATURES'; +const REDO_ANNOTATIONS_FEATURES = 'REDO_ANNOTATIONS_FEATURES'; + +const handlers = { + [UPDATE_ANNOTATIONS_FEATURES]: (state, callback) => callback(state) +}; + +const reducer = (state, action) => { + return (handlers[action.type] || identity)(state, action.callback); +}; + +const historyCollectionReducer = undoable(reducer, { + limit: 20, + undoType: UNDO_ANNOTATIONS_FEATURES, + redoType: REDO_ANNOTATIONS_FEATURES, + jumpType: '', + jumpToPastType: '', + jumpToFutureType: '', + clearHistoryType: '' +}); + +const DEFAULT_VALUE = {}; + +function parseBlocks({ symbolizerBlock, ruleBlock }) { + return { + symbolizerBlock: Object.keys(symbolizerBlock) + .reduce((config, kind) => ({ + ...config, + [kind]: { + ...symbolizerBlock[kind], + defaultProperties: annotationsSymbolizerDefaultProperties[kind] || symbolizerBlock[kind].defaultProperties, + params: Object.keys(symbolizerBlock[kind].params) + .reduce((acc, key) => { + const value = symbolizerBlock[kind].params[key]; + if (['Circle'].includes(kind) && ['geodesic', 'radius', 'msClampToGround'].includes(key)) { + return acc; + } + if (['Text'].includes(kind) && ['label'].includes(key)) { + return acc; + } + if (['Line', 'Fill'].includes(kind) && ['msGeometry'].includes(key)) { + return acc; + } + return { + ...acc, + [key]: value + }; + }, {}) + } + }), {}), + ruleBlock + }; +} + +export function FeaturesEditor({ + selectedId, + value, + mapType, + map, + maxZoom = 18, + onSelect = () => {}, + onChange = () => {}, + onZoomTo = () => {}, + onHighlight = () => {}, + projection, + intl = {}, + mapInteractionsSupport, + coordinatesFormat, + onChangeCoordinatesFormat = () => {}, + tab = 'coordinates', + onSelectTab = () => {}, + svgSymbolsPath, + lineDashOptions, + enable3dStyleOptions, + geometryEditorOptions, + defaultTextLabel, + defaultSymbolizers, + geodesic, + fonts = [ + 'Arial', + 'Verdana', + 'Helvetica', + 'Tahoma', + 'Trebuchet MS', + 'Times New Roman', + 'Georgia', + 'Garamond', + 'Courier New', + 'Brush Script MT' + ] +}) { + const [collectionHistory, dispatch] = useReducer(historyCollectionReducer, { present: value, past: [], future: [] }); + const collection = collectionHistory?.present || collectionHistory || DEFAULT_VALUE; + const selected = (collection?.features || []).find((feature) => feature?.id === selectedId); + const { symbolizerBlock, ruleBlock } = parseBlocks(getBlocks({ + exactMatchGeometrySymbol: true, + enable3dStyleOptions + })); + + const MapInteractionsSupport = mapInteractionsSupport; + + useEffect(() => { + const validFeatures = (collectionHistory?.present?.features || []).filter(validateFeature); + const invalidFeatures = (collectionHistory?.present?.features || []).filter((feature) => !validateFeature(feature)); + const validFeaturesIds = validFeatures.map(feature => feature.id); + onChange({ + ...collectionHistory?.present, + features: validFeatures, + style: { + ...collectionHistory?.present?.style, + format: 'geostyler', + body: { + ...collectionHistory?.present?.style?.body, + rules: (collectionHistory?.present?.style?.body?.rules || []) + .filter(({ filter }) => validFeaturesIds.includes(filter?.[2])) + } + }, + invalidFeatures: invalidFeatures?.length > 0 ? invalidFeatures : null + }, validateFeature(selected) ? selected : null, collectionHistory?.present); + }, [collectionHistory?.present]); + + function handleOnChange(getNewValue) { + dispatch({ + type: UPDATE_ANNOTATIONS_FEATURES, + callback: (prevCollection) => { + const newValue = getNewValue(prevCollection); + return newValue; + } + }); + } + + function handleAddFeature(type, properties) { + const id = uuid(); + handleOnChange((prevCollection) => { + const newFeature = { + type: 'Feature', + id, + properties: { + ...properties, + id, + name: type, + annotationType: type + }, + geometry: null + }; + return { + ...prevCollection, + features: [ + ...(prevCollection?.features || []), + newFeature + ], + style: { + ...prevCollection?.style, + format: 'geostyler', + body: { + ...prevCollection?.style?.body, + rules: [ + ...(prevCollection?.style?.body?.rules || []), + { + name: '', + filter: ['==', 'id', id], + mandatory: type !== 'Point', + ruleId: uuid(), + symbolizers: [{ + symbolizerId: uuid(), + ...createDefaultStyleSymbolizer(newFeature, defaultSymbolizers) + }] + } + ] + } + } + }; + }); + onSelect(id); + } + + function computeMeasurement(newFeature) { + if (newFeature?.properties?.measureType) { + return computeFeatureMeasurement(newFeature, { + formatNumber: intl?.formatNumber ? intl.formatNumber : n => n + }); + } + return [newFeature]; + } + + function handleUpdateFeatureById(id, updatedFeature, geometryUpdated) { + handleOnChange((prevCollection) => ({ + ...prevCollection, + features: (prevCollection?.features || []) + .filter((feature) => !geometryUpdated ? true : feature?.properties?.measureId !== id) + .reduce((acc, feature) => [ ...acc, ...(feature?.id !== id + ? [feature] + : geometryUpdated + ? computeMeasurement(updatedFeature) + : [updatedFeature])], []) + })); + } + + function handleRemoveFeature(id) { + handleOnChange((prevCollection) => ({ + ...prevCollection, + features: (prevCollection?.features || []) + .filter(feature => feature?.id !== id && feature?.properties?.measureId !== id) + })); + } + + function handleUpdateCoordinates(coordinates) { + dispatch({ + type: UPDATE_ANNOTATIONS_FEATURES, + callback: (prevCollection) => { + const newCollection = { + ...prevCollection, + features: (prevCollection.features || []) + .filter((feature) => feature?.properties?.measureId !== selectedId) + .reduce((acc, feature) => { + if (feature?.id !== selectedId) { + return [...acc, feature]; + } + const updatedFeature = applyDefaultCoordinates(feature); + const newFeature = { + ...feature, + geometry: { + ...updatedFeature?.geometry, + coordinates: parseUpdatedCoordinates(updatedFeature?.geometry?.type, coordinates) + } + }; + return [ + ...acc, + ...(validateFeature(newFeature) + ? computeMeasurement(newFeature) + : [newFeature]) + ]; + }, []) + }; + return newCollection; + } + }); + } + + function getFeatureStyle() { + const { body } = collection?.style || {}; + const { rules = [] } = body || {}; + const featureStyleRules = rules.filter((rule) => rule?.filter?.[2] === selected?.properties?.id); + return { + name: 'selected feature style', + rules: featureStyleRules + }; + } + + function handleUpdateStyle(rules) { + handleOnChange((prevCollection) => { + const style = prevCollection?.style; + const newRules = (prevCollection.features || []).reduce((acc, feature) => { + if (feature.id === selected.id) { + return [...acc, ...rules.map((rule) => ({ ...rule, filter: rule.filter || ['==', 'id', selected.properties.id] }))]; + } + const featureRules = (style?.body?.rules || []).filter((rule) => rule?.filter?.[2] === feature?.properties?.id); + return [...acc, ...featureRules]; + }, []); + const newStyle = { + ...style, + format: 'geostyler', + body: { + ...style?.body, + rules: newRules + } + }; + return { + ...prevCollection, + style: newStyle + }; + }); + } + + const annotationsFeatures = (collection?.features || []).filter(feature => feature?.properties?.annotationType); + + return ( + <div className="ms-features-editor"> + <div className="ms-features-editor-list"> + <div className="ms-features-editor-list-header"> + <ButtonGroup> + <Button + className="square-button-md no-border" + onClick={() => { + dispatch({ type: UNDO_ANNOTATIONS_FEATURES }); + }} + disabled={(collectionHistory?.past?.length || 0) === 0} + > + <Glyphicon glyph="undo"/> + </Button> + <Button + className="square-button-md no-border" + onClick={() => { + dispatch({ type: REDO_ANNOTATIONS_FEATURES }); + }} + disabled={(collectionHistory?.future?.length || 0) === 0} + > + <Glyphicon glyph="redo"/> + </Button> + </ButtonGroup> + <ButtonGroup> + <Button tooltipId="annotations.titles.marker" className="square-button-md no-border" onClick={() => handleAddFeature('Point')}> + <Glyphicon glyph="point-plus"/> + </Button> + <Button tooltipId="annotations.titles.line" className="square-button-md no-border" onClick={() => handleAddFeature('LineString')}> + <Glyphicon glyph="polyline-plus"/> + </Button> + <Button tooltipId="annotations.titles.polygon" className="square-button-md no-border" onClick={() => handleAddFeature('Polygon')}> + <Glyphicon glyph="polygon-plus"/> + </Button> + <Button tooltipId="annotations.titles.text" className="square-button-md no-border" onClick={() => handleAddFeature('Text', { label: defaultTextLabel || '' })}> + <Glyphicon glyph="font-add"/> + </Button> + <Button tooltipId="annotations.titles.circle" className="square-button-md no-border" onClick={() => handleAddFeature('Circle', { geodesic: !!geodesic?.Circle })}> + <Glyphicon glyph="1-circle-add"/> + </Button> + </ButtonGroup> + </div> + {!collection?.features?.length && <div className="ms-features-editor-list-empty"><Message msgId="annotations.addGeometry"/></div>} + <ul className="ms-features-editor-list-body"> + {annotationsFeatures.map((feature) => { + const id = feature?.id; + const isSelected = selectedId === id; + return ( + <li + key={id} + onClick={() => isSelected + ? () => {} + : onSelect(id, validateFeature(feature) ? feature : null)} + className={`ms-features-editor-item ${isSelected ? ' selected' : ''}`} + onMouseEnter={() => { + if (selectedId !== id && validateFeature(feature)) { + onHighlight('feature', feature); + } + }} + onMouseLeave={() => { + onHighlight('feature', null); + }} + > + <div><Glyphicon glyph={getFeatureIcon(feature)}/></div> + <div style={{ flex: 1 }}> + <input + value={feature?.properties?.name} + type="text" + onChange={(event) => handleUpdateFeatureById(id, { + ...feature, + properties: { + ...feature?.properties, + name: event.target.value + } + })} /> + </div> + <Glyphicon glyph={validateFeature(feature) ? 'ok-sign text-success' : 'exclamation-mark text-danger'}/> + <ButtonGroup> + <Button + disabled={!validateFeature(feature)} + bsStyle={isSelected ? 'primary' : 'default'} + className="square-button-md" + tooltipId="annotations.zoomToGeometry" + onClick={(event) => { + event.stopPropagation(); + onZoomTo(bbox(feature), 'EPSG:4326', maxZoom); + }}> + <Glyphicon glyph="zoom-to" /> + </Button> + <Button + className="square-button-md" + bsStyle={isSelected ? 'primary' : 'default'} + tooltipId="annotations.removeGeometry" + onClick={(event) => { event.stopPropagation(); handleRemoveFeature(id); }} + > + <Glyphicon glyph="trash" /> + </Button> + </ButtonGroup> + </li> + ); + })} + </ul> + </div> + {!selected && <div className="ms-features-editor-tools-empty"> + <div> + <Glyphicon glyph="comment" /> + <div><Message msgId="annotations.selectAnnotationFeature"/></div> + </div> + </div>} + {selected && <div className="ms-features-editor-tools"> + <Nav bsStyle="tabs" activeKey={tab}> + <NavItem + key="coordinates" + eventKey="coordinates" + onClick={() => onSelectTab('coordinates', selected)}> + <Message msgId="annotations.tabCoordinates"/> + </NavItem> + <NavItem + key="style" + eventKey="style" + onClick={() => onSelectTab('style', selected)}> + <Message msgId="annotations.tabStyle"/> + </NavItem> + </Nav> + <div className="ms-features-editor-tools-body" > + {tab === 'coordinates' && + <> + <GeometryEditor + key={selected.id} + enableHeightField={mapType === MapLibraries.CESIUM && !selected?.properties?.geodesic} + format={coordinatesFormat} + onChangeFormat={onChangeCoordinatesFormat} + mapProjection={projection} + options={geometryEditorOptions} + onHighlightPoint={(point) => { + onHighlight('coordinate', point && { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [point.lon, point.lat] + }, + properties: {} + }); + }} + onChangeRadius={(radius) => { + handleUpdateFeatureById(selected?.id, { + ...selected, + properties: { + ...selected?.properties, + radius + } + }); + }} + selected={{ + ...applyDefaultCoordinates(selected), + properties: { + ...selected?.properties, + // the internal validation of GeometryEditor expects valueText as property + valueText: selected?.properties?.label + } + }} + featureType={selected?.properties?.annotationType} + renderer={ANNOTATIONS} + onChange={handleUpdateCoordinates} + onSetInvalidSelected={(type, _value) => { + if (type === 'coords') { + handleUpdateCoordinates(_value); + } + }} + /> + {selected?.properties?.annotationType === 'Text' && ( + <FormGroup + className="ms-annotations-label-input" + key="label" + controlId={'ms-annotations-label-input'} + validationState={!!selected?.properties?.label ? undefined : 'error'} + > + <ControlLabel> + <Message msgId="annotations.titles.text" /> + </ControlLabel> + <FormControl + type="text" + value={selected?.properties?.label || ''} + onChange={(event) => handleUpdateFeatureById(selected?.id, { + ...selected, + properties: { + ...selected?.properties, + label: event.target.value + } + })} + /> + </FormGroup> + )} + </>} + {tab === 'style' && <div> + <RulesEditor + ruleBlock={ruleBlock} + symbolizerBlock={symbolizerBlock} + config={{ + geometryType: `annotation-${selected?.properties?.annotationType?.toLowerCase()}`, + simple: true, + fonts, + svgSymbolsPath, + lineDashOptions + }} + // reverse rules order to show top rendered style + // as first item of the list + rules={getFeatureStyle()?.rules && [...getFeatureStyle().rules].reverse()} + // changes synchronous updated + // reverse the rules to their original order + onChange={newRules => handleUpdateStyle([...newRules].reverse())} + /> + </div>} + </div> + </div>} + {MapInteractionsSupport && <MapInteractionsSupport + key={selected?.id} + active={!!selected && tab === 'coordinates'} + map={map} + mapType={mapType} + feature={selected} + geodesic={geodesic} + onChange={(newFeature) => { + handleUpdateFeatureById(selected.id, newFeature, true); + }} + />} + </div> + ); +} + +export default injectIntl(FeaturesEditor); diff --git a/web/client/components/mapcontrols/annotations/GeometryEditor.jsx b/web/client/plugins/Annotations/components/GeometryEditor.jsx similarity index 85% rename from web/client/components/mapcontrols/annotations/GeometryEditor.jsx rename to web/client/plugins/Annotations/components/GeometryEditor.jsx index cf35cacf36..01c0465f94 100644 --- a/web/client/components/mapcontrols/annotations/GeometryEditor.jsx +++ b/web/client/plugins/Annotations/components/GeometryEditor.jsx @@ -9,8 +9,8 @@ import React from 'react'; import PropTypes from 'prop-types'; -import CoordinatesEditor from './CoordinatesEditor'; -import { getComponents } from '../../../utils/AnnotationsUtils'; +import CoordinatesEditor from '../../../components/mapcontrols/annotations/CoordinatesEditor'; +import { getComponents } from '../utils/AnnotationsUtils'; class GeometryEditor extends React.Component { static propTypes = { @@ -31,7 +31,8 @@ class GeometryEditor extends React.Component { aeronauticalOptions: PropTypes.object, onChangeText: PropTypes.func, renderer: PropTypes.string, - onValidateFeature: PropTypes.func + onValidateFeature: PropTypes.func, + enableHeightField: PropTypes.bool }; static defaultProps = { @@ -51,7 +52,8 @@ class GeometryEditor extends React.Component { transitionEnterTimeout: 300, transitionLeaveTimeout: 300 }, - onValidateFeature: () => {} + onValidateFeature: () => {}, + enableHeightField: false }; render() { @@ -59,6 +61,7 @@ class GeometryEditor extends React.Component { {...this.props.options} items={[]} isDraggable + enableHeightField={this.props.enableHeightField} type={this.props.featureType} components={this.props.selected && this.props.selected.geometry && this.props.selected.geometry.coordinates && this.props.selected.geometry.coordinates.length ? getComponents(this.props.selected.geometry) : []} properties={this.props.selected && this.props.selected.properties || {}} @@ -74,7 +77,7 @@ class GeometryEditor extends React.Component { renderer={this.props.renderer} onValidateFeature={this.props.onValidateFeature} onChange={(components, radius, text, crs) => { - let coords = components.map(c => [c.lon, c.lat]); + let coords = components.map(c => [c.lon, c.lat, ...(c.height !== undefined ? [c.height] : [])]); this.props.onChange(coords, radius, text, crs); this.props.onValidateFeature(); }}/>); diff --git a/web/client/plugins/Annotations/components/__tests__/AnnotationsFields-test.jsx b/web/client/plugins/Annotations/components/__tests__/AnnotationsFields-test.jsx new file mode 100644 index 0000000000..db6d09da05 --- /dev/null +++ b/web/client/plugins/Annotations/components/__tests__/AnnotationsFields-test.jsx @@ -0,0 +1,85 @@ +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import ReactDOM from 'react-dom'; +import AnnotationsFields from '../AnnotationsFields'; +import expect from 'expect'; +import { Simulate } from 'react-dom/test-utils'; + +describe('AnnotationsFields component', () => { + beforeEach((done) => { + document.body.innerHTML = '<div id="container"></div>'; + setTimeout(done); + }); + afterEach((done) => { + ReactDOM.unmountComponentAtNode(document.getElementById("container")); + document.body.innerHTML = ''; + setTimeout(done); + }); + it('should render with default', () => { + ReactDOM.render(<AnnotationsFields />, document.getElementById("container")); + const fieldsNode = document.querySelector('.ms-annotations-fields'); + expect(fieldsNode).toBeTruthy(); + }); + it('should render with preview', () => { + ReactDOM.render(<AnnotationsFields preview properties={{ title: 'Title', description: '<p>Description</p>' }} />, document.getElementById("container")); + const fieldsNode = document.querySelector('.ms-annotations-fields.preview'); + expect(fieldsNode).toBeTruthy(); + const field = [...fieldsNode.querySelectorAll('.ms-annotations-field')]; + expect(field.length).toBe(2); + expect(field.map((node) => node.querySelector('.ms-annotations-field-value').innerHTML)).toEqual([ 'Title', '<p>Description</p>' ]); + }); + it('should trigger on change', (done) => { + ReactDOM.render(<AnnotationsFields + onChange={(options) => { + try { + expect(options).toEqual({ title: 'Title ' }); + } catch (e) { + done(e); + } + done(); + }} + properties={{ title: 'Title', description: '<p>Description</p>' }} + />, document.getElementById("container")); + const fieldsNode = document.querySelector('.ms-annotations-fields'); + expect(fieldsNode).toBeTruthy(); + const input = [...fieldsNode.querySelectorAll('.form-control')]; + expect(input.length).toBe(1); + Simulate.change(input[0], { target: { value: 'Title ' } }); + }); + it('should use custom fields', (done) => { + ReactDOM.render(<AnnotationsFields + fields={[{ + name: 'myattribute', + type: 'text', + editable: true, + showLabel: true, + validator: (value = '') => !value.includes('fake'), + validateError: 'annotations.error.fake' + }]} + onChange={(options) => { + try { + expect(options).toEqual({ myattribute: 'Ok' }); + } catch (e) { + done(e); + } + done(); + }} + properties={{ myattribute: 'fake' }} + />, document.getElementById("container")); + const fieldsNode = document.querySelector('.ms-annotations-fields'); + expect(fieldsNode).toBeTruthy(); + const input = [...fieldsNode.querySelectorAll('.form-control')]; + expect(input.length).toBe(1); + expect(input[0].value).toBe('fake'); + expect(fieldsNode.querySelector('.control-label').innerText).toBe('annotations.field.myattribute'); + expect(fieldsNode.querySelector('.help-block').innerText).toBe('annotations.error.fake'); + Simulate.change(input[0], { target: { value: 'Ok' } }); + }); +}); diff --git a/web/client/plugins/Annotations/components/__tests__/FeaturesEditor-test.jsx b/web/client/plugins/Annotations/components/__tests__/FeaturesEditor-test.jsx new file mode 100644 index 0000000000..a36f0da74e --- /dev/null +++ b/web/client/plugins/Annotations/components/__tests__/FeaturesEditor-test.jsx @@ -0,0 +1,219 @@ +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import ReactDOM from 'react-dom'; +import expect from 'expect'; +import { Simulate } from 'react-dom/test-utils'; +import { DragDropContext as dragDropContext } from 'react-dnd'; +import testBackend from 'react-dnd-test-backend'; +import { FeaturesEditor as FeaturesEditorCmp } from '../FeaturesEditor'; + + +const FeaturesEditor = dragDropContext(testBackend)(FeaturesEditorCmp); + +describe('FeaturesEditor component', () => { + beforeEach((done) => { + document.body.innerHTML = '<div id="container"></div>'; + setTimeout(done); + }); + afterEach((done) => { + ReactDOM.unmountComponentAtNode(document.getElementById("container")); + document.body.innerHTML = ''; + setTimeout(done); + }); + it('should render with default', () => { + ReactDOM.render(<FeaturesEditor />, document.getElementById("container")); + const editorNode = document.querySelector('.ms-features-editor'); + expect(editorNode).toBeTruthy(); + }); + it('should show list of valid features', () => { + ReactDOM.render(<FeaturesEditor + value={{ + features: [ + { + id: 'feature-01', + type: 'Feature', + geometry: { type: 'Point', coordinates: [0, 0] }, + properties: { name: 'Point', annotationType: 'Point', id: 'feature-01' } + }, + { + id: 'feature-02', + type: 'Feature', + geometry: { type: 'Point', coordinates: [0, 0] }, + properties: { name: 'Circle', annotationType: 'Circle', id: 'feature-02', radius: 100 } + }, + { + id: 'feature-03', + type: 'Feature', + geometry: { type: 'Point', coordinates: [0, 0] }, + properties: { name: 'Text', annotationType: 'Text', id: 'feature-03', label: 'New' } + }, + { + id: 'feature-04', + type: 'Feature', + geometry: { type: 'LineString', coordinates: [[0, 0], [1, 1]] }, + properties: { name: 'LineString', annotationType: 'LineString', id: 'feature-04' } + }, + { + id: 'feature-05', + type: 'Feature', + geometry: { type: 'Polygon', coordinates: [[[0, 0], [1, 1], [0, 1], [0, 0]]] }, + properties: { name: 'Polygon', annotationType: 'Polygon', id: 'feature-05' } + }, + { + id: 'feature-06', + type: 'Feature', + geometry: { type: 'LineString', coordinates: [[0, 0], [1, 1]] }, + properties: { name: 'Length', measureType: 'length', annotationType: 'LineString', id: 'feature-06' } + }, + { + id: 'feature-07', + type: 'Feature', + geometry: { type: 'Polygon', coordinates: [[[0, 0], [1, 1], [0, 1], [0, 0]]] }, + properties: { name: 'Area', measureType: 'area', annotationType: 'Polygon', id: 'feature-07' } + }, + { + id: 'feature-08', + type: 'Feature', + geometry: { type: 'LineString', coordinates: [[0, 0], [1, 1]] }, + properties: { name: 'Bearing', measureType: 'bearing', annotationType: 'LineString', id: 'feature-08' } + } + ] + }} + />, document.getElementById("container")); + const editorNode = document.querySelector('.ms-features-editor'); + expect(editorNode).toBeTruthy(); + const editorHeaderButtons = [...document.querySelectorAll('.ms-features-editor-list-header .btn')]; + expect(editorHeaderButtons.map((button) => button.querySelector('.glyphicon').getAttribute('class').replace('glyphicon glyphicon-', ''))).toEqual([ + 'undo', 'redo', 'point-plus', 'polyline-plus', 'polygon-plus', 'font-add', '1-circle-add' + ]); + const featureEditorItem = [...document.querySelectorAll('.ms-features-editor-item')]; + expect(featureEditorItem.map((item) => [...item.querySelectorAll('.glyphicon')].map((node) => node.getAttribute('class').replace('glyphicon glyphicon-', '')))) + .toEqual([ + [ 'point', 'ok-sign text-success', 'zoom-to', 'trash' ], + [ '1-circle', 'ok-sign text-success', 'zoom-to', 'trash' ], + [ 'font', 'ok-sign text-success', 'zoom-to', 'trash' ], + [ 'polyline', 'ok-sign text-success', 'zoom-to', 'trash' ], + [ 'polygon', 'ok-sign text-success', 'zoom-to', 'trash' ], + [ '1-measure-length', 'ok-sign text-success', 'zoom-to', 'trash' ], + [ '1-measure-area', 'ok-sign text-success', 'zoom-to', 'trash' ], + [ '1-measure-bearing', 'ok-sign text-success', 'zoom-to', 'trash' ] + ]); + }); + it('should show add new features and trigger on change', (done) => { + let count = 0; + ReactDOM.render(<FeaturesEditor + onChange={(options) => { + if (count === 7) { + try { + expect(options.features.length).toBe(0); + expect(options.invalidFeatures.map(feature => feature.properties.annotationType)).toEqual( + [ 'Point', 'LineString', 'Polygon', 'Text', 'Circle' ] + ); + done(); + } catch (e) { + done(e); + } + } + count++; + }} + />, document.getElementById("container")); + const editorNode = document.querySelector('.ms-features-editor'); + expect(editorNode).toBeTruthy(); + const editorHeaderButtons = [...document.querySelectorAll('.ms-features-editor-list-header .btn')]; + expect(editorHeaderButtons.map((button) => button.querySelector('.glyphicon').getAttribute('class').replace('glyphicon glyphicon-', ''))).toEqual([ + 'undo', 'redo', 'point-plus', 'polyline-plus', 'polygon-plus', 'font-add', '1-circle-add' + ]); + Simulate.click(editorHeaderButtons[2]); + Simulate.click(editorHeaderButtons[3]); + Simulate.click(editorHeaderButtons[4]); + Simulate.click(editorHeaderButtons[5]); + Simulate.click(editorHeaderButtons[6]); + Simulate.click(editorHeaderButtons[0]); + Simulate.click(editorHeaderButtons[1]); + const featureEditorItem = [...document.querySelectorAll('.ms-features-editor-item')]; + expect(featureEditorItem.map((item) => [...item.querySelectorAll('.glyphicon')].map((node) => node.getAttribute('class').replace('glyphicon glyphicon-', '')))) + .toEqual([ + [ 'point', 'exclamation-mark text-danger', 'zoom-to', 'trash' ], + [ 'polyline', 'exclamation-mark text-danger', 'zoom-to', 'trash' ], + [ 'polygon', 'exclamation-mark text-danger', 'zoom-to', 'trash' ], + [ 'font', 'exclamation-mark text-danger', 'zoom-to', 'trash' ], + [ '1-circle', 'exclamation-mark text-danger', 'zoom-to', 'trash' ] + ]); + }); + it('should show coordinates and style tab when a feature is selected', (done) => { + ReactDOM.render(<FeaturesEditor + selectedId={'feature-01'} + onSelectTab={(tab) => { + try { + expect(tab).toBe('style'); + } catch (e) { + done(e); + } + done(); + }} + value={{ + features: [{ + id: 'feature-01', + type: 'Feature', + geometry: { type: 'Point', coordinates: [0, 0] }, + properties: { name: 'Point', annotationType: 'Point', id: 'feature-01' } + }], + style: { + format: 'geostyler', + body: { + name: '', + rules: [ + { + ruleId: 'rule-01', + name: '', + filter: ['==', 'id', 'feature-01'], + symbolizers: [{ + symbolizerId: 'symbolizer-01', + kind: 'Icon', + image: { + name: 'msMarkerIcon', + args: [ + { + color: 'blue', + shape: 'circle', + glyph: 'comment' + } + ] + }, + opacity: 1, + size: 46, + rotate: 0, + msBringToFront: false, + anchor: 'bottom', + msHeightReference: 'none' + }] + } + ] + } + } + }} + />, document.getElementById("container")); + const editorNode = document.querySelector('.ms-features-editor'); + expect(editorNode).toBeTruthy(); + const editorHeaderButtons = [...document.querySelectorAll('.ms-features-editor-list-header .btn')]; + expect(editorHeaderButtons.map((button) => button.querySelector('.glyphicon').getAttribute('class').replace('glyphicon glyphicon-', ''))).toEqual([ + 'undo', 'redo', 'point-plus', 'polyline-plus', 'polygon-plus', 'font-add', '1-circle-add' + ]); + const featureEditorItem = [...document.querySelectorAll('.ms-features-editor-item.selected')]; + expect(featureEditorItem.map((item) => [...item.querySelectorAll('.glyphicon')].map((node) => node.getAttribute('class').replace('glyphicon glyphicon-', '')))) + .toEqual([ [ 'point', 'ok-sign text-success', 'zoom-to', 'trash' ] ]); + + const navItems = [...document.querySelectorAll('.nav a')]; + expect(navItems.map(node => node.innerText)).toEqual([ 'annotations.tabCoordinates', 'annotations.tabStyle' ]); + expect(document.querySelector('.coordinates-editor')).toBeTruthy(); + expect(document.querySelector('.ms-style-rules-editor')).toBeFalsy(); + Simulate.click(navItems[1]); + }); +}); diff --git a/web/client/plugins/Annotations/components/__tests__/GeometryEditor-test.jsx b/web/client/plugins/Annotations/components/__tests__/GeometryEditor-test.jsx new file mode 100644 index 0000000000..22840fc35a --- /dev/null +++ b/web/client/plugins/Annotations/components/__tests__/GeometryEditor-test.jsx @@ -0,0 +1,29 @@ +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import ReactDOM from 'react-dom'; +import GeometryEditor from '../GeometryEditor'; +import expect from 'expect'; + +describe('GeometryEditor component', () => { + beforeEach((done) => { + document.body.innerHTML = '<div id="container"></div>'; + setTimeout(done); + }); + afterEach((done) => { + ReactDOM.unmountComponentAtNode(document.getElementById("container")); + document.body.innerHTML = ''; + setTimeout(done); + }); + it('should render with default', () => { + ReactDOM.render(<GeometryEditor />, document.getElementById("container")); + const editorNode = document.querySelector('.coordinates-editor'); + expect(editorNode).toBeTruthy(); + }); +}); diff --git a/web/client/plugins/Annotations/constants.js b/web/client/plugins/Annotations/constants.js new file mode 100644 index 0000000000..3f5cad33e8 --- /dev/null +++ b/web/client/plugins/Annotations/constants.js @@ -0,0 +1,13 @@ +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. +*/ + +export const DEFAULT_TARGET_ID = 'ms-annotations-editor-target'; +export const ANNOTATIONS_ADDITIONAL_LAYERS_OWNER = 'ANNOTATIONS_ADDITIONAL_LAYERS_OWNER'; +export const ANNOTATIONS_HIGHLIGHT_LAYER = 'ANNOTATIONS_HIGHLIGHT_LAYERS'; +export const ANNOTATIONS_SELECTED_LAYER = 'ANNOTATIONS_SELECTED_LAYER'; +export const ANNOTATIONS_INVALID_LAYER = 'ANNOTATIONS_INVALID_LAYER'; diff --git a/web/client/plugins/Annotations/containers/AnnotationsEditor.jsx b/web/client/plugins/Annotations/containers/AnnotationsEditor.jsx new file mode 100644 index 0000000000..6d4f7ab217 --- /dev/null +++ b/web/client/plugins/Annotations/containers/AnnotationsEditor.jsx @@ -0,0 +1,414 @@ + +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. +*/ + +import React, { useEffect, useState } from 'react'; +import { createPortal } from 'react-dom'; +import { connect } from 'react-redux'; +import { createSelector } from 'reselect'; +import tinycolor from 'tinycolor2'; +import { + ANNOTATIONS, + checkInvalidCoordinate, + validateFeature +} from '../utils/AnnotationsUtils'; +import { zoomToExtent } from '../../../actions/map'; +import { updateNode } from '../../../actions/layers'; +import { + storeAnnotationsSession, + selectAnnotationFeature +} from '../actions/annotations'; +import { + getSelectedAnnotationLayer, + getAnnotationsSession, + getSelectedAnnotationFeatureId +} from '../selectors/annotations'; +import { createControlVariableSelector } from '../../../selectors/controls'; +import { mapSelector } from '../../../selectors/map'; +import { is3DMode } from '../../../selectors/maptype'; +import FeaturesEditor from '../components/FeaturesEditor'; +import { + updateAdditionalLayer, + removeAdditionalLayer +} from '../../../actions/additionallayers'; +import bbox from '@turf/bbox'; +import { + DEFAULT_TARGET_ID, + ANNOTATIONS_ADDITIONAL_LAYERS_OWNER, + ANNOTATIONS_HIGHLIGHT_LAYER, + ANNOTATIONS_SELECTED_LAYER, + ANNOTATIONS_INVALID_LAYER +} from '../constants'; + +import AnnotationsMapInteractionsSupport, { areAnnotationsMapInteractionsSupported } from './AnnotationsMapInteractionsSupport'; + +function getInvalidFeatures(features) { + return (features || []).filter(( {geometry }) => geometry?.type && ['LineString', 'Polygon'].includes(geometry.type)) + .reduce((acc, feature) => { + const lineCoordinates = (feature.geometry.type === 'LineString' + ? feature.geometry.coordinates + : feature.geometry.coordinates[0] + ).filter((coords) => !coords.some(checkInvalidCoordinate)); + return [ + ...acc, + ...(lineCoordinates.length > 1 + ? [{ + type: 'Feature', + geometry: { type: 'LineString', coordinates: lineCoordinates }, + properties: { ...feature?.properties, geometryType: 'LineString' } + }] + : []), + ...lineCoordinates.map((coordinates) => ({ + type: 'Feature', + geometry: { type: 'Point', coordinates }, + properties: { geometryType: 'Point' } + })) + ]; + }, []); +} + +function getHighlightFeatures(feature) { + if (!feature?.geometry?.type) { + return []; + } + if (feature.geometry.type === 'Point' && !feature.geometry.coordinates.some(checkInvalidCoordinate)) { + return [{ ...feature, properties: { geometryType: 'Point' } }]; + } + const [minx, miny, maxx, maxy] = bbox(feature); + const perimeter = { + type: 'Feature', + geometry: { type: 'LineString', coordinates: [[minx, miny], [minx, maxy], [maxx, maxy], [maxx, miny], [minx, miny]] }, + properties: { geometryType: 'LineString' } + }; + if (feature.geometry.type === 'LineString') { + return [ + perimeter, + ...feature.geometry.coordinates.map((coordinates) => ({ + type: 'Feature', + geometry: { type: 'Point', coordinates }, + properties: { geometryType: 'Point' } + })) + ]; + } + if (feature.geometry.type === 'Polygon') { + return [ + perimeter, + ...feature.geometry.coordinates[0].map((coordinates) => ({ + type: 'Feature', + geometry: { type: 'Point', coordinates }, + properties: { geometryType: 'Point' } + })) + ]; + } + return [feature]; +} + +function AnnotationsEditor({ + enabled, + targetId = DEFAULT_TARGET_ID, + mapType, + map, + selected, + onChange, + onZoomTo, + maxZoom = 18, + projection, + onUpdateALayer = () => {}, + onRemoveALayer = () => {}, + symbolsPath = 'product/assets/symbols/symbols.json', + lineDashOptions, + enable3dStyleOptions, + geometryEditorOptions, + format = 'decimal', + defaultTextAnnotation = 'New', + defaultPointType, + defaultShape, + defaultShapeStrokeColor, + defaultShapeFillColor, + defaultShapeSize, + geodesic, + activeClickEventListener, + fonts, + onStoreSession, + session, + selectedId, + setSelectedId = () => {} +}) { + + const container = document.querySelector(`#${targetId}`); + const [coordinatesFormat, setCoordinatesFormat] = useState(format); + const [tab, setTab] = useState('coordinates'); + + function getSvgSymbolsPath() { + return symbolsPath.includes('.json') ? symbolsPath : `${symbolsPath}symbols.json`; + } + + function configToDefaultSymbolizers() { + if (defaultPointType !== 'symbol') { + return {}; + } + const fill = tinycolor(defaultShapeFillColor || '#dddddd'); + const stroke = tinycolor(defaultShapeStrokeColor || '#777777'); + const wellKnownName = getSvgSymbolsPath().replace(/[^\/]*.json$/, `${defaultShape}.svg`); + return { + Point: { + kind: 'Mark', + wellKnownName, + color: fill.toHexString(), + fillOpacity: fill.getAlpha(), + strokeColor: stroke.toHexString(), + strokeOpacity: stroke.getAlpha(), + strokeWidth: 1, + radius: defaultShapeSize / 2, + rotate: 0 + } + }; + } + + useEffect(() => { + if (enabled && selected?.id) { + onUpdateALayer(selected.id, ANNOTATIONS_ADDITIONAL_LAYERS_OWNER, 'override', { + visibility: true + }); + } + return () => { + onRemoveALayer({ owner: ANNOTATIONS_ADDITIONAL_LAYERS_OWNER }); + }; + }, [enabled]); + function updateInvalidLayer(invalidFeatures) { + onUpdateALayer(ANNOTATIONS_INVALID_LAYER, ANNOTATIONS_ADDITIONAL_LAYERS_OWNER, 'overlay', { + type: 'vector', + visibility: true, + features: invalidFeatures ? getInvalidFeatures(invalidFeatures) : [], + style: { + format: 'geostyler', + body: { + name: '', + rules: [ + { + name: '', + filter: ['==', 'geometryType', 'LineString'], + symbolizers: [ { + kind: 'Line', + color: '#ff0000', + width: 2, + opacity: 1, + cap: 'round', + join: 'round', + msClampToGround: false, + dasharray: [6, 6] + }] + }, + { + name: '', + filter: ['==', 'geometryType', 'Point'], + symbolizers: [{ + kind: 'Mark', + wellKnownName: 'shape://plus', + color: '#ffffff', + fillOpacity: 0, + strokeColor: '#ff0000', + strokeOpacity: 1, + strokeWidth: 1, + radius: 8, + rotate: 0, + msBringToFront: true + }] + } + ] + } + } + }); + } + function updateSelectedLayer(feature, showSelected) { + if (areAnnotationsMapInteractionsSupported(mapType)) { + onUpdateALayer(selected.id, ANNOTATIONS_ADDITIONAL_LAYERS_OWNER, 'override', { + visibility: true, + ...((feature && !showSelected && !activeClickEventListener) && { + features: selected?.features?.filter(({ id, properties }) => id !== feature.id && properties?.measureId !== feature.id) + }) + }); + } + onUpdateALayer(ANNOTATIONS_SELECTED_LAYER, ANNOTATIONS_ADDITIONAL_LAYERS_OWNER, 'overlay', { + type: 'vector', + visibility: true, + features: feature ? getHighlightFeatures(feature) : [], + style: { + format: 'geostyler', + body: { + name: '', + rules: [ + { + name: '', + filter: ['==', 'geometryType', 'LineString'], + symbolizers: [ { + kind: 'Line', + color: '#111111', + width: 1, + opacity: 1, + cap: 'round', + join: 'round', + msClampToGround: true, + dasharray: [6, 6] + }] + }, + { + name: '', + filter: ['==', 'geometryType', 'Point'], + symbolizers: [{ + kind: 'Mark', + wellKnownName: 'shape://plus', + color: '#ffffff', + fillOpacity: 0, + strokeColor: '#000000', + strokeOpacity: 1, + strokeWidth: 1, + radius: 8, + rotate: 0, + msBringToFront: true + }] + } + ] + } + } + }); + } + useEffect(() => { + const selectedFeature = (selected?.features || []).find((feature) => feature.id === selectedId); + if (enabled && validateFeature(selectedFeature)) { + updateSelectedLayer(selectedFeature, tab === 'style'); + } + }, [activeClickEventListener, mapType, enabled]); + if (!(enabled && container && selected)) { + return null; + } + return createPortal( + <div className="ms-annotations-editor"> + <FeaturesEditor + key={selected._v_} + selectedId={selectedId} + geodesic={{ + Circle: geodesic !== false + }} + fonts={fonts} + defaultSymbolizers={configToDefaultSymbolizers()} + svgSymbolsPath={getSvgSymbolsPath()} + lineDashOptions={lineDashOptions} + coordinatesFormat={coordinatesFormat} + enable3dStyleOptions={enable3dStyleOptions} + geometryEditorOptions={geometryEditorOptions} + defaultTextLabel={defaultTextAnnotation} + onChangeCoordinatesFormat={setCoordinatesFormat} + tab={tab} + onSelectTab={(selectedTab, feature) => { + setTab(selectedTab); + updateSelectedLayer(feature, selectedTab === 'style'); + }} + mapInteractionsSupport={!activeClickEventListener && AnnotationsMapInteractionsSupport} + value={session || { + features: selected?.features || [], + style: selected?.style || {} + }} + onHighlight={(type, feature) => { + onUpdateALayer(ANNOTATIONS_HIGHLIGHT_LAYER, ANNOTATIONS_ADDITIONAL_LAYERS_OWNER, 'overlay', { + type: 'vector', + visibility: true, + features: feature ? getHighlightFeatures(feature) : [], + style: { + format: 'geostyler', + body: { + name: '', + rules: [ + { + name: '', + filter: ['==', 'geometryType', 'LineString'], + symbolizers: [ { + kind: 'Line', + color: '#555555', + width: 1, + opacity: 1, + cap: 'round', + join: 'round', + msClampToGround: true, + dasharray: [6, 6] + }] + }, + { + name: '', + filter: ['==', 'geometryType', 'Point'], + symbolizers: [{ + kind: 'Mark', + wellKnownName: 'Square', + color: '#ffffff', + fillOpacity: 0, + strokeColor: '#ff0000', + strokeOpacity: 1, + strokeWidth: 3, + radius: 6, + rotate: 0, + msBringToFront: true + }] + } + ] + } + } + }); + }} + mapType={mapType} + map={map} + maxZoom={maxZoom} + projection={projection} + onSelect={(id, selectedFeature) => { + setSelectedId(id); + updateSelectedLayer(selectedFeature, tab === 'style'); + }} + onChange={(options, selectedFeature, present) => { + onChange(selected.id, 'layers', options); + updateSelectedLayer(selectedFeature, tab === 'style'); + updateInvalidLayer(options.invalidFeatures); + onStoreSession(present); + }} + onZoomTo={onZoomTo} + /> + </div> + , + container + ); +} + +const ConnectedAnnotationsEditor = connect( + createSelector([ + createControlVariableSelector(ANNOTATIONS, 'ready'), + getSelectedAnnotationLayer, + mapSelector, + is3DMode, + getAnnotationsSession, + getSelectedAnnotationFeatureId + ], + (enabled, selected, map, is3D, session, selectedId) => ({ + enabled, + selected, + maxZoom: map?.zoom || 18, + projection: map?.projection, + enable3dStyleOptions: !!is3D, + activeClickEventListener: map?.eventListeners?.click?.[0], + session, + selectedId + })), + { + onChange: updateNode, + onZoomTo: zoomToExtent, + onUpdateALayer: updateAdditionalLayer, + onRemoveALayer: removeAdditionalLayer, + onStoreSession: storeAnnotationsSession, + setSelectedId: selectAnnotationFeature + } +)(AnnotationsEditor); + +export default ConnectedAnnotationsEditor; + diff --git a/web/client/plugins/Annotations/containers/AnnotationsMapInteractionsSupport.jsx b/web/client/plugins/Annotations/containers/AnnotationsMapInteractionsSupport.jsx new file mode 100644 index 0000000000..8ad951565e --- /dev/null +++ b/web/client/plugins/Annotations/containers/AnnotationsMapInteractionsSupport.jsx @@ -0,0 +1,80 @@ +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React, { lazy, Suspense } from 'react'; +import { MapLibraries } from '../../../utils/MapTypeUtils'; +import { validateFeature } from '../utils/AnnotationsUtils'; + +const drawGeometrySupportSupports = { + [MapLibraries.OPENLAYERS]: lazy(() => import(/* webpackChunkName: 'supports/olDrawGeometrySupport' */ '../../../components/map/openlayers/DrawGeometrySupport')), + [MapLibraries.CESIUM]: lazy(() => import(/* webpackChunkName: 'supports/cesiumDrawGeometrySupport' */ '../../../components/map/cesium/DrawGeometrySupport')) +}; +const editGeoJSONSupportSupports = { + [MapLibraries.OPENLAYERS]: lazy(() => import(/* webpackChunkName: 'supports/olEditGeoJSONSupport' */ '../../../components/map/openlayers/EditGeoJSONSupport')), + [MapLibraries.CESIUM]: lazy(() => import(/* webpackChunkName: 'supports/cesiumEditGeoJSONSupport' */ '../../../components/map/cesium/EditGeoJSONSupport')) +}; + +export const areAnnotationsMapInteractionsSupported = (mapType) => { + return drawGeometrySupportSupports[mapType] && editGeoJSONSupportSupports[mapType]; +}; + +function AnnotationsMapInteractionsSupport({ + map, + active, + mapType, + feature, + geodesic = {}, + onChange = () => {} +}) { + + const getGeometryType = ({ properties } = {}) => properties?.annotationType === 'Text' ? 'Point' : properties?.annotationType; + if (!areAnnotationsMapInteractionsSupported(mapType)) { + return null; + } + const DrawGeometrySupport = drawGeometrySupportSupports[mapType]; + const EditFeatureSupport = editGeoJSONSupportSupports[mapType]; + const isFeatureGeometryValid = validateFeature(feature, true); + const selectedAnnotationType = getGeometryType(feature); + const isGeodesic = !!geodesic[selectedAnnotationType]; + return ( + <Suspense fallback={null}> + <> + <DrawGeometrySupport + map={map} + active={active && feature.geometry === null} + depthTestAgainstTerrain={false} + geometryType={selectedAnnotationType} + geodesic={isGeodesic} + getObjectsToExcludeOnPick={() => []} + onDrawEnd={({ feature: newFeature }) => { + onChange({ + ...feature, + properties: { + ...feature?.properties, + geodesic: isGeodesic, + ...(newFeature?.properties?.radius !== undefined && { + radius: newFeature?.properties?.radius + }) + }, + geometry: newFeature.geometry + }); + }} + /> + <EditFeatureSupport + map={map} + active={active && isFeatureGeometryValid} + geojson={feature} + getGeometryType={getGeometryType} + onEditEnd={newFeature => onChange(newFeature)} + /> + </> + </Suspense> + ); +} + +export default AnnotationsMapInteractionsSupport; diff --git a/web/client/plugins/Annotations/containers/AnnotationsPanel.jsx b/web/client/plugins/Annotations/containers/AnnotationsPanel.jsx new file mode 100644 index 0000000000..cbf45bd8a8 --- /dev/null +++ b/web/client/plugins/Annotations/containers/AnnotationsPanel.jsx @@ -0,0 +1,335 @@ +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. +*/ + + +import React, { useEffect, useState } from 'react'; +import { Nav, NavItem, Glyphicon, ButtonGroup, Alert, ControlLabel } from "react-bootstrap"; +import { connect } from 'react-redux'; +import { createSelector } from 'reselect'; +import isFunction from 'lodash/isFunction'; +import capitalize from 'lodash/capitalize'; +import { ANNOTATIONS } from '../utils/AnnotationsUtils'; +import { registerRowViewer } from '../../../utils/MapInfoUtils'; +import MSButton from '../../../components/misc/Button'; +import tooltip from '../../../components/misc/enhancers/tooltip'; +import { updateNode } from '../../../actions/layers'; +import { + cancelCloseAnnotations, + confirmCloseAnnotations, + download, + editAnnotation, + removeAnnotation +} from '../actions/annotations'; +import { getSelectedAnnotationLayer } from '../selectors/annotations'; +import { createControlEnabledSelector } from '../../../selectors/controls'; +import { mapLayoutValuesSelector } from '../../../selectors/maplayout'; +import { setControlProperty } from '../../../actions/controls'; +import Message from '../../../components/I18N/Message'; +import AnnotationsFields from '../components/AnnotationsFields'; +import { DEFAULT_TARGET_ID } from '../constants'; +import ConfirmDialog from '../../../components/misc/ConfirmDialog'; +import Portal from '../../../components/misc/Portal'; +import { mapSelector } from '../../../selectors/map'; +import VisibilityLimitsForm from '../../../components/TOC/fragments/settings/VisibilityLimitsForm'; + +const Button = tooltip(MSButton); + +function AnnotationsInfoViewer({ + fields, + onEdit = () => {}, + onRemove = () => {}, + onDownload = () => {}, + ...layer +}) { + const [removeModal, setRemoveModal] = useState(false); + return ( + <div> + <div> + <ButtonGroup> + <Button + className="square-button-md" + bsStyle="primary" + tooltipId="annotations.edit" + onClick={() => onEdit(layer.id)} + > + <Glyphicon glyph="pencil"/> + </Button> + <Button + className="square-button-md" + bsStyle="primary" + tooltipId="annotations.remove" + onClick={() => setRemoveModal(true)} + > + <Glyphicon glyph="trash"/> + </Button> + <Button + className="square-button-md" + bsStyle="primary" + tooltipId="annotations.downloadcurrenttooltip" + onClick={() => onDownload([layer])} + > + <Glyphicon glyph="download"/> + </Button> + </ButtonGroup> + </div> + <AnnotationsFields + preview + properties={{ + title: layer?.title, + description: layer?.description, + ...layer?.options + }} + fields={fields} + /> + <Portal> + <ConfirmDialog + show={removeModal} + modal + onClose={() => setRemoveModal(false)} + onConfirm={() => { + onRemove(layer.id); + setRemoveModal(false); + }} + confirmButtonBSStyle="primary" + closeGlyph="1-close" + confirmButtonContent={<Message msgId="annotations.confirm" />} + closeText={<Message msgId="annotations.cancel" />}> + <Message msgId="annotations.undoDeleteFeature" /> + </ConfirmDialog> + </Portal> + </div> + ); +} + +const ConnectedAnnotationsInfoViewer = connect( + () => ({}), + { + onRemove: removeAnnotation, + onDownload: download, + onEdit: editAnnotation + } +)(AnnotationsInfoViewer); + +function AnnotationsPanel({ + targetId = DEFAULT_TARGET_ID, + selected, + style, + enabled, + onReady = () => {}, + onClose = () => {}, + onChange = () => {}, + onDownload = () => {}, + fields = [ + { + name: 'title', + type: 'text', + validator: (val) => val, + validateError: 'annotations.mandatory', + showLabel: true, + editable: true + }, + { + name: 'description', + type: 'html', + showLabel: true, + editable: true + } + ], + closeId, + onCancel = () => {}, + activeClickEventListener, + projection, + resolutions, + zoom +}) { + const properties = { + title: selected?.title, + description: selected?.description, + ...selected?.options + }; + const [tab, setTab] = useState('properties'); + const [closeModal, setCloseModal] = useState(false); + function validateFields() { + return !fields.find((filed) => (isFunction(filed?.validator) ? !filed.validator(properties[filed.name]) : false)); + } + function validateFeatures() { + return !selected?.features?.length + ? false + : !selected.invalidFeatures; + } + useEffect(() => { + registerRowViewer(ANNOTATIONS, (props) => <ConnectedAnnotationsInfoViewer {...props} fields={fields} />); + return () => { + registerRowViewer(ANNOTATIONS, undefined); + }; + }, []); + + useEffect(() => { + setCloseModal(false); + onReady(enabled); + return () => { + onReady(!enabled); + }; + }, [enabled]); + + function handleClosePanel(event) { + event.stopPropagation(); + if (validateFields() && validateFeatures()) { + return onClose(selected); + } + return setCloseModal(true); + } + + function handleCancelClose() { + onCancel(); + setCloseModal(false); + } + function handleConfirmClose() { + onClose(selected); + setCloseModal(false); + } + + useEffect(() => { + if (closeId) { + handleClosePanel(); + } + }, [closeId]); + + if (!selected) { + return null; + } + + return ( + <div + className="ms-annotations-panel" + style={style} + > + <div className="ms-annotations-panel-header"> + <Button + onClick={(event) => handleClosePanel(event)} + className="square-button no-border" + > + <Glyphicon glyph="1-close"/> + </Button> + <div className="ms-annotations-title"> + <Message msgId="annotations.title" /> + </div> + <div className="square-button text-primary"> + <Glyphicon glyph="comment"/> + </div> + </div> + <Nav bsStyle="tabs" activeKey={tab} className="ms-annotations-panel-nav"> + <NavItem + key="properties" + eventKey="properties" + onClick={() => setTab('properties')}> + <Message msgId="annotations.properties"/> + {' '} + <Glyphicon glyph={validateFields() ? 'ok-sign text-success' : 'exclamation-mark text-danger'}/> + </NavItem> + <NavItem + key="geometries" + eventKey="geometries" + onClick={() => setTab('geometries')}> + <Message msgId="annotations.geometries"/> + {' '} + <Glyphicon glyph={validateFeatures() ? 'ok-sign text-success' : 'exclamation-mark text-danger'}/> + </NavItem> + <NavItem + key="geometries" + eventKey="settings" + onClick={() => setTab('settings')}> + <Message msgId="settings"/> + </NavItem> + <Button + className="square-button-md" + bsStyle="primary" + tooltipId="annotations.downloadcurrenttooltip" + disabled={!(validateFields() && validateFeatures())} + onClick={() => onDownload([selected])} + > + <Glyphicon glyph="download"/> + </Button> + </Nav> + <div className="ms-annotations-panel-body"> + <div className="ms-annotations-panel-content" style={tab === 'properties' ? { } : { display: 'none' }}> + <AnnotationsFields + fields={fields} + properties={properties} + onChange={(newOptions) => { + const { title, description, ...options } = newOptions; + onChange(selected.id, 'layers', { + ...(title !== undefined && { title }), + ...(description !== undefined && { description }), + options: { + ...selected.options, + ...options + } + }); + }} + /> + </div> + <div id={targetId} style={tab === 'geometries' ? {} : { display: 'none' }} > + </div> + <div className="ms-annotations-panel-content" style={tab === 'settings' ? { } : { display: 'none' }}> + <VisibilityLimitsForm + title={<ControlLabel><Message msgId="layerProperties.visibilityLimits.title"/></ControlLabel>} + layer={selected} + onChange={(options) => onChange(selected.id, 'layers', options)} + projection={projection} + resolutions={resolutions} + zoom={zoom} + /> + </div> + </div> + {activeClickEventListener && <Alert bsStyle="warning"> + <Message msgId="annotations.deactivatedMapInteraction" msgParams={{ pluginName: capitalize(activeClickEventListener) }}/> + </Alert>} + <Portal> + <ConfirmDialog + show={closeModal} + modal + onClose={() => handleCancelClose()} + onConfirm={() => handleConfirmClose()} + confirmButtonBSStyle="primary" + closeGlyph="1-close" + confirmButtonContent={<Message msgId="annotations.confirm" />} + closeText={<Message msgId="annotations.cancel" />}> + <Message msgId="annotations.undo" /> + </ConfirmDialog> + </Portal> + </div> + ); +} + +const ConnectedAnnotationsPanel = connect( + createSelector([ + createControlEnabledSelector(ANNOTATIONS), + state => mapLayoutValuesSelector(state, { height: true }), + getSelectedAnnotationLayer, + mapSelector + ], + (enabled, style, selected, map) => ({ + enabled, + style, + selected: enabled ? selected : null, + activeClickEventListener: map?.eventListeners?.click?.[0], + projection: map?.projection, + zoom: map?.zoom, + resolutions: map?.resolutions + })), + { + onClose: confirmCloseAnnotations, + onCancel: cancelCloseAnnotations, + onReady: setControlProperty.bind(null, ANNOTATIONS, 'ready'), + onChange: updateNode, + onDownload: download + } +)(AnnotationsPanel); + +export default ConnectedAnnotationsPanel; diff --git a/web/client/plugins/Annotations/containers/AnnotationsTOCButton.jsx b/web/client/plugins/Annotations/containers/AnnotationsTOCButton.jsx new file mode 100644 index 0000000000..07a51f3c33 --- /dev/null +++ b/web/client/plugins/Annotations/containers/AnnotationsTOCButton.jsx @@ -0,0 +1,114 @@ +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. +*/ + +import React from 'react'; +import { Glyphicon } from "react-bootstrap"; +import { connect } from 'react-redux'; +import { createSelector } from 'reselect'; +import { ANNOTATIONS, isAnnotationLayer } from '../utils/AnnotationsUtils'; +import MSButton from '../../../components/misc/Button'; +import tooltip from '../../../components/misc/enhancers/tooltip'; +import { + download, + newAnnotation, + editAnnotation +} from '../actions/annotations'; +import { annotationsLayersSelector } from '../selectors/annotations'; +import { createControlEnabledSelector } from '../../../selectors/controls'; + +const Button = tooltip(MSButton); + +function AnnotationsTOCButton({ + status, + selectedLayers, + onAdd = () => {}, + onDownload = () => {}, + onEdit = () => {}, + annotationLayers = [] +}) { + if (status === 'DESELECT') { + return ( + <> + <Button + key="annotations" + bsStyle="primary" + className="square-button-md" + tooltipId="toc.addAnnotations" + onClick={() => onAdd()}> + <Glyphicon glyph="add-comment"/> + </Button> + {annotationLayers.length > 0 && <Button + key="annotations-download" + bsStyle="primary" + className="square-button-md" + tooltipId="annotations.downloadtooltip" + onClick={() => onDownload(annotationLayers)}> + <Glyphicon glyph="download-comment"/> + </Button>} + </> + ); + } + if (status === 'LAYER' && isAnnotationLayer(selectedLayers[0])) { + return ( + <> + <Button + key="annotations-edit" + bsStyle="primary" + className="square-button-md" + tooltipId="toc.editAnnotations" + onClick={() => onEdit(selectedLayers[0].id)}> + <Glyphicon glyph="pencil"/> + </Button> + <Button + key="annotations-download" + bsStyle="primary" + className="square-button-md" + tooltipId="annotations.downloadcurrenttooltip" + onClick={() => onDownload([selectedLayers[0]])}> + <Glyphicon glyph="download-comment"/> + </Button> + </> + ); + } + const selectedAnnotationsLayers = status === 'LAYERS' + ? selectedLayers.filter(isAnnotationLayer) + : []; + if (selectedAnnotationsLayers.length) { + return ( + <> + <Button + key="annotations-download" + bsStyle="primary" + className="square-button-md" + tooltipId="annotations.downloadtooltip" + onClick={() => onDownload(selectedAnnotationsLayers)}> + <Glyphicon glyph="download-comment"/> + </Button> + </> + ); + } + return null; +} + +const ConnectedAnnotationsTOCButton = connect( + createSelector([ + annotationsLayersSelector, + createControlEnabledSelector(ANNOTATIONS) + ], + (annotationLayers, enabled) => ({ + annotationLayers, + enabled + })), + { + onAdd: newAnnotation, + onDownload: download, + onEdit: editAnnotation + } +)(AnnotationsTOCButton); + +export default ConnectedAnnotationsTOCButton; diff --git a/web/client/plugins/Annotations/epics/__tests__/annotations-test.js b/web/client/plugins/Annotations/epics/__tests__/annotations-test.js new file mode 100644 index 0000000000..d826d257be --- /dev/null +++ b/web/client/plugins/Annotations/epics/__tests__/annotations-test.js @@ -0,0 +1,211 @@ +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +import expect from 'expect'; +import { + loadAnnotations, + newAnnotation, + editAnnotation, + download, + confirmCloseAnnotations, + removeAnnotation, + mergeAnnotationsFeatures +} from '../../actions/annotations'; +import { + REMOVE_LAYER, + ADD_LAYER, + UPDATE_NODE, + SELECT_NODE +} from '../../../../actions/layers'; +import { + HIDE_MAPINFO_MARKER, + CLOSE_IDENTIFY, + PURGE_MAPINFO_RESULTS +} from '../../../../actions/mapInfo'; +import { + SET_CONTROL_PROPERTY +} from '../../../../actions/controls'; +import { + SHOW_NOTIFICATION +} from '../../../../actions/notifications'; +import { + loadAnnotationsEpic, + newAnnotationEpic, + editAnnotationEpic, + downloadAnnotationsEpic, + confirmCloseAnnotationsEpic, + removeAnnotationsEpic, + mergeAnnotationsFeaturesEpic +} from '../annotations'; +import { testEpic } from '../../../../epics/__tests__/epicTestUtils'; + +describe('annotations epics', () => { + it('loadAnnotationsEpic override false', (done) => { + const state = { + layers: { + flat: [{ id: 'annotations:1', features: [], type: 'vector', rowViewer: 'annotations' }] + } + }; + const annotations = [{ id: 'annotations:2', features: [], type: 'vector', rowViewer: 'annotations' }]; + testEpic(loadAnnotationsEpic, 1, loadAnnotations(annotations, false), (actions) => { + try { + expect(actions.map(({ type }) => type)).toEqual([ ADD_LAYER ]); + done(); + } catch (e) { + done(e); + } + }, state); + }); + it('loadAnnotationsEpic override false same id', (done) => { + const state = { + layers: { + flat: [{ id: 'annotations:1', features: [], type: 'vector', rowViewer: 'annotations' }] + } + }; + const annotations = [{ id: 'annotations:1', features: [], type: 'vector', rowViewer: 'annotations' }]; + testEpic(loadAnnotationsEpic, 1, loadAnnotations(annotations, false), (actions) => { + try { + expect(actions.map(({ type }) => type)).toEqual([ UPDATE_NODE ]); + done(); + } catch (e) { + done(e); + } + }, state); + }); + it('loadAnnotationsEpic override true', (done) => { + const state = { + layers: { + flat: [{ id: 'annotations:1', features: [], type: 'vector', rowViewer: 'annotations' }] + } + }; + const annotations = [{ id: 'annotations:2', features: [], type: 'vector', rowViewer: 'annotations' }]; + testEpic(loadAnnotationsEpic, 2, loadAnnotations(annotations, true), (actions) => { + try { + expect(actions.map(({ type }) => type)).toEqual([ REMOVE_LAYER, ADD_LAYER ]); + done(); + } catch (e) { + done(e); + } + }, state); + }); + it('newAnnotationEpic', (done) => { + const state = {}; + testEpic(newAnnotationEpic, 4, newAnnotation(), (actions) => { + try { + expect(actions.map(({ type }) => type)).toEqual([ + HIDE_MAPINFO_MARKER, + ADD_LAYER, + SELECT_NODE, + SET_CONTROL_PROPERTY + ]); + done(); + } catch (e) { + done(e); + } + }, state); + }); + it('editAnnotationEpic', (done) => { + const state = { + layers: { + flat: [{ id: 'annotations:1', features: [], type: 'vector', rowViewer: 'annotations' }], + selected: [] + } + }; + testEpic(editAnnotationEpic, 3, editAnnotation('annotations:1'), (actions) => { + try { + expect(actions.map(({ type }) => type)).toEqual([ + HIDE_MAPINFO_MARKER, + SELECT_NODE, + SET_CONTROL_PROPERTY + ]); + done(); + } catch (e) { + done(e); + } + }, state); + }); + it('editAnnotationEpic layer already selected', (done) => { + const state = { + layers: { + flat: [{ id: 'annotations:1', features: [], type: 'vector', rowViewer: 'annotations' }], + selected: ['annotations:1'] + } + }; + testEpic(editAnnotationEpic, 2, editAnnotation('annotations:1'), (actions) => { + try { + expect(actions.map(({ type }) => type)).toEqual([ + HIDE_MAPINFO_MARKER, + SET_CONTROL_PROPERTY + ]); + done(); + } catch (e) { + done(e); + } + }, state); + }); + it('downloadAnnotationsEpic error', (done) => { + const state = {}; + testEpic(downloadAnnotationsEpic, 1, download('wrong-type'), (actions) => { + try { + expect(actions.map(({ type }) => type)).toEqual([SHOW_NOTIFICATION]); + done(); + } catch (e) { + done(e); + } + }, state); + }); + it('confirmCloseAnnotationsEpic remove if features are empty', (done) => { + const state = {}; + testEpic(confirmCloseAnnotationsEpic, 2, confirmCloseAnnotations({ id: 'annotations:1', features: [] }), (actions) => { + try { + expect(actions.map(({ type }) => type)).toEqual([ SET_CONTROL_PROPERTY, REMOVE_LAYER ]); + done(); + } catch (e) { + done(e); + } + }, state); + }); + it('confirmCloseAnnotationsEpic update if features are not empty', (done) => { + const state = {}; + testEpic(confirmCloseAnnotationsEpic, 2, confirmCloseAnnotations({ id: 'annotations:1', features: [{ id: 'feature-01', type: 'Feature', properties: { id: 'feature-01', annotationType: 'Point' }, geometry: { type: 'Point', coordinates: [0, 0] } }] }), (actions) => { + try { + expect(actions.map(({ type }) => type)).toEqual([ SET_CONTROL_PROPERTY, UPDATE_NODE ]); + done(); + } catch (e) { + done(e); + } + }, state); + }); + it('removeAnnotationsEpic', (done) => { + const state = {}; + testEpic(removeAnnotationsEpic, 3, removeAnnotation('annotations:1'), (actions) => { + try { + expect(actions.map(({ type }) => type)).toEqual([ PURGE_MAPINFO_RESULTS, CLOSE_IDENTIFY, REMOVE_LAYER ]); + done(); + } catch (e) { + done(e); + } + }, state); + }); + it('mergeAnnotationsFeaturesEpic', (done) => { + const state = { + layers: { + flat: [{ id: 'annotations:1', style: {format: 'geostyler', body: { neme: '', rules: [] }}, features: [], type: 'vector', rowViewer: 'annotations' }] + } + }; + const annotation = { id: 'annotations:2', style: {format: 'geostyler', body: { neme: '', rules: [{ name: '', symbolizers: [{ kind: 'Mark' }] }] }}, features: [{ id: 'feature-01', type: 'Feature', properties: { id: 'feature-01', annotationType: 'Point' }, geometry: { type: 'Point', coordinates: [0, 0] } }], type: 'vector', rowViewer: 'annotations' }; + testEpic(mergeAnnotationsFeaturesEpic, 1, mergeAnnotationsFeatures('annotations:1', annotation), (actions) => { + try { + expect(actions.map(({ type }) => type)).toEqual([ UPDATE_NODE ]); + done(); + } catch (e) { + done(e); + } + }, state); + }); +}); diff --git a/web/client/plugins/Annotations/epics/annotations.js b/web/client/plugins/Annotations/epics/annotations.js new file mode 100644 index 0000000000..88435f0bcc --- /dev/null +++ b/web/client/plugins/Annotations/epics/annotations.js @@ -0,0 +1,202 @@ +/* + * Copyright 2017, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +import Rx from 'rxjs'; +import uuidv1 from 'uuid/v1'; +import { saveAs } from 'file-saver'; + +import { setControlProperty } from '../../../actions/controls'; +import { addLayer, updateNode, removeLayer, selectNode } from '../../../actions/layers'; +import { error } from '../../../actions/notifications'; +import { + hideMapinfoMarker, + closeIdentify, + purgeMapInfoResults +} from '../../../actions/mapInfo'; +import { + EDIT_ANNOTATION, + DOWNLOAD, + LOAD_ANNOTATIONS, + NEW_ANNOTATION, + CONFIRM_CLOSE_ANNOTATIONS, + REMOVE_ANNOTATION, + MERGE_ANNOTATIONS_FEATURES, + storeAnnotationsSession +} from '../actions/annotations'; +import { + ANNOTATIONS, + annotationsToGeoJSON, + createAnnotationId +} from '../utils/AnnotationsUtils'; +import { + annotationsLayersSelector, + getAnnotationsSession +} from '../selectors/annotations'; +import { mapNameSelector } from '../../../selectors/map'; +import { + getSelectedLayer, + getLayerFromId +} from '../../../selectors/layers'; + +/** + * Handles the editing of an annotation, performing action such as node selection and control enable + */ +export const editAnnotationEpic = (action$, { getState }) => + action$.ofType(EDIT_ANNOTATION) + .switchMap((action) => { + const selected = getSelectedLayer(getState()); + return Rx.Observable.of( + hideMapinfoMarker(), + ...(selected?.id !== action?.id + ? [selectNode(action.id, 'layer')] + : []), + setControlProperty(ANNOTATIONS, 'enabled', true) + ); + }); +/** + * Handles the creation of a new layer annotation including the initial actions to edit the layer + */ +export const newAnnotationEpic = (action$) => + action$.ofType(NEW_ANNOTATION) + .switchMap(() => { + const newLayer = { + id: createAnnotationId(uuidv1()), + title: 'New annotations', + type: 'vector', + features: [], + style: {}, + visibility: true, + rowViewer: ANNOTATIONS + }; + return Rx.Observable.of( + hideMapinfoMarker(), + addLayer(newLayer), + selectNode(newLayer.id, 'layer'), + setControlProperty(ANNOTATIONS, 'enabled', true) + ); + }); +/** + * Handles all the action to close the annotation panel and clean the annotation layer from all the invalid features + */ +export const confirmCloseAnnotationsEpic = (action$) => + action$.ofType(CONFIRM_CLOSE_ANNOTATIONS) + .switchMap(({ layer }) => { + return Rx.Observable.of( + setControlProperty(ANNOTATIONS, 'enabled', false), + layer?.features?.length + ? updateNode(layer.id, 'layer', { + invalidFeatures: null + }) + : removeLayer(layer.id) + ); + }); +/** + * Handles the removal of an annotation layer + */ +export const removeAnnotationsEpic = (action$) => + action$.ofType(REMOVE_ANNOTATION) + .switchMap((action) => { + return Rx.Observable.of( + purgeMapInfoResults(), + closeIdentify(), + removeLayer(action.id) + ); + }); +/** + * Handles the download of annotations layers converting them to a GeoJSON FeatureCollection file + */ +export const downloadAnnotationsEpic = (action$, { getState }) => + action$.ofType(DOWNLOAD) + .switchMap(({ annotations }) => { + try { + const geoJSON = annotationsToGeoJSON(annotations); + const mapName = mapNameSelector(getState()); + saveAs(new Blob([JSON.stringify(geoJSON)], {type: 'application/json;charset=utf-8' }), `${ mapName.length > 0 && mapName || ANNOTATIONS}.json`); + return Rx.Observable.empty(); + } catch (e) { + return Rx.Observable.of(error({ + title: 'annotations.title', + message: 'annotations.downloadError', + autoDismiss: 5, + position: 'tr' + })); + } + }); +/** + * Handles the import of annotations in a map + */ +export const loadAnnotationsEpic = (action$, { getState }) => + action$.ofType(LOAD_ANNOTATIONS) + .switchMap(({ features, override }) => { + const currentAnnotationsLayers = annotationsLayersSelector(getState()); + if (!override) { + const currentIds = currentAnnotationsLayers.map(({ id }) => id); + return Rx.Observable.of( + ...features.map((annotationLayer) => + currentIds.includes(annotationLayer.id) + ? updateNode(annotationLayer.id, 'layer', { + title: annotationLayer.title, + description: annotationLayer.description, + style: annotationLayer.style, + features: annotationLayer.features + }) + : addLayer(annotationLayer) + ) + ); + } + return Rx.Observable.of( + ...currentAnnotationsLayers.map((annotationLayer) => removeLayer(annotationLayer.id)), + ...features.map((annotationLayer) => addLayer(annotationLayer)) + ); + }); +/** + * Handles the merge of feature inside an annotation, an example are the measurement features converted into an annotation + */ +export const mergeAnnotationsFeaturesEpic = (action$, { getState }) => + action$.ofType(MERGE_ANNOTATIONS_FEATURES) + .switchMap((action) => { + const { annotation } = action; + const updateSession = (source) => ({ + features: [ + ...(source?.features || []), + ...(annotation?.features || []) + ], + style: { + ...annotation?.style, + ...source?.style, + body: { + ...annotation?.style?.body, + ...source?.style?.body, + rules: [ + ...(source?.style?.body?.rules || []), + ...(annotation?.style?.body?.rules || []) + ] + } + } + }); + const state = getState(); + const selected = getLayerFromId(state, action.id); + const session = getAnnotationsSession(state); + return Rx.Observable.of( + ...(session ? [ storeAnnotationsSession(updateSession(session)) ] : []), + updateNode(selected.id, 'layer', { + _v_: uuidv1(), + ...updateSession(selected) + }) + ); + }); + +export default { + loadAnnotationsEpic, + newAnnotationEpic, + editAnnotationEpic, + downloadAnnotationsEpic, + confirmCloseAnnotationsEpic, + removeAnnotationsEpic, + mergeAnnotationsFeaturesEpic +}; diff --git a/web/client/plugins/Annotations/index.js b/web/client/plugins/Annotations/index.js new file mode 100644 index 0000000000..443fd3a649 --- /dev/null +++ b/web/client/plugins/Annotations/index.js @@ -0,0 +1,124 @@ +/* + * Copyright 2017, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. +*/ + +import { createPlugin } from '../../utils/PluginsUtils'; +import epics from './epics/annotations'; +import annotations from './reducers/annotations'; +import AnnotationsEditor from './containers/AnnotationsEditor'; +import AnnotationsPanel from './containers/AnnotationsPanel'; +import AnnotationsTOCButton from './containers/AnnotationsTOCButton'; + +/** + * Annotations Plugin. Implements annotations handling on maps. + * @prop {object[]} lineDashOptions `[{value: [line1 gap1 line2 gap2 line3...]}, {...}]` defines how dashed lines are displayed. + * Use values without unit identifier. + * If an odd number of values is inserted then they are added again to reach an even number of values + * for more information see [this page](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray) + * @prop {string} defaultPointType default point type of marker geometry type. Can be `'marker'` or `'symbol'` + * @prop {string} defaultShape the default symbol used when switching for the symbol styler + * @prop {string} defaultShapeStrokeColor default symbol stroke color + * @prop {string} defaultShapeFillColor default symbol fill color + * @prop {number} defaultShapeSize default symbol shape size in px + * @prop {string} format `'decimal'` or `'aeronautical'` degree for coordinates + * @prop {string} defaultTextAnnotation default text value for text annotations (default: `'New'`) + * @prop {object} geometryEditorOptions properties to be passed to `CoordinatesEditor` of `GeometryEditor`. For more information refer to the documentation of `CoordinatesEditor` component + * @prop {string} symbolsPath the relative path to the symbols folder where `symbols.json` and SVGs are located (starting from the `index.html` folder, i.e. the root) `symbols.json` can be structured like [this](https://github.com/geosolutions-it/MapStore2/blob/90fb33465fd3ff56c4bbaafb5ab0ed492826622c/web/client/product/assets/symbols/symbols.json) + * `symbols.json` present in `symbolsPath` folder is mandatory and it contains the list of symbols to be used in the Annotations Plugin + * - width and height of SVGs should be 64px + * - the `name` is related to the filename of the symbol (the file must be named `<name>.svg`). + * - the `label` is the name used in the symbol dropdown menu + * ``` + * [ + * {"name": "filename", "label": "label"}, + * {"name": "square", "label": "Square"} + * ] + * ``` + * @prop {boolean} geodesic **deprecated** draw geodesic annotation. By default `geodesic` is `true` (Currently applicable only for "circle" annotation type) + * @prop {object[]} fields **deprecated** Available annotation fields (`title` and `description` are mandatory). A list of object specifying: + * - `name`: the field synthetic name + * - `type`: type of value for the field (`'text'` or `'html'`) + * - `validator`: (optional) function for rule for validation + * - `validationError`: (optional) id for the translations file containing the validation error message + * - `showLabel`: whether to show or not the label of the field in the viewer / editor + * - `editable`: whether the field can be edited or not in editing mode + * @class Annotations + * @memberof plugins + * @static + * @example + * // Example of plugin configuration + * + *{ + * "name": "Annotations", + * "cfg": { + * "defaultPointType": "symbol", + * "defaultShape": "traffic-cone", + * "defaultShapeStrokeColor": "#00ffff", + * "defaultShapeFillColor": "rgba(0, 255, 50, 0.5)", + * "defaultShapeSize": 128, + * "format": "aeronautical", + * "defaultTextAnnotation": "New", + * "geometryEditorOptions": { + * "measureOptions": { + * "displayUom": "nm" + * } + * }, + * "lineDashOptions": [ + * { "value": "0" }, + * { "value": "1 4" }, + * { "value": "1 12" }, + * { "value": "8 8" } + * ], + * "symbolsPath": "product/assets/symbols/", + * "geodesic": true, + * "fields": [ + * { + * "name": "title", + * "type": "text", + * "validator": "{(val) => val}", + * "validateError": "annotations.mandatory", + * "showLabel": true, + * "editable": true + * }, + * { + * "name": "description", + * "type": "html", + * "showLabel": true, + * "editable": true + * }, + * { + * "name": "myattribute", + * "type": "text", + * "editable": true, + * "showLabel": true, + * "validator": "{(value = '') => !value.includes('fake')}", + * "validateError": "annotations.error.fake" + * } + * ] + * } + *} + */ +export default createPlugin('Annotations', { + component: AnnotationsPanel, + containers: { + TOC: { + doNotHide: true, + name: 'Annotations', + target: 'toolbar', + Component: AnnotationsTOCButton + }, + Map: { + name: 'Annotations', + Tool: AnnotationsEditor, + alwaysRender: true + } + }, + reducers: { + annotations + }, + epics +}); diff --git a/web/client/plugins/Annotations/reducers/__tests__/annotations-test.js b/web/client/plugins/Annotations/reducers/__tests__/annotations-test.js new file mode 100644 index 0000000000..eb94b27a86 --- /dev/null +++ b/web/client/plugins/Annotations/reducers/__tests__/annotations-test.js @@ -0,0 +1,50 @@ +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +import expect from 'expect'; + +import annotations from '../annotations'; + +import { + editAnnotation, + closeAnnotations, + confirmCloseAnnotations, + cancelCloseAnnotations, + storeAnnotationsSession, + selectAnnotationFeature +} from '../../actions/annotations'; + +describe('annotations reducer', () => { + it('edit annotation', () => { + const state = annotations({}, editAnnotation('annotations:1')); + expect(state.editing).toBe(true); + }); + it('close annotations', () => { + const state = annotations({}, closeAnnotations()); + expect(state.closeId).toBe(1); + }); + it('confirm close annotations', () => { + const state = annotations({}, confirmCloseAnnotations()); + expect(state.editing).toBe(false); + expect(state.closeId).toBe(0); + expect(state.session).toBe(null); + }); + it('cancel close annotations', () => { + const state = annotations({}, cancelCloseAnnotations()); + expect(state.closeId).toBe(0); + }); + it('store annotations session', () => { + const session = { features: [], style: { format: 'geostyler', body: { name: '', rules: [] } } }; + const state = annotations({}, storeAnnotationsSession(session)); + expect(state.session).toEqual(session); + }); + it('select annotation feature', () => { + const state = annotations({}, selectAnnotationFeature('feature-01')); + expect(state.featureId).toBe('feature-01'); + }); +}); diff --git a/web/client/plugins/Annotations/reducers/annotations.js b/web/client/plugins/Annotations/reducers/annotations.js new file mode 100644 index 0000000000..bb83138623 --- /dev/null +++ b/web/client/plugins/Annotations/reducers/annotations.js @@ -0,0 +1,67 @@ +/* + * Copyright 2017, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { + CLOSE_ANNOTATIONS, + EDIT_ANNOTATION, + NEW_ANNOTATION, + CONFIRM_CLOSE_ANNOTATIONS, + CANCEL_CLOSE_ANNOTATIONS, + STORE_ANNOTATIONS_SESSION, + SELECT_ANNOTATION_FEATURE +} from '../actions/annotations'; + +function annotations(state = {}, action) { + switch (action.type) { + case STORE_ANNOTATIONS_SESSION: { + return { + ...state, + session: action.session + }; + } + case SELECT_ANNOTATION_FEATURE: { + return { + ...state, + featureId: action.id + }; + } + case NEW_ANNOTATION: + case EDIT_ANNOTATION: { + return { + ...state, + editing: true, + closeId: 0 + }; + } + case CLOSE_ANNOTATIONS: { + return { + ...state, + closeId: (state.closeId || 0) + 1 + }; + } + case CONFIRM_CLOSE_ANNOTATIONS: { + return { + ...state, + editing: false, + closeId: 0, + session: null + }; + } + case CANCEL_CLOSE_ANNOTATIONS: { + return { + ...state, + closeId: 0 + }; + } + default: + return state; + + } +} + +export default annotations; diff --git a/web/client/plugins/Annotations/selectors/__tests__/annotations-test.js b/web/client/plugins/Annotations/selectors/__tests__/annotations-test.js new file mode 100644 index 0000000000..1ba3715e84 --- /dev/null +++ b/web/client/plugins/Annotations/selectors/__tests__/annotations-test.js @@ -0,0 +1,146 @@ +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +import expect from 'expect'; + +import { + annotationsLayerSelector, + annotationsLayersSelector, + getSelectedAnnotationLayer, + editingSelector, + getAnnotationsSession, + getSelectedAnnotationFeatureId +} from '../annotations'; + +describe('annotations selectors', () => { + it('annotationsLayerSelector', () => { + const state = { + layers: { + flat: [ + { + id: 'layer-01', + type: 'vector', + title: 'Vector', + features: [] + }, + { + id: 'annotations:1', + type: 'vector', + title: 'Annotations', + rowViewer: 'annotations', + features: [] + } + ] + } + }; + expect(annotationsLayerSelector(state)).toEqual({ + id: 'annotations:1', + type: 'vector', + title: 'Annotations', + rowViewer: 'annotations', + features: [] + }); + }); + it('annotationsLayersSelector', () => { + const state = { + layers: { + flat: [ + { + id: 'layer-01', + type: 'vector', + title: 'Vector', + features: [] + }, + { + id: 'annotations:1', + type: 'vector', + title: 'Annotations', + rowViewer: 'annotations', + features: [] + }, + { + id: 'annotations:2', + type: 'vector', + title: 'Annotations', + rowViewer: 'annotations', + features: [] + } + ] + } + }; + expect(annotationsLayersSelector(state)).toEqual([ + { + id: 'annotations:1', + type: 'vector', + title: 'Annotations', + rowViewer: 'annotations', + features: [] + }, + { + id: 'annotations:2', + type: 'vector', + title: 'Annotations', + rowViewer: 'annotations', + features: [] + } + ]); + }); + it('getSelectedAnnotationLayer', () => { + const state = { + layers: { + flat: [ + { + id: 'layer-01', + type: 'vector', + title: 'Vector', + features: [] + }, + { + id: 'annotations:1', + type: 'vector', + title: 'Annotations', + rowViewer: 'annotations', + features: [] + } + ], + selected: ['annotations:1'] + } + }; + expect(getSelectedAnnotationLayer(state)).toEqual({ + id: 'annotations:1', + type: 'vector', + title: 'Annotations', + rowViewer: 'annotations', + features: [] + }); + }); + it('editingSelector', () => { + const state = { + annotations: { + editing: true + } + }; + expect(editingSelector(state)).toBe(true); + }); + it('getAnnotationsSession', () => { + const state = { + annotations: { + session: { features: [] } + } + }; + expect(getAnnotationsSession(state)).toEqual({ features: [] }); + }); + it('getSelectedAnnotationFeatureId', () => { + const state = { + annotations: { + featureId: 'feature-01' + } + }; + expect(getSelectedAnnotationFeatureId(state)).toBe('feature-01'); + }); +}); diff --git a/web/client/plugins/Annotations/selectors/annotations.js b/web/client/plugins/Annotations/selectors/annotations.js new file mode 100644 index 0000000000..9775a81ee7 --- /dev/null +++ b/web/client/plugins/Annotations/selectors/annotations.js @@ -0,0 +1,59 @@ +/* +* Copyright 2017, GeoSolutions Sas. +* All rights reserved. +* +* This source code is licensed under the BSD-style license found in the +* LICENSE file in the root directory of this source tree. +*/ + +import { createSelector } from 'reselect'; +import { + layersSelector, + getSelectedLayer +} from '../../../selectors/layers'; +import { isAnnotationLayer } from '../utils/AnnotationsUtils'; +/** + * It returns the first annotation layer available in map + * @param {object} state + * @returns {object} + */ +export const annotationsLayerSelector = createSelector( + [layersSelector], + (layers) => layers.find(isAnnotationLayer) +); +/** + * It returns all annotation layers available in map + * @param {object} state + * @returns {array} + */ +export const annotationsLayersSelector = createSelector( + [layersSelector], + (layers) => layers.filter(isAnnotationLayer) +); +/** + * It returns the selected annotation layer + * @param {object} state + * @returns {object} + */ +export const getSelectedAnnotationLayer = (state) => { + const selectedLayer = getSelectedLayer(state); + return selectedLayer && isAnnotationLayer(selectedLayer) ? selectedLayer : null; +}; +/** + * It returns the annotation editing state + * @param {object} state + * @returns {boolean} + */ +export const editingSelector = (state) => state?.annotations?.editing; +/** + * It returns the current editing session + * @param {object} state + * @returns {boolean} + */ +export const getAnnotationsSession = (state) => state?.annotations?.session; +/** + * It returns the id of the selected feature annotation + * @param {object} state + * @returns {string} + */ +export const getSelectedAnnotationFeatureId = (state) => state?.annotations?.featureId; diff --git a/web/client/plugins/Annotations/utils/AnnotationsUtils.js b/web/client/plugins/Annotations/utils/AnnotationsUtils.js new file mode 100644 index 0000000000..8380d4447a --- /dev/null +++ b/web/client/plugins/Annotations/utils/AnnotationsUtils.js @@ -0,0 +1,756 @@ +/* + * Copyright 2018, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. +*/ + +import uuidv1 from 'uuid/v1'; +import { slice, head, last, get, isNaN, isEqual, isNumber } from 'lodash'; +import turfBbox from '@turf/bbox'; +import { measureIcons } from '../../../utils/MeasureUtils'; + +// legacy style +export const STYLE_CIRCLE = { + color: '#ffcc33', + opacity: 1, + weight: 3, + fillColor: '#ffffff', + fillOpacity: 0.2 +}; +// legacy style +export const STYLE_POINT_MARKER = { + iconGlyph: 'comment', + iconShape: 'square', + iconColor: 'blue' +}; +// legacy style +export const STYLE_POINT_SYMBOL = { + iconAnchor: [0.5, 0.5], + anchorXUnits: 'fraction', + anchorYUnits: 'fraction', + color: "#000000", + fillColor: "#000000", + opacity: 1, + size: 64, + fillOpacity: 1 +}; +// legacy style +export const STYLE_TEXT = { + fontStyle: 'normal', + fontSize: '14', + fontSizeUom: 'px', + fontFamily: 'Arial', + fontWeight: 'normal', + font: "14px Arial", + textAlign: 'center', + color: '#000000', + opacity: 1, + fillColor: '#000000', + fillOpacity: 1 +}; +// legacy style +export const STYLE_LINE = { + color: '#ffcc33', + opacity: 1, + weight: 3, + editing: { + fill: 1 + } +}; +// legacy style +export const STYLE_POLYGON = { + color: '#ffcc33', + opacity: 1, + weight: 3, + fillColor: '#ffffff', + fillOpacity: 0.2, + editing: { + fill: 1 + } +}; +// legacy styles +export const DEFAULT_ANNOTATIONS_STYLES = { + "Text": STYLE_TEXT, + "Point": STYLE_POINT_MARKER, + "Circle": STYLE_CIRCLE, + "MultiPoint": STYLE_POINT_MARKER, + "LineString": STYLE_LINE, + "MultiLineString": STYLE_LINE, + "Polygon": STYLE_POLYGON, + "MultiPolygon": STYLE_POLYGON +}; +// The constant for annotation type +export const ANNOTATION_TYPE = "ms2-annotations"; +// The constant for annotations +export const ANNOTATIONS = "annotations"; +/** + * It returns true if the layer is an annotations layer + * @param {object} layer MapStore layer object + * @returns {boolean} + */ +export const isAnnotationLayer = (layer) => (layer.id || '').includes(`${ANNOTATIONS}:`) && layer.rowViewer === ANNOTATIONS; +/** + * Legacy: utility to check if the GeoJSON has the annotation model structure i.e. {"type": "ms2-annotations", "features": [list of FeatureCollection]} + * or the imported annotation object's name is of "Annotations" + * @param {object} json GeoJSON/plain object + * @returns {boolean} if the GeoJSON passes is a ms2-annotation or if the name property of the object passed is Annotations + */ +export const isMSAnnotation = (json) => json?.type === ANNOTATION_TYPE || json?.name === "Annotations"; +/** + * It returns true if the FeatureCollection is a MapStore annotations + * @param {object} json json object, FeatureCollection type + * @returns {boolean} + */ +export const isGeoJSONAnnotation = (json) => json?.type === 'FeatureCollection' && json?.msType === ANNOTATIONS; +/** + * It returns true if the json is a MapStore annotations, including legacy annotations + * @param {object} json json object, FeatureCollection type + * @returns {boolean} + */ +export const isAnnotation = (json) => isMSAnnotation(json) || isGeoJSONAnnotation(json); +/** + * Return a valid id for annotations layer + * @param {string} id existing annotation id + * @returns {boolean} + */ +export const createAnnotationId = (id) => !id + ? `${ANNOTATIONS}:${uuidv1()}` + : `${id}`.includes(`${ANNOTATIONS}:`) + ? id + : `${ANNOTATIONS}:${id}`; +export const validateCoords = ({lat, lon, height} = {}) => !isNaN(parseFloat(lat)) && !isNaN(parseFloat(lon)) && (height !== undefined ? !isNaN(parseFloat(height)) : true); +export const coordToArray = (c = {}) => [c.lon, c.lat, ...(c.height !== undefined ? [c.height] : [])]; +export const validateCoordsArray = ([lon, lat, height] = []) => !isNaN(parseFloat(lat)) && !isNaN(parseFloat(lon)) && (height !== undefined ? !isNaN(parseFloat(height)) : true); +export const getStylesObject = ({type = "Point", features = []} = {}) => { + return type === "FeatureCollection" ? features.reduce((p, c) => { + p[c.geometry.type] = DEFAULT_ANNOTATIONS_STYLES[c.geometry.type]; + return p; + }, {type: "FeatureCollection"}) : {...DEFAULT_ANNOTATIONS_STYLES[type]}; +}; +export const getProperties = (props = {}) => ({title: "Default title", id: uuidv1(), ...props}); +/** +* it converts any geoJSONObject to an annotation +* Mandatory elements: MUST be a geoJSON type Feature => properties with an ID and a title +* annotation style. +*/ +export const normalizeAnnotation = (ann = {}, messages = {}) => { + const annotation = ann.type === "FeatureCollection" ? {...ann} : {type: "Feature", geometry: ann}; + const style = getStylesObject(annotation); + const properties = getProperties(annotation.properties, messages); + return {style, properties, ...annotation}; +}; +/** + * it tells if the filtered list of the coordinates is a geojson polygon, + * with the first point = to the last + * @param {number[[[]]]} coords the coordinates of the polygon + * @return {boolean} true if it is a valid polygon, false otherwise +*/ +export const isCompletePolygon = (coords = [[[]]]) => { + if (coords && coords[0]) { + const validCoords = coords[0].filter(validateCoordsArray); + return validCoords.length > 3 && head(validCoords)[0] === last(validCoords)[0] && head(validCoords)[1] === last(validCoords)[1]; + } + return false; +}; +export const formatCoordinates = (coords = [[]]) => { + return coords.map(c => ({ + lat: c && c[1], + lon: c && c[0], + ...(c[2] !== undefined && { height: c[2] }) + })); +}; +export const getComponents = (geometry) => { + const coordinates = get(geometry, 'coordinates', []); + switch (geometry?.type) { + case "Polygon": { + return isCompletePolygon(coordinates) ? formatCoordinates(slice(coordinates[0], 0, coordinates[0].length - 1)) : formatCoordinates(coordinates[0]); + } + case "LineString": case "MultiPoint": { + return formatCoordinates(coordinates); + } + default: return formatCoordinates([coordinates]); + } +}; +/** + * This function takes an old annotations layer and converts it to a list of new annotations layers + * @param {object} layer legacy annotation layer + * @returns {array} + */ +export const updateAnnotationsLayer = (layer = {}) => { + if (layer.id === ANNOTATIONS) { + return (layer.features || []) + .map((annotation) => { + const features = annotation.features.map(({ + properties, + geometry, + type + }) => { + let annotationType = geometry?.type; + let annotationTypeProperties = { geodesic: !!(properties.geometryGeodesic || properties.useGeodesicLines) }; + let annotationTypeGeometry = geometry; + if (properties.isText) { + annotationType = 'Text'; + annotationTypeProperties = { + label: properties.valueText + }; + } + if (properties.isCircle) { + annotationType = 'Circle'; + annotationTypeProperties = { + radius: properties.radius, + geodesic: true + }; + annotationTypeGeometry = { + type: 'Point', + coordinates: properties.center + }; + } + return { + id: properties.id, + properties: { + ...annotationTypeProperties, + id: properties.id, + annotationType, + name: properties.geometryTitle ?? annotationType + }, + geometry: annotationTypeGeometry, + type + }; + }); + const [minx, miny, maxx, maxy] = turfBbox({ type: 'FeatureCollection', features }); + return { + ...layer, + id: createAnnotationId(annotation?.properties?.id || uuidv1()), + title: annotation?.properties?.title || '', + description: annotation?.properties?.description, + visibility: annotation?.properties?.visibility, + rowViewer: ANNOTATIONS, + bbox: { + crs: 'EPSG:4326', + bounds: { minx, miny, maxx, maxy } + }, + style: { + format: 'geostyler', + body: { + name: '', + rules: annotation.features.reduce((acc, { + geometry, + properties, + style: styles + }) => { + return [ + ...acc, + ...(styles || []).filter(style => style.filtering !== false).map((style) => { + if (style.iconColor) { + return { + filter: ['==', 'id', properties.id], + name: style.title ?? '', + symbolizers: [ + { + kind: 'Icon', + image: { + name: 'msMarkerIcon', + args: [ + { + color: style.iconColor, + shape: style.iconShape, + glyph: style.iconGlyph + } + ] + }, + anchor: 'bottom', + opacity: 1, + size: 48, + rotate: 0, + msBringToFront: false, + msHeightReference: 'none', + ...(style.geometry && { + msGeometry: { + name: style.geometry + } + }) + } + ] + }; + } + if (style.type === 'Circle') { + return { + filter: ['==', 'id', properties.id], + name: style.title ?? '', + symbolizers: [ + { + kind: 'Circle', + color: style.fillColor, + opacity: style.fillOpacity, + outlineColor: style.color, + outlineOpacity: style.opacity, + outlineWidth: style.weight, + ...(style.dashArray && { + outlineDasharray: style.dashArray.map(value => parseFloat(value)) + }), + radius: { + name: 'property', + args: ['radius'] + }, + geodesic: { + name: 'property', + args: ['geodesic'] + } + } + ] + }; + } + if (style.type === 'Text') { + return { + filter: ['==', 'id', properties.id], + name: style.title ?? '', + symbolizers: [ + { + kind: 'Text', + label: '{{label}}', + font: [style.fontFamily], + color: style.fillColor, + opacity: style.fillOpacity, + size: style.fontSize, + // style.fontSizeUom + fontStyle: style.fontStyle, + fontWeight: style.fontWeight, + haloColor: style.color, + haloOpacity: style.opacity, + haloWidth: style.weight ?? 1, + allowOverlap: true, + offset: [0, 0], + msBringToFront: false, + msHeightReference: 'none' + } + ] + }; + } + if (style.symbolUrl) { + return { + filter: ['==', 'id', properties.id], + name: style.title ?? '', + symbolizers: [ + { + kind: 'Mark', + wellKnownName: style.symbolUrl, + color: style.fillColor, + fillOpacity: style.fillOpacity, + strokeColor: style.color, + strokeOpacity: style.opacity, + strokeWidth: style.weight, + ...(style.dashArray && { + strokeDasharray: style.dashArray.map(value => parseFloat(value)) + }), + radius: style.size / 2, + rotate: 0, + msBringToFront: false, + msHeightReference: 'none' + } + ] + }; + } + if (geometry.type === 'LineString') { + return { + filter: ['==', 'id', properties.id], + name: style.title ?? '', + symbolizers: [ + { + kind: 'Line', + color: style.color, + width: style.weight, + opacity: style.opacity, + cap: 'round', + join: 'round', + msClampToGround: false, + ...(style.dashArray && { + dasharray: style.dashArray.map(value => parseFloat(value)) + }) + } + ] + }; + } + if (geometry.type === 'Polygon') { + return { + filter: ['==', 'id', properties.id], + name: style.title ?? '', + symbolizers: [ + { + kind: 'Fill', + color: style.fillColor, + fillOpacity: style.fillOpacity, + outlineColor: style.color, + outlineOpacity: style.opacity, + outlineWidth: style.weight, + ...(style.dashArray && { + outlineDasharray: style.dashArray.map(value => parseFloat(value)) + }), + msClassificationType: 'both', + msClampToGround: true + } + ] + }; + } + return null; + }).filter(rule => rule !== null) + ]; + }, []) + } + }, + features + }; + }); + } + return []; +}; +/** + * This function takes an annotations layer and converts it to valid GeoJSON Feature Collection usable for export + * @param {array} annotations annotations layers + * @returns {object} + */ +export const annotationsToGeoJSON = (annotations) => { + const features = annotations.reduce((acc, annotation) => { + return [ + ...acc, + ...(annotation.features || []).map((feature) => { + return { + ...feature, + properties: { + ...feature.properties, + annotationLayerId: annotation.id, + annotationLayerTitle: annotation.title, + annotationLayerDescription: annotation.description + } + }; + }) + ]; + }, []); + return { + type: 'FeatureCollection', + msType: ANNOTATIONS, + features, + annotations: annotations.map(annotation => { + const { format, body } = annotation?.style || {}; + return { + id: annotation.id, + style: { + format, + body + } + }; + }) + }; +}; +/** + * This function takes an GeoJSON layer with specific information and converts it to a valid annotation layers + * @param {object} json GeoJSON feature collection with special annotations property, created with `annotationsToGeoJSON` method + * @returns {array} + */ +export const geoJSONToAnnotations = (json) => { + const layers = (json?.annotations || []) + .map((annotation) => { + const features = (json?.features || []) + .filter((feature) => feature?.properties?.annotationLayerId === annotation.id); + const { + annotationLayerTitle: title, + annotationLayerDescription: description + } = features?.[0]?.properties || {}; + return { + ...annotation, + title, + description, + type: 'vector', + visibility: true, + rowViewer: ANNOTATIONS, + features: features.map((feature) => { + const { + annotationLayerId, + annotationLayerTitle, + annotationLayerDescription, + ...properties + } = feature?.properties || {}; + return { + ...feature, + properties + }; + }) + }; + }); + return layers; +}; +/** + * This function takes a json object and check if it could be converted in an array of annotations layers + * @param {object} json it could be a GeoJSON with special annotations property or a legacy annotation export + * @returns {array} + */ +export const importJSONToAnnotations = (json) => { + if (isMSAnnotation(json)) { + const features = json?.features.map((annotation) => normalizeAnnotation(annotation)); + const annotationsLayer = { + type: 'vector', + visibility: true, + id: ANNOTATIONS, + title: 'Annotations', + features + }; + return updateAnnotationsLayer(annotationsLayer); + } + if (isGeoJSONAnnotation(json)) { + return geoJSONToAnnotations(json); + } + return []; +}; +/** + * Check if the coordinates is invalid + * @param {number} coordinate + * @returns {boolean} + */ +export const checkInvalidCoordinate = (coord) => !(isNumber(coord) && !isNaN(coord)); +/** + * Fix polygon coordinates to ensure a closed ring + * @param {array} coordinates GeoJSON polygon coordinates + * @returns {array} + */ +export const cleanPolygonCoordinates = (coordinates) => { + const firstCoordinates = coordinates[0][0]; + const lastCoordinates = coordinates[0][coordinates[0].length - 1]; + const validCoordinates = coordinates[0].filter((coords) => !coords.some(checkInvalidCoordinate)); + return isEqual(firstCoordinates, lastCoordinates) + ? coordinates + : validCoordinates.length >= 3 + ? [[...coordinates[0], firstCoordinates]] + : coordinates; +}; +/** + * Parse coordinates updated with geometry editor component to be assigned to the correct feature type + * @param {string} geometryType one of `Point`, `LineString` or `Polygon` + * @param {array} updatedCoordinates coordinates to check + * @returns {array} + */ +export const parseUpdatedCoordinates = (geometryType, updatedCoordinates) => { + const hasHeight = !!updatedCoordinates.find((coords) => coords[2] !== undefined); + const coordinates = hasHeight ? updatedCoordinates.map(([lng, lat, height]) => [lng, lat, height === undefined ? 0 : height]) : updatedCoordinates; + if (geometryType === 'Point') { + return coordinates[0]; + } + if (geometryType === 'Polygon') { + return cleanPolygonCoordinates([coordinates]); + } + return coordinates; +}; +// new default style symbolizers for annotations +export const annotationsSymbolizerDefaultProperties = { + Icon: { + kind: 'Icon', + image: { + name: 'msMarkerIcon', + args: [ + { + color: 'blue', + shape: 'circle', + glyph: 'comment' + } + ] + }, + opacity: 1, + size: 46, + rotate: 0, + msBringToFront: false, + anchor: 'bottom', + msHeightReference: 'none' + }, + Line: { + kind: 'Line', + color: '#777777', + width: 1, + opacity: 1, + cap: 'round', + join: 'round', + msClampToGround: false + }, + Fill: { + kind: 'Fill', + color: '#dddddd', + fillOpacity: 1, + outlineColor: '#777777', + outlineWidth: 1, + msClassificationType: 'both' + }, + Circle: { + kind: 'Circle', + color: '#dddddd', + opacity: 1, + outlineColor: '#777777', + outlineOpacity: 1, + outlineWidth: 1, + msClassificationType: 'both' + }, + Text: { + kind: 'Text', + color: '#333333', + size: 14, + font: ['Arial'], + fontStyle: 'normal', + fontWeight: 'normal', + haloColor: '#ffffff', + haloWidth: 1, + allowOverlap: true, + offset: [0, 0], + msBringToFront: false, + msHeightReference: 'none', + anchor: 'bottom' + } +}; +/** + * It return a default style symbolizer for annotations that could be used in a geostyler style + * @param {object} feature a GeoJSON feature with `annotationType` property + * @param {object} defaultSymbolizers optional styles overrides, see `annotationsSymbolizerDefaultProperties` + * @returns {object} + */ +export const createDefaultStyleSymbolizer = (feature, defaultSymbolizers = {}) => { + const { annotationType } = feature?.properties || {}; + const defaultSymbolizer = defaultSymbolizers[annotationType]; + if (annotationType === 'Point') { + return defaultSymbolizer || annotationsSymbolizerDefaultProperties.Icon; + } + if (annotationType === 'LineString') { + return defaultSymbolizer || annotationsSymbolizerDefaultProperties.Line; + } + if (annotationType === 'Polygon') { + return defaultSymbolizer || annotationsSymbolizerDefaultProperties.Fill; + } + if (annotationType === 'Circle') { + return { + ...(defaultSymbolizer || annotationsSymbolizerDefaultProperties.Circle), + msClampToGround: { + name: 'property', + args: ['geodesic'] + }, + radius: { + name: 'property', + args: ['radius'] + }, + geodesic: { + name: 'property', + args: ['geodesic'] + } + }; + } + if (annotationType === 'Text') { + return { + ...(defaultSymbolizer || annotationsSymbolizerDefaultProperties.Text), + label: '{{label}}' + }; + } + return null; +}; +// validate properties for specific annotation features +const validateProperties = (feature) => { + if (feature?.properties?.annotationType === 'Text') { + return !!feature?.properties?.label; + } + if (feature?.properties?.annotationType === 'Circle') { + return !!feature?.properties?.radius; + } + return true; +}; +/** + * It validates an annotation feature + * @param {object} feature a GeoJSON feature with `annotationType` property + * @param {boolean} onlyCoordinates if true validate only the coordinates + * @returns {boolean} + */ +export const validateFeature = (feature, onlyCoordinates) => { + const geometryType = feature?.geometry?.type; + const coordinates = feature?.geometry?.coordinates; + if (geometryType === 'Point') { + return (onlyCoordinates + ? !coordinates.some(checkInvalidCoordinate) + : validateProperties(feature)) && !coordinates.some(checkInvalidCoordinate); + } + if (geometryType === 'LineString') { + return coordinates.length > 1 && !coordinates.some((coords) => coords.some(checkInvalidCoordinate)); + } + if (geometryType === 'Polygon') { + return coordinates?.[0]?.length > 3 && !coordinates.some((rings) => + rings.some((coords) => coords.some(checkInvalidCoordinate)) + ); + } + return !!geometryType; +}; +/** + * It applies default invalid coordinates for new annotation features + * @param {object} feature a GeoJSON feature with `annotationType` property + * @returns {object} + */ +export const applyDefaultCoordinates = (feature) => { + if (feature.geometry === null && feature?.properties?.annotationType) { + if (feature.properties.annotationType === 'Point') { + return { + ...feature, + geometry: { + type: 'Point', + coordinates: ['', ''] + } + }; + } + if (feature.properties.annotationType === 'LineString') { + return { + ...feature, + geometry: { + type: 'LineString', + coordinates: [['', '']] + } + }; + } + if (feature.properties.annotationType === 'Polygon') { + return { + ...feature, + geometry: { + type: 'Polygon', + coordinates: [[['', '']]] + } + }; + } + if (feature.properties.annotationType === 'Text') { + return { + ...feature, + geometry: { + type: 'Point', + coordinates: ['', ''] + } + }; + } + if (feature.properties.annotationType === 'Circle') { + return { + ...feature, + geometry: { + type: 'Point', + coordinates: ['', ''] + } + }; + } + } + return feature; +}; +/** + * It returns a glyph name associated with an annotation + * @param {object} feature a GeoJSON feature with `annotationType` or `measureType` properties + * @returns {string} + */ +export const getFeatureIcon = (feature) => { + + if (feature?.properties?.measureType) { + return measureIcons[feature.properties.measureType]; + } + const annotationsIcons = { + 'Point': 'point', + 'LineString': 'polyline', + 'Polygon': 'polygon', + 'Text': 'font', + 'Circle': '1-circle' + }; + return annotationsIcons[feature?.properties?.annotationType]; +}; diff --git a/web/client/plugins/Annotations/utils/__tests__/AnnotationsUtils-test.js b/web/client/plugins/Annotations/utils/__tests__/AnnotationsUtils-test.js new file mode 100644 index 0000000000..f78c0a8eaf --- /dev/null +++ b/web/client/plugins/Annotations/utils/__tests__/AnnotationsUtils-test.js @@ -0,0 +1,605 @@ +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. +*/ +import expect from 'expect'; +import { + isAnnotationLayer, + isAnnotation, + createAnnotationId, + validateCoords, + coordToArray, + validateCoordsArray, + getComponents, + updateAnnotationsLayer, + annotationsToGeoJSON, + geoJSONToAnnotations, + importJSONToAnnotations, + checkInvalidCoordinate, + parseUpdatedCoordinates, + validateFeature, + applyDefaultCoordinates, + getFeatureIcon +} from '../AnnotationsUtils'; + +describe('AnnotationsUtils', () => { + it('isAnnotationLayer', () => { + expect(isAnnotationLayer({ id: 'annotations:01', rowViewer: 'annotations', features: [], type: 'vector' })).toBe(true); + expect(isAnnotationLayer({ id: '01', features: [], type: 'vector' })).toBe(false); + }); + it('isAnnotation', () => { + expect(isAnnotation({ type: 'ms2-annotations', features: [] })).toBe(true); + expect(isAnnotation({ name: 'Annotations', features: [] })).toBe(true); + expect(isAnnotation({ type: 'FeatureCollection', msType: 'annotations', features: [] })).toBe(true); + expect(isAnnotation({ type: 'FeatureCollection', features: [] })).toBe(false); + }); + it('createAnnotationId', () => { + expect(createAnnotationId('01')).toBe('annotations:01'); + expect(createAnnotationId('annotations:01')).toBe('annotations:01'); + expect(createAnnotationId().includes('annotations:')).toBe(true); + }); + it('validateCoords', () => { + expect(validateCoords({ lat: '', lon: 0 })).toBe(false); + expect(validateCoords({ lat: 0, lon: 0 })).toBe(true); + expect(validateCoords({ lat: 0, lon: 0, height: '' })).toBe(false); + expect(validateCoords({ lat: 0, lon: 0, height: 0 })).toBe(true); + }); + it('coordToArray', () => { + expect(coordToArray({ lat: 0, lon: 0, height: 0 })).toEqual([0, 0, 0]); + expect(coordToArray({ lat: 0, lon: 0 })).toEqual([0, 0]); + }); + it('coordToArray', () => { + expect(validateCoordsArray(['', 0])).toBe(false); + expect(validateCoordsArray([0, 0])).toBe(true); + expect(validateCoordsArray([0, 0, ''])).toBe(false); + expect(validateCoordsArray([0, 0, 0])).toBe(true); + }); + it('getComponents', () => { + expect(getComponents({ coordinates: [[[0, 0], [1, 1], [1, 0], [0, 0]]], type: 'Polygon' })) + .toEqual([ { lat: 0, lon: 0 }, { lat: 1, lon: 1 }, { lat: 0, lon: 1 } ]); + + expect(getComponents({ coordinates: [[0, 0], [1, 1], [1, 0]], type: 'LineString' })) + .toEqual([ { lat: 0, lon: 0 }, { lat: 1, lon: 1 }, { lat: 0, lon: 1 } ]); + + expect(getComponents({ coordinates: [0, 0], type: 'Point' })) + .toEqual([ { lat: 0, lon: 0 } ]); + }); + it('updateAnnotationsLayer', () => { + + const oldAnnotationsLayer = { + id: 'annotations', + features: [ + { + type: 'FeatureCollection', + properties: { + title: 'Annotation 1', + description: '<p>The annotation number 1</p>', + id: '6963f020-a19f-11e9-bb35-a7155c9e9b22', + visibility: false + }, + features: [ + { + type: 'Feature', + geometry: { + coordinates: [ + -74.81689453125001, + 34.24359472969738 + ], + type: 'Point' + }, + properties: { + id: '75575340-a19f-11e9-bb35-a7155c9e9b22', + isValidFeature: true, + canEdit: false + }, + style: [ + { + iconGlyph: 'comment', + iconShape: 'star', + iconColor: 'cyan', + highlight: false, + id: '7557a160-a19f-11e9-bb35-a7155c9e9b22' + } + ] + } + ], + style: {} + }, + { + type: 'FeatureCollection', + properties: { + title: 'Annotation 2', + description: '<p>The annotation number 2</p>', + id: '80145940-a19f-11e9-bb35-a7155c9e9b22', + visibility: false + }, + features: [ + { + type: 'Feature', + geometry: { + coordinates: [ + -72.79541015625001, + 34.569906380856345 + ], + type: 'Point' + }, + properties: { + id: '8c975230-a19f-11e9-bb35-a7155c9e9b22', + isValidFeature: true, + canEdit: false + }, + style: [ + { + iconAnchor: [ + 0.5, + 0.5 + ], + anchorXUnits: 'fraction', + anchorYUnits: 'fraction', + color: '#ff0000', + fillColor: '#130ce9', + opacity: 1, + size: 64, + fillOpacity: 1, + symbolUrl: 'product/assets/symbols/map-pin-marked.svg', + shape: 'map-pin-marked', + id: '8c977940-a19f-11e9-bb35-a7155c9e9b22', + weight: 2, + highlight: false + } + ] + } + ], + style: {} + }, + { + type: 'FeatureCollection', + properties: { + title: 'Annotation 3', + description: '<p>The annotation number 3</p>', + id: 'ab69cb20-a19f-11e9-bb35-a7155c9e9b22', + visibility: false + }, + features: [ + { + type: 'Feature', + geometry: { + coordinates: [ + [ + -79.07958984375003, + 29.869228848968298 + ], + [ + -79.18945312500001, + 31.980123357368026 + ], + [ + -77.58544921875, + 31.774877618507386 + ], + [ + -77.49755859375001, + 29.735762444449076 + ], + [ + -76.11328125000001, + 29.544787796199454 + ], + [ + -76.04736328125001, + 31.024694128525123 + ] + ], + type: 'LineString' + }, + properties: { + id: 'b46f8430-a19f-11e9-bb35-a7155c9e9b22', + isValidFeature: true, + canEdit: false + }, + style: [ + { + color: '#e62130', + opacity: 1, + weight: 4, + editing: { + fill: 1 + }, + highlight: false, + id: 'b46fab40-a19f-11e9-bb35-a7155c9e9b22', + dashArray: [ + '6', + '6' + ] + }, + { + iconGlyph: 'comment', + iconShape: 'circle', + iconColor: 'blue', + highlight: false, + iconAnchor: [ + 0.5, + 0.5 + ], + type: 'Point', + title: 'StartPoint Style', + geometry: 'startPoint', + filtering: true, + id: 'b46fab41-a19f-11e9-bb35-a7155c9e9b22' + }, + { + iconGlyph: 'comment', + iconShape: 'circle', + iconColor: 'orange-dark', + highlight: false, + iconAnchor: [ + 0.5, + 0.5 + ], + type: 'Point', + title: 'EndPoint Style', + geometry: 'endPoint', + filtering: true, + id: 'b46fab42-a19f-11e9-bb35-a7155c9e9b22' + } + ] + } + ], + style: {} + }, + { + type: 'FeatureCollection', + properties: { + title: 'Annotation 4', + description: '<p>The annotation number 4</p>', + id: 'ca722120-a19f-11e9-bb35-a7155c9e9b22', + visibility: false + }, + features: [ + { + type: 'Feature', + geometry: { + coordinates: [ + [ + [ + -74.37744140625001, + 31.306715155075157 + ], + [ + -73.34472656250001, + 33.14675022877646 + ], + [ + -72.02636718750001, + 30.94934691546855 + ], + [ + -72.55371093750001, + 29.602118211647333 + ], + [ + -74.59716796875001, + 29.94541533710443 + ], + [ + -73.56445312500001, + 30.704058230919504 + ], + [ + -74.37744140625001, + 31.306715155075157 + ] + ] + ], + type: 'Polygon' + }, + properties: { + id: 'd5679c40-a19f-11e9-bb35-a7155c9e9b22', + isValidFeature: true, + canEdit: false + }, + style: [ + { + color: '#0df506', + opacity: 1, + weight: 3, + fillColor: '#ffff00', + fillOpacity: 0.54, + editing: { + fill: 1 + }, + highlight: false, + id: 'd567c350-a19f-11e9-bb35-a7155c9e9b22', + dashArray: [ + '20', + '20' + ] + } + ] + }, + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [ + -70.59814453125001, + 31.21280145833882 + ] + }, + properties: { + id: 'ee2d02b0-a19f-11e9-bb35-a7155c9e9b22', + isValidFeature: true, + canEdit: false, + isText: true, + valueText: 'The annotation', + selected: true + }, + style: [ + { + fontStyle: 'normal', + fontSize: '16', + fontSizeUom: 'px', + fontFamily: 'Arial', + fontWeight: 'normal', + font: 'normal normal 16px Arial', + textAlign: 'center', + color: '#000000', + opacity: 1, + fillColor: '#f5eb0f', + fillOpacity: 1, + highlight: false, + type: 'Text', + title: 'Text Style', + id: 'ee2d50d0-a19f-11e9-bb35-a7155c9e9b22', + label: 'The annotation' + } + ] + }, + { + type: 'Feature', + geometry: { + type: 'Polygon', + coordinates: [] + }, + properties: { + isCircle: true, + radius: 147023.83721695654, + center: [ + -69.78515625000001, + 28.950475674847993 + ], + id: '0a5f2e40-a1a0-11e9-bb35-a7155c9e9b22', + polygonGeom: { + type: 'Polygon', + coordinates: [] + }, + isValidFeature: true, + canEdit: false + }, + style: [ + { + color: '#ffcc33', + opacity: 1, + weight: 3, + fillColor: '#ffffff', + fillOpacity: 0.2, + highlight: false, + type: 'Circle', + title: 'Circle Style', + id: '0a5f5550-a1a0-11e9-bb35-a7155c9e9b22' + }, + { + iconAnchor: [ + 0.5, + 0.5 + ], + anchorXUnits: 'fraction', + anchorYUnits: 'fraction', + color: '#ffffff', + fillColor: '#1120e4', + opacity: 1, + size: 38, + fillOpacity: 1, + symbolUrl: 'product/assets/symbols/triangle.svg', + shape: 'triangle', + id: '0a5f5551-a1a0-11e9-bb35-a7155c9e9b22', + title: 'Center Style', + geometry: 'centerPoint', + filtering: true, + weight: 4, + highlight: false + } + ] + } + ], + style: {} + } + ], + name: 'Annotations', + style: {}, + type: 'vector', + visibility: false, + singleTile: false, + dimensions: [], + hideLoading: true, + handleClickOnLayer: true, + useForElevation: false, + hidden: false + }; + const newLayers = updateAnnotationsLayer(oldAnnotationsLayer); + expect(newLayers.length).toBe(4); + expect(newLayers[0].features.length).toBe(1); + expect(newLayers[0].features[0].geometry.type).toBe('Point'); + expect(newLayers[0].features[0].properties.annotationType).toBe('Point'); + expect(newLayers[0].style.body.rules.length).toBe(1); + expect(newLayers[0].style.body.rules[0].symbolizers[0].kind).toBe('Icon'); + expect(newLayers[1].features.length).toBe(1); + expect(newLayers[1].features[0].geometry.type).toBe('Point'); + expect(newLayers[1].features[0].properties.annotationType).toBe('Point'); + expect(newLayers[1].style.body.rules.length).toBe(1); + expect(newLayers[1].style.body.rules[0].symbolizers[0].kind).toBe('Mark'); + expect(newLayers[2].features.length).toBe(1); + expect(newLayers[2].features[0].geometry.type).toBe('LineString'); + expect(newLayers[2].features[0].properties.annotationType).toBe('LineString'); + expect(newLayers[2].style.body.rules.length).toBe(3); + expect(newLayers[2].style.body.rules.map(rule => rule.symbolizers[0].kind)).toEqual(['Line', 'Icon', 'Icon']); + expect(newLayers[3].features.length).toBe(3); + expect(newLayers[3].features.map(feature => feature.geometry.type)).toEqual([ 'Polygon', 'Point', 'Point' ]); + expect(newLayers[3].features.map(feature => feature.properties.annotationType)).toEqual([ 'Polygon', 'Text', 'Circle' ]); + expect(newLayers[3].style.body.rules.length).toBe(4); + expect(newLayers[3].style.body.rules.map(rule => rule.symbolizers[0].kind)).toEqual([ 'Fill', 'Text', 'Circle', 'Mark' ]); + }); + it('annotationsToGeoJSON', () => { + const annotations = [ + { id: 'annotations:1', visibility: true, rowViewer: 'annotations', title: 'Annotation01', type: 'vector', style: { format: 'geostyler', body: { name: '', rules: [{ name: '', filter: ['==', 'id', 'feature-01'], symbolizers: [{ kind: 'Icon' }] }] } }, features: [{ type: 'Feature', id: 'feature-01', geometry: { type: 'Point', coordinates: [0, 0] }, properties: { id: 'feature-01', annotationType: 'Point' } }] }, + { id: 'annotations:2', visibility: true, rowViewer: 'annotations', title: 'Annotation02', description: '<p>description</p>', type: 'vector', style: { format: 'geostyler', body: { name: '', rules: [{ name: '', filter: ['==', 'id', 'feature-02'], symbolizers: [{ kind: 'Icon' }] }] } }, features: [{ type: 'Feature', id: 'feature-02', geometry: { type: 'Point', coordinates: [0, 0] }, properties: { id: 'feature-02', annotationType: 'Point' } }] } + ]; + expect(annotationsToGeoJSON(annotations)).toEqual({ + type: 'FeatureCollection', + msType: 'annotations', + features: [ + { + type: 'Feature', + id: 'feature-01', + geometry: { + type: 'Point', + coordinates: [ 0, 0 ] + }, + properties: { + id: 'feature-01', + annotationType: 'Point', + annotationLayerId: 'annotations:1', + annotationLayerTitle: 'Annotation01', + annotationLayerDescription: undefined + } + }, + { + type: 'Feature', + id: 'feature-02', + geometry: { + type: 'Point', + coordinates: [ 0, 0 ] + }, + properties: { + id: 'feature-02', + annotationType: 'Point', + annotationLayerId: 'annotations:2', + annotationLayerTitle: 'Annotation02', + annotationLayerDescription: '<p>description</p>' + } + } + ], + annotations: [ + { id: 'annotations:1', style: { format: 'geostyler', body: { name: '', rules: [{ name: '', filter: ['==', 'id', 'feature-01'], symbolizers: [{ kind: 'Icon' }] }] } } }, + { id: 'annotations:2', style: { format: 'geostyler', body: { name: '', rules: [{ name: '', filter: ['==', 'id', 'feature-02'], symbolizers: [{ kind: 'Icon' }] }] } } } + ] + }); + }); + it('geoJSONToAnnotations', () => { + const geoJSON = { + type: 'FeatureCollection', + msType: 'annotations', + features: [ + { + type: 'Feature', + id: 'feature-01', + geometry: { + type: 'Point', + coordinates: [ 0, 0 ] + }, + properties: { + id: 'feature-01', + annotationType: 'Point', + annotationLayerId: 'annotations:1', + annotationLayerTitle: 'Annotation01', + annotationLayerDescription: undefined + } + }, + { + type: 'Feature', + id: 'feature-02', + geometry: { + type: 'Point', + coordinates: [ 0, 0 ] + }, + properties: { + id: 'feature-02', + annotationType: 'Point', + annotationLayerId: 'annotations:2', + annotationLayerTitle: 'Annotation02', + annotationLayerDescription: '<p>description</p>' + } + } + ], + annotations: [ + { id: 'annotations:1', style: { format: 'geostyler', body: { name: '', rules: [{ name: '', filter: ['==', 'id', 'feature-01'], symbolizers: [{ kind: 'Icon' }] }] } } }, + { id: 'annotations:2', style: { format: 'geostyler', body: { name: '', rules: [{ name: '', filter: ['==', 'id', 'feature-02'], symbolizers: [{ kind: 'Icon' }] }] } } } + ] + }; + expect(geoJSONToAnnotations(geoJSON)).toEqual([ + { id: 'annotations:1', visibility: true, rowViewer: 'annotations', title: 'Annotation01', description: undefined, type: 'vector', style: { format: 'geostyler', body: { name: '', rules: [{ name: '', filter: ['==', 'id', 'feature-01'], symbolizers: [{ kind: 'Icon' }] }] } }, features: [{ type: 'Feature', id: 'feature-01', geometry: { type: 'Point', coordinates: [0, 0] }, properties: { id: 'feature-01', annotationType: 'Point' } }] }, + { id: 'annotations:2', visibility: true, rowViewer: 'annotations', title: 'Annotation02', description: '<p>description</p>', type: 'vector', style: { format: 'geostyler', body: { name: '', rules: [{ name: '', filter: ['==', 'id', 'feature-02'], symbolizers: [{ kind: 'Icon' }] }] } }, features: [{ type: 'Feature', id: 'feature-02', geometry: { type: 'Point', coordinates: [0, 0] }, properties: { id: 'feature-02', annotationType: 'Point' } }] } + ]); + }); + it('importJSONToAnnotations invalid', () => { + expect(importJSONToAnnotations({})).toEqual([]); + }); + it('checkInvalidCoordinate', () => { + expect(checkInvalidCoordinate('')).toBe(true); + expect(checkInvalidCoordinate(0)).toBe(false); + }); + it('parseUpdatedCoordinates', () => { + expect(parseUpdatedCoordinates('Polygon', [[0, 0], [1, 1], [1, 0], [0, 0]])).toEqual([[[ 0, 0 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ]]]); + expect(parseUpdatedCoordinates('LineString', [[0, 0], [1, 1], [1, 0]])).toEqual([[0, 0], [1, 1], [1, 0]]); + expect(parseUpdatedCoordinates('Point', [[0, 0]])).toEqual([0, 0]); + }); + it('validateFeature', () => { + // point + expect(validateFeature({ type: 'Feature', geometry: { type: 'Point', coordinates: [0, 0] }, properties: { annotationType: 'Point' } })).toBe(true); + expect(validateFeature({ type: 'Feature', geometry: { type: 'Point', coordinates: [0, ''] }, properties: { annotationType: 'Point' } })).toBe(false); + // circle + expect(validateFeature({ type: 'Feature', geometry: { type: 'Point', coordinates: [0, 0] }, properties: { annotationType: 'Circle', radius: 100 } })).toBe(true); + expect(validateFeature({ type: 'Feature', geometry: { type: 'Point', coordinates: [0, 0] }, properties: { annotationType: 'Circle' } })).toBe(false); + expect(validateFeature({ type: 'Feature', geometry: { type: 'Point', coordinates: [0, 0] }, properties: { annotationType: 'Circle' } }, true)).toBe(true); + expect(validateFeature({ type: 'Feature', geometry: { type: 'Point', coordinates: [0, ''] }, properties: { annotationType: 'Circle', radius: 100 } })).toBe(false); + // text + expect(validateFeature({ type: 'Feature', geometry: { type: 'Point', coordinates: [0, 0] }, properties: { annotationType: 'Text', label: 'New' } })).toBe(true); + expect(validateFeature({ type: 'Feature', geometry: { type: 'Point', coordinates: [0, 0] }, properties: { annotationType: 'Text' } })).toBe(false); + expect(validateFeature({ type: 'Feature', geometry: { type: 'Point', coordinates: [0, 0] }, properties: { annotationType: 'Text' } }, true)).toBe(true); + expect(validateFeature({ type: 'Feature', geometry: { type: 'Point', coordinates: [0, ''] }, properties: { annotationType: 'Text', label: 'New' } })).toBe(false); + // line + expect(validateFeature({ type: 'Feature', geometry: { type: 'LineString', coordinates: [[0, 0], [1, 1]] }, properties: { annotationType: 'LineString' } })).toBe(true); + expect(validateFeature({ type: 'Feature', geometry: { type: 'LineString', coordinates: [[0, 0]] }, properties: { annotationType: 'LineString' } })).toBe(false); + expect(validateFeature({ type: 'Feature', geometry: { type: 'LineString', coordinates: [[0, 0], [1, '']] }, properties: { annotationType: 'LineString' } })).toBe(false); + // polygon + expect(validateFeature({ type: 'Feature', geometry: { type: 'Polygon', coordinates: [[[0, 0], [1, 1], [0, 1], [0, 0]]] }, properties: { annotationType: 'Polygon' } })).toBe(true); + expect(validateFeature({ type: 'Feature', geometry: { type: 'Polygon', coordinates: [[[0, 0]]] }, properties: { annotationType: 'Polygon' } })).toBe(false); + expect(validateFeature({ type: 'Feature', geometry: { type: 'Polygon', coordinates: [[[0, 0], [1, 1], [0, 1], [0, '']]] }, properties: { annotationType: 'Polygon' } })).toBe(false); + }); + it('applyDefaultCoordinates', () => { + expect(applyDefaultCoordinates({ type: 'Feature', geometry: null, properties: { annotationType: 'Point' } }).geometry) + .toEqual({ type: 'Point', coordinates: [ '', '' ] }); + expect(applyDefaultCoordinates({ type: 'Feature', geometry: null, properties: { annotationType: 'Circle' } }).geometry) + .toEqual({ type: 'Point', coordinates: [ '', '' ] }); + expect(applyDefaultCoordinates({ type: 'Feature', geometry: null, properties: { annotationType: 'Text' } }).geometry) + .toEqual({ type: 'Point', coordinates: [ '', '' ] }); + expect(applyDefaultCoordinates({ type: 'Feature', geometry: null, properties: { annotationType: 'LineString' } }).geometry) + .toEqual({ type: 'LineString', coordinates: [[ '', '' ]] }); + expect(applyDefaultCoordinates({ type: 'Feature', geometry: null, properties: { annotationType: 'Polygon' } }).geometry) + .toEqual({ type: 'Polygon', coordinates: [[[ '', '' ]]] }); + }); + it('getFeatureIcon', () => { + expect(getFeatureIcon({ type: 'Feature', geometry: null, properties: { annotationType: 'Point' } })).toBe('point'); + expect(getFeatureIcon({ type: 'Feature', geometry: null, properties: { annotationType: 'Circle' } })).toBe('1-circle'); + expect(getFeatureIcon({ type: 'Feature', geometry: null, properties: { annotationType: 'Text' } })).toBe('font'); + expect(getFeatureIcon({ type: 'Feature', geometry: null, properties: { annotationType: 'LineString' } })).toBe('polyline'); + expect(getFeatureIcon({ type: 'Feature', geometry: null, properties: { annotationType: 'Polygon' } })).toBe('polygon'); + expect(getFeatureIcon({ type: 'Feature', geometry: null, properties: { measureType: 'length', annotationType: 'LineString' } })).toBe('1-measure-length'); + expect(getFeatureIcon({ type: 'Feature', geometry: null, properties: { measureType: 'area', annotationType: 'Polygon' } })).toBe('1-measure-area'); + expect(getFeatureIcon({ type: 'Feature', geometry: null, properties: { measureType: 'bearing', annotationType: 'LineString' } })).toBe('1-measure-bearing'); + }); +}); + diff --git a/web/client/plugins/CRSSelector.jsx b/web/client/plugins/CRSSelector.jsx index c37775502d..183adf3f68 100644 --- a/web/client/plugins/CRSSelector.jsx +++ b/web/client/plugins/CRSSelector.jsx @@ -21,7 +21,8 @@ import Message from '../components/I18N/Message'; import CrsSelectorMenu from '../components/mapcontrols/crsselectormenu/CrsSelectorMenu'; import tooltip from '../components/misc/enhancers/tooltip'; import crsselectorReducers from '../reducers/crsselector'; -import { editingSelector } from '../selectors/annotations'; +import annotationsReducers from './Annotations/reducers/annotations'; +import { editingSelector } from '../plugins/Annotations/selectors/annotations'; import { measureSelector, printSelector, queryPanelSelector } from '../selectors/controls'; import { crsInputValueSelector } from '../selectors/crsselector'; import { modeSelector } from '../selectors/featuregrid'; @@ -199,6 +200,9 @@ export default { priority: 1 } }), - reducers: {crsselector: crsselectorReducers}, + reducers: { + crsselector: crsselectorReducers, + annotations: annotationsReducers + }, epics: {} }; diff --git a/web/client/plugins/MapImport.jsx b/web/client/plugins/MapImport.jsx index c22c37e09e..0e16078c7e 100644 --- a/web/client/plugins/MapImport.jsx +++ b/web/client/plugins/MapImport.jsx @@ -25,8 +25,8 @@ import { import { warning } from '../actions/notifications'; import { zoomToExtent } from '../actions/map'; import { addLayer } from '../actions/layers'; -import { loadAnnotations } from '../actions/annotations'; -import { annotationsLayerSelector } from '../selectors/annotations'; +import { loadAnnotations } from '../plugins/Annotations/actions/annotations'; +import { annotationsLayerSelector } from '../plugins/Annotations/selectors/annotations'; import { toggleControl } from '../actions/controls'; import assign from 'object-assign'; import { Glyphicon } from 'react-bootstrap'; diff --git a/web/client/plugins/Measure.jsx b/web/client/plugins/Measure.jsx index e27988a41a..529e708cf6 100644 --- a/web/client/plugins/Measure.jsx +++ b/web/client/plugins/Measure.jsx @@ -11,7 +11,6 @@ import { Glyphicon } from 'react-bootstrap'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import { createPlugin } from '../utils/PluginsUtils'; -import { highlightPoint } from '../actions/annotations'; import { setControlProperty, toggleControl } from '../actions/controls'; import { addAnnotation, @@ -152,7 +151,7 @@ const Measure = connect( toggleMeasure: changeMeasurement, onAddAnnotation: addAnnotation, onChangeUom: changeUom, - onHighlightPoint: highlightPoint, + // onHighlightPoint: highlightPoint, onChangeFormat: changeFormatMeasurement, onChangeCoordinates: changeCoordinates, onChangeCurrentFeature: setCurrentFeature, diff --git a/web/client/plugins/TOC.jsx b/web/client/plugins/TOC.jsx index f119ca562a..6b45d5cb56 100644 --- a/web/client/plugins/TOC.jsx +++ b/web/client/plugins/TOC.jsx @@ -35,7 +35,7 @@ import { openQueryBuilder } from '../actions/layerFilter'; import { getLayerCapabilities } from '../actions/layerCapabilities'; import { zoomToExtent } from '../actions/map'; import { error } from '../actions/notifications'; - +import { getSelectedAnnotationLayer } from './Annotations/selectors/annotations'; import { groupsSelector, layersSelector, @@ -89,7 +89,7 @@ const addFilteredAttributesGroups = (nodes, filters) => { const filterLayersByTitle = (layer, filterText, currentLocale) => { const translation = isObject(layer.title) ? layer.title[currentLocale] || layer.title.default : layer.title; const title = translation || layer.name; - return title.toLowerCase().indexOf(filterText.toLowerCase()) !== -1; + return (title || '').toLowerCase().indexOf(filterText.toLowerCase()) !== -1; }; const tocSelector = createShallowSelectorCreator(isEqual)( @@ -112,7 +112,8 @@ const tocSelector = createShallowSelectorCreator(isEqual)( isCesium, userSelector, isLocalizedLayerStylesEnabledSelector, - (enabled, groups, settings, swipeSettings, layerMetadata, layerdownload, map, currentLocale, currentLocaleLanguage, selectedNodes, filterText, layers, mapName, catalogActive, activateWidgetTool, generalInfoFormat, isCesiumActive, user, isLocalizedLayerStylesEnabled) => ({ + getSelectedAnnotationLayer, + (enabled, groups, settings, swipeSettings, layerMetadata, layerdownload, map, currentLocale, currentLocaleLanguage, selectedNodes, filterText, layers, mapName, catalogActive, activateWidgetTool, generalInfoFormat, isCesiumActive, user, isLocalizedLayerStylesEnabled, selectedAnnotationLayer) => ({ enabled, groups, settings, @@ -160,7 +161,8 @@ const tocSelector = createShallowSelectorCreator(isEqual)( catalogActive, activateWidgetTool, user, - isLocalizedLayerStylesEnabled + isLocalizedLayerStylesEnabled, + selectedAnnotationLayer }) ); @@ -603,7 +605,8 @@ const checkPluginsEnhancer = branch( "activateLayerFilterTool", "activateSettingsTool", "FeatureEditor", - "activateLayerInfoTool" + "activateLayerInfoTool", + "selectedAnnotationLayer" ], ({ items = [], @@ -614,11 +617,14 @@ const checkPluginsEnhancer = branch( activateLayerFilterTool = true, activateWidgetTool = true, activateLayerInfoTool = true, - activateDownloadTool = true + activateDownloadTool = true, + // TODO: we should extract the toolbar button that could be injected (eg. TOCItemsSettings) + // in this way the logic could be moved in that plugin instead + selectedAnnotationLayer }) => ({ activateAddLayerButton: activateAddLayerButton && !!find(items, { name: "MetadataExplorer" }) || false, // requires MetadataExplorer (Catalog) activateAddGroupButton: activateAddGroupButton && !!find(items, { name: "AddGroup" }) || false, - activateSettingsTool: activateSettingsTool && !!find(items, { name: "TOCItemsSettings"}) || false, + activateSettingsTool: activateSettingsTool && !selectedAnnotationLayer && !!find(items, { name: "TOCItemsSettings"}) || false, activateQueryTool: activateQueryTool && !!find(items, {name: "FeatureEditor"}) || false, activateLayerFilterTool: activateLayerFilterTool && !!find(items, {name: "FilterLayer"}) || false, // NOTE: activateWidgetTool is already controlled by a selector. TODO: Simplify investigating on the best approach diff --git a/web/client/plugins/__tests__/CRSSelector-test.jsx b/web/client/plugins/__tests__/CRSSelector-test.jsx index 26d535d78f..4502151e83 100644 --- a/web/client/plugins/__tests__/CRSSelector-test.jsx +++ b/web/client/plugins/__tests__/CRSSelector-test.jsx @@ -192,10 +192,7 @@ describe('CRSSelector Plugin', () => { it('CRSSelector is not rendered when Annotations Editing is enabled', () => { const { Plugin } = getPluginForTest(CRSSelectorPlugin, { annotations: { - editing: { - type: "FeatureCollection", - features: [] - } + editing: true }, map: { projection: "EPSG:900913" diff --git a/web/client/plugins/__tests__/pluginsTestUtils.js b/web/client/plugins/__tests__/pluginsTestUtils.js index 03727e0db8..7a52ce1a43 100644 --- a/web/client/plugins/__tests__/pluginsTestUtils.js +++ b/web/client/plugins/__tests__/pluginsTestUtils.js @@ -20,7 +20,6 @@ import map from '../../reducers/map'; import maptype from '../../reducers/maptype'; import layers from '../../reducers/layers'; import controls from '../../reducers/controls'; -import annotations from '../../reducers/annotations'; import context from '../../reducers/context'; import security from '../../reducers/security'; import localConfig from "../../reducers/localConfig"; @@ -33,7 +32,6 @@ const rootReducers = { layers, controls, maptype, - annotations, context, security, localConfig diff --git a/web/client/plugins/tocitemssettings/defaultSettingsTabs.js b/web/client/plugins/tocitemssettings/defaultSettingsTabs.js index f06a8424ab..09c2676b91 100644 --- a/web/client/plugins/tocitemssettings/defaultSettingsTabs.js +++ b/web/client/plugins/tocitemssettings/defaultSettingsTabs.js @@ -17,7 +17,7 @@ import { defaultProps } from 'recompose'; import { isCesium } from '../../selectors/maptype'; import {getConfiguredPlugin as getConfiguredPluginUtil } from '../../utils/PluginsUtils'; - +import { isAnnotationLayer } from '../Annotations/utils/AnnotationsUtils'; import General from '../../components/TOC/fragments/settings/General'; import Display from '../../components/TOC/fragments/settings/Display'; @@ -44,7 +44,7 @@ const ConnectedVectorStyleEditor = connect( )(VectorStyleEditor); const isLayerNode = ({settings = {}} = {}) => settings.nodeType === 'layers'; -const isVectorStylableLayer = ({element = {}} = {}) => element.type === "wfs" || element.type === "3dtiles" || element.type === "vector" && element.id !== "annotations"; +const isVectorStylableLayer = ({element = {}} = {}) => element.type === "wfs" || element.type === "3dtiles" || element.type === "vector" && !isAnnotationLayer(element); const isWMS = ({element = {}} = {}) => element.type === "wms"; const isWFS = ({element = {}} = {}) => element.type === "wfs"; diff --git a/web/client/product/main.jsx b/web/client/product/main.jsx index 4ac39e0256..f452b4e943 100644 --- a/web/client/product/main.jsx +++ b/web/client/product/main.jsx @@ -30,7 +30,6 @@ import mapPopups from '../reducers/mapPopups'; import catalog from '../reducers/catalog'; import security from '../reducers/security'; import mousePosition from "../reducers/mousePosition"; -import annotations from "../reducers/annotations"; import { versionSelector } from '../selectors/version'; import { loadAfterThemeSelector } from '../selectors/config'; @@ -83,7 +82,6 @@ export default (config = {}, pluginsDef, overrideConfig = cfg => cfg) => { catalog, security, mousePosition, - annotations, ...configAppReducers }), diff --git a/web/client/reducers/__tests__/annotations-test.js b/web/client/reducers/__tests__/annotations-test.js deleted file mode 100644 index f1067b0a57..0000000000 --- a/web/client/reducers/__tests__/annotations-test.js +++ /dev/null @@ -1,2437 +0,0 @@ -/* - * Copyright 2017, GeoSolutions Sas. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. - */ - -import expect from 'expect'; - -import annotations from '../annotations'; -import { DEFAULT_ANNOTATIONS_STYLES } from '../../utils/AnnotationsUtils'; -import { isEmpty, round } from 'lodash'; -import { set } from '../../utils/ImmutableUtils'; -import { getApi, setApi } from '../../api/userPersistedStorage'; - -const testFeatures = { - point1: { - properties: { id: '1' }, - geometry: { type: "Point", coordinates: [1, 1] } - }, - point1Changed: { - properties: {id: '1'}, - geometry: { type: "Point", coordinates: [10, 1]} - }, - lineString1: { - properties: { id: 'line1' }, - geometry: { type: "LineString", coordinates: [[1, 1], [3, 3]] } - } -}; - -const testValidFeatures = { - polygon: { - type: 'Feature', - geometry: { - coordinates: [ - [ - [1, 1], - [2, 2], - [1, 2], - [1, 1] - ] - ], - type: 'Polygon' - }, - properties: { - id: '1', - isValidFeature: true - }, - style: DEFAULT_ANNOTATIONS_STYLES.Polygon - }, - line: { - type: 'Feature', - geometry: { - coordinates: [ - [1, 1], - [1, 2] - ], - type: 'LineString' - }, - properties: { - id: '2', - isValidFeature: true, - canEdit: false - }, - style: DEFAULT_ANNOTATIONS_STYLES.LineString - }, - point: { - type: 'Feature', - geometry: { - coordinates: [1, 1], - type: 'Point' - }, - properties: { - id: '3', - isValidFeature: true, - canEdit: false - }, - style: DEFAULT_ANNOTATIONS_STYLES.Point - }, - text: { - type: 'Feature', - geometry: { - coordinates: [1, 1], - type: 'Point' - }, - properties: { - id: '4', - isValidFeature: true, - canEdit: false, - isText: true, - valueText: 'New' - }, - style: DEFAULT_ANNOTATIONS_STYLES.Text - }, - circle: { - type: 'Feature', - geometry: { - type: 'Polygon', - coordinates: [ - [ - [-6, 45] - ] - ] - }, - properties: { - isCircle: true, - radius: 50000, - center: [ - -6, - 45 - ], - id: '5', - crs: 'EPSG:3857', - isGeodesic: true, - polygonGeom: { - type: 'Polygon', - coordinates: [ - [ - [ - -5, - 45.44966018186227 - ], - [ - -5.040245511619825, - 45.44876585012077 - ], - [ - -5.080328396601316, - 45.44608646929481 - ], - [ - -5.120086731957861, - 45.441632866923904 - ], - [ - -5.1593599981818405, - 45.43542303680628 - ], - [ - -5.197989771457299, - 45.427482061146456 - ], - [ - -5.235820404536013, - 45.41784200215722 - ], - [ - -5.272699692655688, - 45.4065417637049 - ], - [ - -5.308479521010984, - 45.39362692374563 - ], - [ - -5.343016490449034, - 45.37914953845281 - ], - [ - -5.376172518248709, - 45.36316791908023 - ], - [ - -5.40781541105422, - 45.34574638274048 - ], - [ - -5.437819407265617, - 45.3269549784032 - ], - [ - -5.466065686438008, - 45.306869189532485 - ], - [ - -5.492442843504256, - 45.28556961488434 - ], - [ - -5.516847325909057, - 45.263141629076216 - ], - [ - -5.539183832021936, - 45.2396750246182 - ], - [ - -5.559365669479263, - 45.21526363716062 - ], - [ - -5.577315072387576, - 45.190004955765446 - ], - [ - -5.59296347659886, - 45.163999720048984 - ], - [ - -5.606251752540127, - 45.1373515060707 - ], - [ - -5.6171303953418725, - 45.11016630285947 - ], - [ - -5.625559672260242, - 45.082552081472535 - ], - [ - -5.6315097276241515, - 45.05461835847661 - ], - [ - -5.634960645759172, - 45.02647575572444 - ], - [ - -5.6359024725435924, - 44.99823555827448 - ], - [ - -5.6343351964375135, - 44.97000927226758 - ], - [ - -5.630268689992574, - 44.94190818453314 - ], - [ - -5.623722612997641, - 44.91404292564889 - ], - [ - -5.614726278544349, - 44.886523038124345 - ], - [ - -5.603318483406369, - 44.85945655131865 - ], - [ - -5.589547304217897, - 44.83294956464031 - ], - [ - -5.573469861011175, - 44.807105840508896 - ], - [ - -5.555152049730721, - 44.782026408489386 - ], - [ - -5.534668245384498, - 44.757809181937965 - ], - [ - -5.5121009775208725, - 44.73454858842438 - ], - [ - -5.487540579736171, - 44.71233521512217 - ], - [ - -5.4610848149224624, - 44.6912554702829 - ], - [ - -5.4328384779602645, - 44.67139126183614 - ], - [ - -5.402912977547861, - 44.652819694082375 - ], - [ - -5.37142589883906, - 44.635612783372125 - ], - [ - -5.338500548536219, - 44.619837193591955 - ], - [ - -5.304265484056409, - 44.60555399220591 - ], - [ - -5.268854028357189, - 44.592818427530354 - ], - [ - -5.2324037719756475, - 44.58167972785065 - ], - [ - -5.195056063801597, - 44.57218092292017 - ], - [ - -5.156955492073779, - 44.56435868831458 - ], - [ - -5.118249357057942, - 44.55824321304914 - ], - [ - -5.079087136838294, - 44.55385809080196 - ], - [ - -5.03961994762993, - 44.55122023502192 - ], - [ - -5, - 44.55033981813773 - ], - [ - -4.96038005237007, - 44.55122023502192 - ], - [ - -4.920912863161706, - 44.55385809080196 - ], - [ - -4.881750642942057, - 44.55824321304914 - ], - [ - -4.84304450792622, - 44.56435868831458 - ], - [ - -4.804943936198402, - 44.57218092292017 - ], - [ - -4.7675962280243525, - 44.58167972785065 - ], - [ - -4.731145971642811, - 44.592818427530354 - ], - [ - -4.695734515943591, - 44.60555399220591 - ], - [ - -4.661499451463782, - 44.619837193591955 - ], - [ - -4.62857410116094, - 44.635612783372125 - ], - [ - -4.597087022452139, - 44.652819694082375 - ], - [ - -4.5671615220397355, - 44.67139126183614 - ], - [ - -4.5389151850775376, - 44.6912554702829 - ], - [ - -4.512459420263829, - 44.71233521512217 - ], - [ - -4.4878990224791275, - 44.73454858842438 - ], - [ - -4.465331754615501, - 44.757809181937965 - ], - [ - -4.444847950269279, - 44.782026408489386 - ], - [ - -4.426530138988825, - 44.807105840508896 - ], - [ - -4.410452695782103, - 44.83294956464031 - ], - [ - -4.39668151659363, - 44.85945655131865 - ], - [ - -4.385273721455651, - 44.886523038124345 - ], - [ - -4.376277387002359, - 44.91404292564889 - ], - [ - -4.369731310007426, - 44.94190818453314 - ], - [ - -4.3656648035624865, - 44.97000927226758 - ], - [ - -4.364097527456407, - 44.99823555827448 - ], - [ - -4.365039354240828, - 45.02647575572444 - ], - [ - -4.368490272375849, - 45.05461835847661 - ], - [ - -4.374440327739758, - 45.082552081472535 - ], - [ - -4.3828696046581275, - 45.11016630285947 - ], - [ - -4.393748247459873, - 45.1373515060707 - ], - [ - -4.407036523401141, - 45.163999720048984 - ], - [ - -4.422684927612423, - 45.190004955765446 - ], - [ - -4.440634330520736, - 45.21526363716062 - ], - [ - -4.460816167978063, - 45.2396750246182 - ], - [ - -4.483152674090942, - 45.263141629076216 - ], - [ - -4.507557156495745, - 45.28556961488434 - ], - [ - -4.533934313561992, - 45.306869189532485 - ], - [ - -4.562180592734383, - 45.3269549784032 - ], - [ - -4.59218458894578, - 45.34574638274048 - ], - [ - -4.623827481751291, - 45.36316791908023 - ], - [ - -4.656983509550966, - 45.37914953845281 - ], - [ - -4.691520478989017, - 45.39362692374563 - ], - [ - -4.727300307344311, - 45.4065417637049 - ], - [ - -4.764179595463987, - 45.41784200215722 - ], - [ - -4.802010228542701, - 45.427482061146456 - ], - [ - -4.8406400018181595, - 45.43542303680628 - ], - [ - -4.879913268042139, - 45.441632866923904 - ], - [ - -4.919671603398683, - 45.44608646929481 - ], - [ - -4.959754488380175, - 45.44876585012077 - ], - [ - -5, - 45.44966018186227 - ] - ] - ] - }, - isValidFeature: true, - canEdit: true - }, - style: DEFAULT_ANNOTATIONS_STYLES.Circle - } -}; - - -import { - REMOVE_ANNOTATION, - CONFIRM_REMOVE_ANNOTATION, - CANCEL_REMOVE_ANNOTATION, - EDIT_ANNOTATION, - CANCEL_EDIT_ANNOTATION, - SAVE_ANNOTATION, - TOGGLE_ADD, - VALIDATION_ERROR, - REMOVE_ANNOTATION_GEOMETRY, - NEW_ANNOTATION, - SHOW_ANNOTATION, - CANCEL_SHOW_ANNOTATION, - FILTER_ANNOTATIONS, - CLOSE_ANNOTATIONS, - CONFIRM_CLOSE_ANNOTATIONS, - CANCEL_CLOSE_ANNOTATIONS, - toggleDeleteFtModal, - confirmDeleteFeature, - addText, - setUnsavedChanges, - setUnsavedStyle, - toggleUnsavedChangesModal, - toggleUnsavedGeometryModal, - toggleUnsavedStyleModal, - changedProperties, - setInvalidSelected, - addNewFeature, - resetCoordEditor, - changeText, - changeRadius, - changeSelected, - highlightPoint, - changeFormat, - toggleStyle, - setStyle, - updateSymbols, - setEditingFeature, - setDefaultStyle, - loading, - changeGeometryTitle, - filterMarker, - initPlugin, - hideMeasureWarning, - toggleShowAgain, - unSelectFeature, - startDrawing, - validateFeature -} from '../../actions/annotations'; - -import { PURGE_MAPINFO_RESULTS } from '../../actions/mapInfo'; -import { drawingFeatures, selectFeatures } from '../../actions/draw'; -import { toggleControl } from '../../actions/controls'; - -const testAllProperty = (state, checkState) => { - Object.keys(state).forEach( s => { - if (isEmpty(state[s])) { - expect(isEmpty(checkState[s])).toBe(true); - } else { - expect(state[s]).toBe(checkState[s]); - } - }); -}; - -describe('Test the annotations reducer', () => { - it('default states annotations', () => { - const state = annotations(undefined, {type: 'default'}); - expect(state.validationErrors).toExist(); - }); - it('toggleDeleteFtModal', () => { - // toggleDeleteFtModal, confirmDeleteFeature, - let state = annotations({}, toggleDeleteFtModal()); - expect(state.showDeleteFeatureModal).toBe(true); - state = annotations(state, toggleDeleteFtModal()); - expect(state.showDeleteFeatureModal).toBe(false); - }); - it('changeFormat', () => { - const format = "aeronautical"; - let state = annotations({}, changeFormat(format)); - expect(state.format).toBe(format); - }); - - it('test activating / deactivating highlight point', () => { - let point = {lat: 3, lon: 4}; - let state = annotations({}, highlightPoint(point)); - expect(state).toExist(); - expect(state.clickPoint.latlng.lat).toBe(point.lat); - expect(state.clickPoint.latlng.lng).toBe(point.lon); - expect(state.showMarker).toBe(true); - - state = annotations({}, highlightPoint()); - expect(state).toExist(); - expect(state.clickPoint).toBe(null); - expect(state.showMarker).toBe(false); - }); - it('confirmDeleteFeature', () => { - const state = annotations({ - selected: { - properties: { - id: "1" - } - }, - editing: { - features: [{ - properties: { - id: "1" - } - }] - } - }, confirmDeleteFeature()); - expect(state.editing.features.length).toBe(0); - }); - - it('add Text annotation', () => { - const state = annotations({drawingText: { - show: true - }}, addText()); - expect(state.drawingText.drawing).toBe(true); - expect(state.drawingText.show).toBe(true); - }); - it('setUnsavedChanges', () => { - const state = annotations({}, setUnsavedChanges(true)); - expect(state.unsavedChanges).toBe(true); - }); - it('setUnsavedStyle', () => { - const state = annotations({}, setUnsavedStyle(true)); - expect(state.unsavedStyle).toBe(true); - }); - it('toggleUnsavedChangesModal', () => { - const state = annotations({}, toggleUnsavedChangesModal()); - expect(state.showUnsavedChangesModal).toBe(true); - }); - it('toggleUnsavedGeometryModal', () => { - let state = annotations({}, toggleUnsavedGeometryModal()); - expect(state.showUnsavedGeometryModal).toBe(false); - - state = annotations({ - unsavedGeometry: true - }, toggleUnsavedGeometryModal()); - expect(state.showUnsavedGeometryModal).toBe(true); - - state = annotations({ - unsavedGeometry: true, - showUnsavedGeometryModal: true - }, toggleUnsavedGeometryModal()); - expect(state.showUnsavedGeometryModal).toBe(false); - }); - it('toggleUnsavedStyleModal', () => { - const state = annotations({}, toggleUnsavedStyleModal()); - expect(state.showUnsavedStyleModal).toBe(true); - }); - it('changedProperties', () => { - const prop = "desc"; - const val = "desc"; - const state = annotations({editedFields: { - "title": "title" - }}, changedProperties(prop, val)); - expect(state.editedFields[prop]).toBe(val); - expect(state.editedFields.title).toBe("title"); - }); - it('remove annotation', () => { - const state = annotations({}, { - type: REMOVE_ANNOTATION, - id: '1' - }); - expect(state.removing).toBe('1'); - }); - it('confirm remove annotation', () => { - const state = annotations({removing: '1', editing: {features: [{properties: {id: 2}}]}}, { - type: CONFIRM_REMOVE_ANNOTATION, - id: '1' - }); - expect(state.removing).toNotExist(); - expect(state.stylerType).toBe(""); - expect(state.editing.features).toBeTruthy(); - - }); - it('confirm remove annotation geometry', () => { - const state = annotations({ - removing: '1', - editing: { - features: [{properties: {id: '1'}}], - style: { - "Circle": { - imgGliph: "comment" - } - } - }, - featureType: "Circle" - }, { - type: CONFIRM_REMOVE_ANNOTATION, - id: '1' - }); - expect(state.removing).toNotExist(); - expect(state.editing).toExist(); - expect(state.editing.features.length).toBe(0); - }); - it('cancel remove annotation', () => { - const state = annotations({removing: '1'}, { - type: CANCEL_REMOVE_ANNOTATION - }); - expect(state.removing).toNotExist(); - }); - it('edit annotation', () => { - const feature = { - properties: { - id: '1' - }, - geometry: { - type: "Point", - coordinates: [1, 2] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [feature], - properties: { - id: '1asdfads' - }, - style: {} - }; - const state = annotations({}, { - type: EDIT_ANNOTATION, - feature: featureColl - }); - expect(state.editing).toExist(); - expect(state.editing.features[0].properties.id).toBe('1'); - expect(state.editing.properties.id).toBe('1asdfads'); - expect(state.stylerType).toBe("marker"); - expect(state.featureType).toBe("Point"); - }); - it('cancel edit annotation', () => { - const state = annotations({editing: { - properties: { - id: '1' - } - }}, { - type: CANCEL_EDIT_ANNOTATION - }); - expect(state.editing).toNotExist(); - expect(state.drawing).toNotExist(); - expect(isEmpty(state.editedFields)).toBe(true); - expect(state.unsavedChanges).toBe(false); - }); - it('save annotation', () => { - const state = annotations({editing: { - properties: { - id: '1' - } - }, drawing: true, validationErrors: {'title': 'mytitle'}}, { - type: SAVE_ANNOTATION - }); - expect(state.editing).toNotExist(); - expect(state.drawing).toNotExist(); - expect(state.validationErrors.title).toNotExist(); - expect(isEmpty(state.editedFields)).toBe(true); - expect(state.unsavedChanges).toBe(false); - }); - it('toggle add', () => { - let state = annotations({ - drawing: false, - editing: { - features: [{ - style: [{...DEFAULT_ANNOTATIONS_STYLES, type: "Polygon"}] - }] - }}, { - type: TOGGLE_ADD, - featureType: "Polygon" - }); - expect(state.coordinateEditorEnabled).toBe(true); - expect(state.stylerType).toBe("polygon"); - expect(state.featureType).toBe("Polygon"); - expect(state.drawing).toBe(true); - state = annotations({drawing: true, editing: { - features: [{ - style: [{...DEFAULT_ANNOTATIONS_STYLES, type: "Polygon"}] - }] - }}, { - type: TOGGLE_ADD - }); - expect(state.drawing).toBe(false); - }); - it('toggle add text', () => { - let state = annotations({ - drawing: false, - editing: { - features: [{ - style: [{"Polygon": DEFAULT_ANNOTATIONS_STYLES.Polygon, type: "Polygon"}] - }] - }}, { - type: TOGGLE_ADD, - featureType: "Text" - }); - expect(state.coordinateEditorEnabled).toBe(true); - expect(state.stylerType).toBe("text"); - expect(state.featureType).toBe("Text"); - expect(state.drawing).toBe(true); - }); - it('toggle add point, check geometry', ()=>{ - let state = annotations({ - editing: { - features: [] - }}, { - type: TOGGLE_ADD, - featureType: "Point" - }); - expect(state.editing.features[0].geometry).toBe(null); - }); - it('toggle add text, check geometry', ()=>{ - let state = annotations({ - editing: { - features: [] - }}, { - type: TOGGLE_ADD, - featureType: "Text" - }); - expect(state.editing.features[0].geometry).toBe(null); - expect(state.editing.features[0].properties.isText).toBe(true); - }); - it('toggle add line, check geometry', ()=>{ - let state = annotations({ - editing: { - features: [] - }}, { - type: TOGGLE_ADD, - featureType: "LineString" - }); - testAllProperty(state.editing.features[0].geometry, { - type: "LineString", - coordinates: [] - }); - }); - it('toggle add polygon, check geometry', ()=>{ - let state = annotations({ - editing: { - features: [] - }}, { - type: TOGGLE_ADD, - featureType: "Polygon" - }); - testAllProperty(state.editing.features[0].geometry, { - type: "Polygon", - coordinates: [] - }); - }); - it('toggle add circle, check geometry', ()=>{ - let state = annotations({ - editing: { - features: [] - }}, { - type: TOGGLE_ADD, - featureType: "Circle" - }); - expect(state.editing.features[0].geometry.type).toBe("Polygon"); - expect(state.editing.features[0].geometry.coordinates).toEqual([[]]); - }); - it('validate error', () => { - const state = annotations({validationErrors: {}}, { - type: VALIDATION_ERROR, - errors: { - 'title': 'myerror' - } - }); - expect(state.validationErrors.title).toBe('myerror'); - }); - it('remove annotation geometry', () => { - const state = annotations({removing: null}, { - type: REMOVE_ANNOTATION_GEOMETRY, - id: '1' - }); - expect(state.removing).toBe('1'); - expect(state.unsavedChanges).toBe(true); - }); - it('toggle style off', () => { - const selected = { - properties: { - isText: true, - canEdit: true, - valueText: "text", - id: '1' - }, - geometry: { - type: "LineString", - coordinates: [1, 1] - }, - style: [ - {...DEFAULT_ANNOTATIONS_STYLES.LineString, highlight: false}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, highlight: false}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, highlight: false} - ] - }; - const annotationsState = annotations({ - styling: true, - selected: selected, - editing: { - features: [selected] - }}, toggleStyle(false)); - expect(annotationsState.styling).toBe(false); - annotationsState.selected.style.map(s => { - expect(s.highlight).toBe(true); - }); - annotationsState.editing.features[0].style.map(s => { - expect(s.highlight).toBe(true); - }); - }); - it('toggle style on', () => { - const selected = { - properties: { - isText: true, - canEdit: true, - valueText: "text", - id: '1' - }, - geometry: { - type: "LineString", - coordinates: [1, 1] - }, - style: [ - {...DEFAULT_ANNOTATIONS_STYLES.LineString, highlight: true}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, highlight: true}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, highlight: true} - ] - }; - const annotationsState = annotations({ - styling: false, - selected: selected, - editing: { - features: [selected] - }}, toggleStyle(true)); - expect(annotationsState.styling).toBe(true); - annotationsState.selected.style.map(s => { - expect(s.highlight).toBe(false); - }); - annotationsState.editing.features[0].style.map(s => { - expect(s.highlight).toBe(false); - }); - }); - it('new annotation', () => { - const state = annotations({editing: null}, { - type: NEW_ANNOTATION - }); - expect(state.editing).toExist(); - expect(state.editing.geometry).toBe(null); - expect(state.editing.features.length).toBe(0); - expect(state.originalStyle).toBe(null); - }); - it('show annotation', () => { - const state = annotations({}, { - type: SHOW_ANNOTATION, - id: '1' - }); - expect(state.current).toBe('1'); - }); - it('cancel show annotation', () => { - const state = annotations({}, { - type: CANCEL_SHOW_ANNOTATION - }); - expect(state.current).toNotExist(); - }); - it('filter annotations', () => { - const state = annotations({}, { - type: FILTER_ANNOTATIONS, - filter: '1' - }); - expect(state.filter).toBe('1'); - }); - it('close annotations', () => { - const state = annotations({}, { - type: CLOSE_ANNOTATIONS - }); - expect(state.closing).toBe(true); - }); - it('confirm close annotations', () => { - const state = annotations({}, { - type: CONFIRM_CLOSE_ANNOTATIONS - }); - expect(state.closing).toBe(false); - expect(state.coordinateEditorEnabled).toBe(false); - }); - it('cancel close annotations', () => { - const state = annotations({}, { - type: CANCEL_CLOSE_ANNOTATIONS - }); - expect(state.closing).toBe(false); - }); - it('toggle control for annotations', () => { - const afterToggleState = { - current: null, - editing: null, - removing: null, - validationErrors: {}, - styling: false, - drawing: false, - filter: null, - editedFields: {}, - originalStyle: null, - selected: null - }; - const state = annotations({}, toggleControl("annotations")); - testAllProperty(state, afterToggleState); - - }); - it('toggle add Circle', () => { - let state = annotations({ - drawing: false, - editing: { - features: [{ - type: "Feature", - geometry: { - type: "Point", - coordinates: [0, 2] - }, - properties: { - canEdit: false, - id: "sadga" - }, - style: [ - {"color": "#ffcc33", "highlight": true, "type": "Circle", "id": "sadga"}, - {"iconGlyph": "comment", "iconShape": "square", "iconColor": "blue", "highlight": true, "type": "Point", "title": "Center Style"}] - }] - }}, { - type: TOGGLE_ADD, - featureType: "Circle" - }); - expect(state.coordinateEditorEnabled).toBe(true); - expect(state.selected.properties.isCircle).toBe(true); - expect(state.selected.properties.isValidFeature).toBe(false); - expect(state.selected.properties.canEdit).toBe(true); - expect(state.editing.features.length).toBe(2); // circle is added to editing features - const styles = state.editing.features[0].style; - expect(styles[0].highlight).toBe(false); // Reset highlight properties of other features - expect(styles[1].highlight).toBe(false); - expect(state.featureType).toBe("Circle"); - expect(state.drawing).toBe(true); - }); - - it('toggle add Text', () => { - let state = annotations({ - drawing: false, - editing: { - features: [{ - type: "Feature", - geometry: { - type: "Point", - coordinates: [0, 2] - }, - properties: { - canEdit: false, - id: "sadga" - } - }] - }}, { - type: TOGGLE_ADD, - featureType: "Text" - }); - expect(state.coordinateEditorEnabled).toBe(true); - expect(state.selected.properties.isText).toBe(true); - expect(state.selected.properties.isValidFeature).toBe(false); - expect(state.selected.properties.canEdit).toBe(true); - expect(state.editing.features.length).toBe(2); // text is added to editing features - expect(state.editing.features[1].properties.isText).toBe(true); - expect(state.featureType).toBe("Text"); - expect(state.drawing).toBe(true); - }); - it('purge map info results', () => { - const afterToggleState = { - editing: null, - removing: null, - validationErrors: {}, - styling: false, - drawing: false, - selected: null, - originalStyle: null, - filter: null, - unsavedChanges: false - }; - const state = annotations({ - drawing: false - }, { - type: PURGE_MAPINFO_RESULTS - }); - testAllProperty(state, afterToggleState); - }); - - it('edit Text annotation', () => { - const feature = { - properties: { - id: '1', - isText: true - }, - geometry: { - type: "Point", - coordinates: [1, 2] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [feature], - properties: { - id: '1asdfads' - }, - style: {} - }; - const state = annotations({}, { - type: EDIT_ANNOTATION, - feature: featureColl - }); - expect(state.editing).toExist(); - expect(state.editing.features[0].properties.id).toBe('1'); - expect(state.editing.properties.id).toBe('1asdfads'); - expect(state.stylerType).toBe("text"); - expect(state.featureType).toBe("Text"); - }); - - it('edit Circle annotation', () => { - const feature = { - properties: { - id: '1', - isCircle: true - }, - geometry: { - type: "Point", - coordinates: [1, 2] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [feature], - properties: { - id: '1asdfads' - }, - style: {} - }; - const state = annotations({}, { - type: EDIT_ANNOTATION, - feature: featureColl - }); - expect(state.editing).toExist(); - expect(state.editing.features[0].properties.id).toBe('1'); - expect(state.editing.properties.id).toBe('1asdfads'); - expect(state.stylerType).toBe("circle"); - expect(state.featureType).toBe("Circle"); - }); - it('setInvalidSelected Circle annotation', () => { - const feature = { - properties: { - id: '1', - isCircle: true - }, - geometry: { - type: "Point", - coordinates: [1, 2] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [feature], - properties: { - id: '1asdfads' - }, - style: {} - }; - const errorFrom = "radius"; - const coordinates = [1, 1]; - const state = annotations({ - editing: featureColl - }, setInvalidSelected(errorFrom, coordinates)); - expect(state.selected.properties.isValidFeature).toBe(false); - expect(state.selected.properties.radius).toBe(undefined); - }); - - it('setInvalidSelected Text annotation', () => { - const feature = { - properties: { - id: '1', - isText: true - }, - geometry: { - type: "Point", - coordinates: [1, 2] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [feature], - properties: { - id: '1asdfads' - }, - style: {} - }; - const errorFrom = "text"; - const coordinates = [1, 1]; - const state = annotations({ - editing: featureColl - }, setInvalidSelected(errorFrom, coordinates)); - expect(state.selected.properties.isValidFeature).toBe(false); - expect(state.selected.properties.valueText).toBe(undefined); - }); - - it('setInvalidSelected coords annotation', () => { - const feature = { - properties: { - id: '1', - isText: true - }, - geometry: { - type: "Point", - coordinates: [1, 2] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [feature], - properties: { - id: '1asdfads' - }, - style: {} - }; - const errorFrom = "coords"; - const coordinates = [[undefined, 1]]; - const state = annotations({ - editing: featureColl, - selected: feature - }, setInvalidSelected(errorFrom, coordinates)); - expect(state.selected.properties.isValidFeature).toBe(false); - expect(state.selected.geometry.coordinates[0]).toBe(undefined); - expect(state.selected.geometry.coordinates[1]).toBe(1); - }); - it('addNewFeature Text feature, new addition', () => { - const feature = { - properties: { - id: '1', - isText: true - }, - geometry: { - type: "Point", - coordinates: [1, 2] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [], - properties: { - id: '1asdfads' - }, - style: {} - }; - const state = annotations({ - editing: featureColl, - selected: feature, - editedFields: {title: 'Title1'} - }, addNewFeature(feature)); - expect(state.editing.features[0].properties.isText).toBe(true); - expect(state.editing.features[0].geometry.coordinates[0]).toBe(1); - expect(state.editing.features[0].geometry.coordinates[1]).toBe(2); - expect(state.editing.properties).toBeTruthy(); - expect(state.editing.properties.id).toBe('1asdfads'); - expect(state.editing.properties.title).toBe('Title1'); - expect(state.selected).toBe(null); - }); - - it('addNewFeature Text feature, updating', () => { - const feature = { - properties: { - id: '1', - isText: true, - valueText: "new pork" - }, - geometry: { - type: "Point", - coordinates: [1, 1] - } - }; - - const featureUpdated = { - properties: { - id: '1', - isText: true, - valueText: "new porkss" - }, - geometry: { - type: "Point", - coordinates: [3, 3] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [feature], - properties: { - id: '1asdfads' - }, - style: {} - }; - const state = annotations({ - editing: featureColl, - selected: featureUpdated - }, addNewFeature(featureUpdated)); - expect(state.editing.features[0].properties.isText).toBe(true); - expect(state.editing.features[0].properties.canEdit).toBe(false); - expect(state.editing.features[0].properties.valueText).toBe("new porkss"); - expect(state.editing.features[0].geometry.coordinates[0]).toBe(3); - expect(state.editing.features[0].geometry.coordinates[1]).toBe(3); - expect(state.selected).toBe(null); - }); - - it('addNewFeature Circle feature, new addition', () => { - const feature = { - properties: { - id: '1', - isCircle: true, - radius: 100, - polygonGeom: { - type: "Polygon", - coordinates: [[[1, 2], [3, 2], [4, 2], [1, 2]]] // this should contain 100 points - } - }, - geometry: { - type: "Point", - coordinates: [[1, 2]] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [], - properties: { - id: '1asdfads' - }, - style: {} - }; - const state = annotations({ - editing: featureColl, - selected: feature - }, addNewFeature(feature)); - expect(state.editing.features[0].properties.isCircle).toBe(true); - expect(state.editing.features[0].properties.canEdit).toBe(false); - expect(state.editing.features[0].geometry.type).toBe("Polygon"); - expect(state.editing.features[0].geometry.coordinates[0].length).toBe(4); - expect(state.selected).toBe(null); - }); - - it('addNewFeature Circle feature, updating', () => { - const feature = { - properties: { - id: '1', - isCircle: true, - radius: 100, - center: [1, 1], - polygonGeom: { - type: "Polygon", - coordinates: [[[1, 2], [3, 2], [4, 2], [1, 2]]] // this should contain 100 points - } - }, - geometry: { - type: "Point", - coordinates: [1, 1] - } - }; - - const featureUpdated = { - properties: { - id: '1', - isCircle: true, - radius: 5000, - center: [3, 3], - polygonGeom: { - type: "Polygon", - coordinates: [[[1, 2], [3, 2], [4, 2], [1, 2]]] // this should contain 100 points - } - }, - geometry: { - type: "Point", - coordinates: [3, 3] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [feature], - properties: { - id: '1asdfads' - }, - style: {} - }; - const state = annotations({ - editing: featureColl, - selected: featureUpdated - }, addNewFeature(featureUpdated)); - expect(state.editing.tempFeatures[0].properties.isCircle).toBe(true); - expect(state.editing.tempFeatures[0].properties.radius).toBe(5000); // this because tempFeatures === editing.featuers - expect(state.editing.features[0].properties.isCircle).toBe(true); - expect(state.editing.features[0].properties.radius).toBe(5000); - expect(state.editing.features[0].properties.center[0]).toBe(3); - expect(state.editing.features[0].properties.center[1]).toBe(3); - expect(state.editing.features[0].geometry.type).toBe("Polygon"); - expect(state.editing.features[0].geometry.coordinates[0].length).toBe(4); - expect(state.selected).toBe(null); - expect(state.unsavedGeometry).toBe(false); - expect(state.drawing).toBe(false); - }); - - it('setEditingFeature', () => { - const {point1, lineString1} = testFeatures; - const feature = { - type: "FeatureCollection", - features: [point1, lineString1], - properties: { id: '1asdfads' }, - style: {} - }; - const state = annotations({ - selected: {}, - originalStyle: null - }, setEditingFeature(feature)); - - expect(state).toExist(); - expect(state.editing).toExist(); - expect(state.editing.type).toBe('FeatureCollection'); - expect(state.editing.properties).toEqual({ id: '1asdfads', canEdit: false }); - expect(state.editing.newFeature).toBe(true); - expect(state.coordinateEditorEnabled).toBe(false); - expect(state.drawing).toBe(false); - expect(state.unsavedGeometry).toBe(false); - expect(state.selected).toBe(null); - expect(state.editing.style).toEqual({}); - expect(state.editing.features.length).toBe(2); - state.editing.features.map((x, i) => { - expect(x).toEqual(set('properties.canEdit', false, feature.features[i])); - }); - expect(state.editing.tempFeatures).toEqual(state.editing.features); - }); - - it('resetCoordEditor in creation mode of a Point ', () => { - const {point1, lineString1} = testFeatures; - const featureColl = { - type: "FeatureCollection", - features: [lineString1, point1], - tempFeatures: [lineString1], - properties: { id: '1asdfads' }, - style: {} - }; - const state = annotations({ - featureType: "Point", - editing: featureColl, - selected: point1, - drawing: true, - unsavedGeometry: false - }, resetCoordEditor()); - expect(state.unsavedGeometry).toBe(false); - expect(state.selected).toBe(null); - expect(state.drawing).toBe(false); - expect(state.showUnsavedGeometryModal).toBe(false); - expect(state.editing.features.length).toBe(1); - expect(state.editing.features[0].geometry.type).toBe("LineString"); - - }); - - it('resetCoordEditor in edit mode of a Point, with no Changes ', () => { - const {point1, point1Changed} = testFeatures; - - const featureColl = { - type: "FeatureCollection", - features: [point1], - tempFeatures: [point1], - properties: { id: '1asdfads' }, - style: {} - }; - const state = annotations({ - editing: featureColl, - selected: point1Changed, - drawing: false, - unsavedGeometry: false - }, resetCoordEditor()); - expect(state.unsavedGeometry).toBe(false); - expect(state.selected).toBe(null); - expect(state.drawing).toBe(false); - expect(state.showUnsavedGeometryModal).toBe(false); - expect(state.editing.features.length).toBe(1); - - }); - - it('resetCoordEditor in edit mode of a Circle, with no Changes ', () => { - - const featureChanged = { - properties: { - id: '1', - isCircle: true - }, - geometry: { - type: "Point", - coordinates: [10, 1] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [], - tempFeatures: [], - properties: { - id: '1asdfads' - }, - featureType: "Circle", - style: {} - }; - const state = annotations({ - editing: featureColl, - selected: featureChanged, - unsavedGeometry: false - }, resetCoordEditor()); - expect(state.unsavedGeometry).toBe(false); - expect(state.selected).toBe(null); - expect(state.drawing).toBe(false); - expect(state.showUnsavedGeometryModal).toBe(false); - expect(state.editing.features.length).toBe(0); - - }); - - it('resetCoordEditor in edit mode of a Point, with Changes ', () => { - const {point1, point1Changed} = testFeatures; - - const featureColl = { - type: "FeatureCollection", - features: [point1Changed], - tempFeatures: [point1], - properties: { id: '1asdfads' }, - style: {} - }; - const state = annotations({ - editing: featureColl, - selected: point1Changed, - unsavedGeometry: true - }, resetCoordEditor()); - expect(state.unsavedGeometry).toBe(false); - expect(state.selected).toBe(null); - expect(state.drawing).toBe(false); - expect(state.showUnsavedGeometryModal).toBe(false); - expect(state.editing.features.length).toBe(1); - expect(state.editing.features[0].geometry.coordinates[0]).toBe(1); - - }); - - - it('changeText of an existing feature of type Text', () => { - const feature = { - properties: { - isText: true, - valueText: "oldTExt", - id: '1' - }, - geometry: { - type: "Point", - coordinates: [1, 1] - } - }; - const featureChanged = { - properties: { - isText: true, - canEdit: true, - id: '1', - valueText: "oldText" - }, - geometry: { - type: "Point", - coordinates: [10, 1] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [featureChanged], - tempFeatures: [feature], - properties: { - id: '1asdfads' - }, - style: {} - }; - const text = "rest in piece"; - const components = [[1, 0]]; - const state = annotations({ - editing: featureColl, - selected: featureChanged, - unsavedGeometry: true - }, changeText(text, components)); - expect(state.editing.features[0].properties.valueText).toBe(text); - expect(state.selected.properties.valueText).toBe(text); - expect(state.selected.properties.isValidFeature).toBe(true); - expect(state.selected.properties.canEdit).toBe(true); - expect(state.selected.geometry.coordinates[0]).toBe(1); - expect(state.selected.geometry.coordinates[1]).toBe(0); - expect(state.unsavedGeometry).toBe(true); - }); - - it('changeText of a new feature of type Text', () => { - const valueText = "rest in piece"; - const feature = { - properties: { - canEdit: true, - isText: true, - valueText, - id: '1' - }, - geometry: { - type: "Point", - coordinates: [1, 1] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [], - tempFeatures: [], - properties: { - id: '1asdfads' - }, - style: {} - }; - const components = [[1, 0]]; - const state = annotations({ - editing: featureColl, - selected: feature, - unsavedGeometry: true - }, changeText(valueText, components)); - expect(state.editing.features[0].properties.valueText).toBe(valueText); - expect(state.selected.properties.valueText).toBe(valueText); - expect(state.selected.properties.canEdit).toBe(true); - expect(state.selected.geometry.coordinates[0]).toBe(1); - expect(state.selected.geometry.coordinates[1]).toBe(0); - expect(state.unsavedGeometry).toBe(true); - }); - - it('changeRadius of an existing feature of type Circle', () => { - const feature = { - properties: { - isCircle: true, - radius: 100, - id: '1' - }, - geometry: { - type: "Point", - coordinates: [1, 1] - } - }; - const featureChanged = { - properties: { - isCircle: true, - canEdit: true, - id: '1', - radius: 10000 - }, - geometry: { - type: "Point", - coordinates: [1, 1] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [featureChanged], - tempFeatures: [feature], - properties: { - id: '1asdfads' - }, - style: {} - }; - const radius = 10000; - const components = [[1, 1]]; - const state = annotations({ - editing: featureColl, - selected: featureChanged, - unsavedGeometry: true - }, changeRadius(radius, components, "EPSG:3857")); - expect(state.editing.features[0].properties.radius).toBe(radius); - expect(state.selected.properties.radius).toBe(radius); - expect(state.selected.properties.isValidFeature).toBe(true); - expect(state.selected.properties.canEdit).toBe(true); - expect(state.selected.geometry.coordinates[0]).toBe(1); - expect(state.selected.geometry.coordinates[1]).toBe(1); - expect(state.editing.features[0].geometry.type).toBe("Polygon"); - const firstPoint = state.editing.features[0].geometry.coordinates[0][0]; - expect(round(firstPoint[0], 10)).toBe(1); - expect(round(firstPoint[1], 10)).toBe(1.0899320364); - expect(state.unsavedGeometry).toBe(true); - }); - - it('changeText of a new feature of type Circle, in 4326', () => { - const radius = 5; - const feature = { - properties: { - canEdit: true, - isCircle: true, - id: '1' - }, - geometry: { - type: "Point", - coordinates: [1, 1] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [], - tempFeatures: [], - properties: { - id: '1asdfads' - }, - style: {} - }; - const components = [[1, 0]]; - const state = annotations({ - editing: featureColl, - selected: feature, - unsavedGeometry: true - }, changeRadius(radius, components, "EPSG:4326")); - expect(state.editing.features[0].properties.radius).toBe(radius); - expect(state.selected.properties.radius).toBe(radius); - expect(state.selected.properties.canEdit).toBe(true); - expect(state.selected.geometry.coordinates[0]).toBe(1); - expect(state.selected.geometry.coordinates[1]).toBe(0); - expect(state.editing.features[0].geometry.type).toBe("Polygon"); - const firstPoint = state.editing.features[0].geometry.coordinates[0][0]; - expect(round(firstPoint[0], 10)).toBe(1); - expect(round(firstPoint[1], 10)).toBe(5.0058419746); - - expect(state.unsavedGeometry).toBe(true); - }); - it('drawingFeatures of a new Point (marker)', () => { - const feature = { - properties: { - canEdit: true, - id: '1' - }, - geometry: { - type: "Point", - coordinates: [1, 1] - } - }; - const feature2 = { - properties: { - canEdit: false, - id: 'feature2' - }, - geometry: { - type: "LineString", - coordinates: [[1, 1], [1, 2]] - } - }; - - const featureColl = { - type: "FeatureCollection", - features: [feature2], - tempFeatures: [], - properties: { - id: '1asdfads' - }, - style: {} - }; - const state = annotations({ - editing: featureColl, - selected: feature, - unsavedGeometry: true - }, drawingFeatures([feature])); - expect(state.selected.properties.canEdit).toBe(true); - expect(state.selected.properties.isValidFeature).toBe(true); - expect(state.editing.features[0].properties.canEdit).toBe(false); - expect(state.editing.features[1].properties.canEdit).toBe(true); - expect(state.selected.geometry.coordinates[0]).toBe(1); - }); - - it('drawingFeatures of an existing Point (marker)', () => { - const feature = { - properties: { - canEdit: true, - id: '1' - }, - geometry: { - type: "Point", - coordinates: [1, 1] - } - }; - const feature2 = { - properties: { - canEdit: true, - id: '1' - }, - geometry: { - type: "Point", - coordinates: [3, 3] - } - }; - - const featureColl = { - type: "FeatureCollection", - features: [feature], - tempFeatures: [], - properties: { - id: '1asdfads' - }, - style: {} - }; - const state = annotations({ - editing: featureColl, - selected: feature, - unsavedGeometry: true - }, drawingFeatures([feature2])); - expect(state.selected.properties.canEdit).toBe(true); - expect(state.selected.properties.isValidFeature).toBe(true); - expect(state.editing.features[0].properties.canEdit).toBe(true); - expect(state.editing.features[0].geometry.coordinates[0]).toBe(3); - expect(state.editing.features[0].geometry.coordinates[1]).toBe(3); - expect(state.selected.geometry.coordinates[0]).toBe(3); - expect(state.selected.geometry.coordinates[1]).toBe(3); - }); - - it('drawingFeatures of an existing Circle', () => { - const feature = { - properties: { - isCircle: true, - canEdit: true, - center: [1, 1], - radius: 100, - id: '1' - }, - geometry: { - type: "Point", - coordinates: [1, 1] - } - }; - const feature2 = { - properties: { - isCircle: true, - canEdit: true, - center: [4, 4], - radius: 100, - id: '1' - }, - geometry: { - type: "Point", - coordinates: [4, 4] - } - }; - - const featureColl = { - type: "FeatureCollection", - features: [feature], - tempFeatures: [], - properties: { - id: '1asdfads' - }, - style: {} - }; - const state = annotations({ - editing: featureColl, - selected: feature, - unsavedGeometry: true - }, drawingFeatures([feature2])); - expect(state.selected.properties.canEdit).toBe(true); - expect(state.selected.properties.isValidFeature).toBe(true); - expect(state.editing.features[0].properties.canEdit).toBe(true); - expect(state.editing.features[0].geometry.coordinates[0]).toBe(4); - expect(state.editing.features[0].geometry.coordinates[1]).toBe(4); - expect(state.selected.properties.center[0]).toBe(4); - expect(state.selected.properties.center[1]).toBe(4); - expect(state.selected.geometry.coordinates[0]).toBe(4); - expect(state.selected.geometry.coordinates[1]).toBe(4); - expect(state.unsavedGeometry).toBe(true); - }); - - it('drawingFeatures of an existing Text', () => { - const selected = { - properties: { - isText: true, - canEdit: true, - valueText: "text", - id: '1' - }, - geometry: { - type: "Point", - coordinates: [1, 1] - } - }; - const feature2 = { - properties: { - isText: true, - canEdit: true, - valueText: "text", - id: '1' - }, - geometry: { - type: "Point", - coordinates: [4, 4] - } - }; - - const featureColl = { - type: "FeatureCollection", - features: [selected], - tempFeatures: [], - properties: { - id: '1asdfads' - }, - style: {} - }; - const state = annotations({ - editing: featureColl, - selected, - unsavedGeometry: true - }, drawingFeatures([feature2])); - expect(state.selected.properties.canEdit).toBe(true); - expect(state.selected.properties.isValidFeature).toBe(true); - expect(state.editing.features[0].properties.canEdit).toBe(true); - expect(state.editing.features[0].geometry.coordinates[0]).toBe(4); - expect(state.editing.features[0].geometry.coordinates[1]).toBe(4); - expect(state.selected.geometry.coordinates[0]).toBe(4); - expect(state.selected.geometry.coordinates[1]).toBe(4); - expect(state.selected.geometry.type).toBe("Text"); - expect(state.unsavedGeometry).toBe(true); - }); - it('selectFeatures of a Text Feature', () => { - const selected = { - properties: { - isText: true, - canEdit: true, - valueText: "text", - id: '1' - }, - geometry: { - type: "Point", - coordinates: [1, 1] - } - }; - const feature2 = { - properties: { - isText: true, - canEdit: true, - valueText: "text", - id: '1' - }, - geometry: { - type: "Point", - coordinates: [4, 4] - } - }; - - const featureColl = { - type: "FeatureCollection", - features: [selected], - tempFeatures: [], - properties: { - id: '1asdfads' - }, - style: {} - }; - const state = annotations({ - editing: featureColl, - selected, - unsavedGeometry: true - }, selectFeatures([feature2])); - expect(state.selected.properties.canEdit).toBe(true); - expect(state.editing.features[0].properties.canEdit).toBe(true); - expect(state.editing.features[0].geometry.coordinates[0]).toBe(4); - expect(state.editing.features[0].geometry.coordinates[1]).toBe(4); - expect(state.selected.geometry.coordinates[0]).toBe(4); - expect(state.selected.geometry.coordinates[1]).toBe(4); - expect(state.selected.geometry.type).toBe("Text"); - expect(state.unsavedGeometry).toBe(true); - expect(state.coordinateEditorEnabled).toBe(true); - }); - it('changeSelected, changing coords of a Text Feature', () => { - const selected = { - properties: { - isText: true, - canEdit: true, - valueText: "text", - id: '1' - }, - geometry: { - type: "Point", - coordinates: [1, 1] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [selected], - tempFeatures: [], - properties: { - id: '1asdfads' - }, - style: {} - }; - const coordinates = [[1, 1]]; - const state = annotations({ - editing: featureColl, - selected, - featureType: "Text", - unsavedGeometry: true - }, changeSelected(coordinates, null, "text")); - expect(state.selected.geometry.type).toBe("Point"); - expect(state.featureType).toBe("Text"); - expect(state.selected.geometry.coordinates[0]).toBe(1); - expect(state.selected.geometry.coordinates[1]).toBe(1); - }); - it('changeSelected, changing coords of a Circle Feature', () => { - const selected = { - properties: { - canEdit: true, - center: [-6.576492309570317, 41.6007838467891], - id: "259d79d0-053e-11ea-b0b3-379d853a3ff4", - isCircle: true, - isValidFeature: true, - radius: 3567 - }, - geometry: { - type: "Circle", - coordinates: [-6.576492309570317, 41.6007838467891] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [selected], - tempFeatures: [], - properties: { - id: '1asdfads' - }, - style: {} - }; - const coordinates = [[1, 1]]; - const state = annotations({ - editing: featureColl, - selected, - featureType: "Text", - unsavedGeometry: true - }, changeSelected(coordinates, 3567, null, "EPSG:3857")); - expect(state.selected.geometry.type).toBe("Circle"); - expect(state.selected.geometry.coordinates[0]).toBe(1); - expect(state.selected.geometry.coordinates[1]).toBe(1); - let firstPoint = state.selected.properties.polygonGeom.coordinates[0][0]; - expect(round(firstPoint[0], 10)).toBe(1); - expect(round(firstPoint[1], 10)).toBe(1.0320787574); - - // testing also with radius in deg - const state2 = annotations({ - editing: featureColl, - selected: {...selected, properties: {...selected.properties, radius: 3}}, - featureType: "Text", - unsavedGeometry: true - }, changeSelected(coordinates, 3567, null, "EPSG:4326")); - expect(state2.selected.geometry.coordinates[0]).toBe(1); - expect(state2.selected.geometry.coordinates[1]).toBe(1); - firstPoint = state2.selected.properties.polygonGeom.coordinates[0][0]; - expect(round(firstPoint[0], 10)).toBe(1); - expect(round(firstPoint[1], 10)).toBe(-27.8323353334); - }); - - it('changeSelected, Selected Properties for Circle Feature with Radius and Radius Undefined', () => { - const selected = { - properties: { - canEdit: true, - center: [-6.576492309570317, 41.6007838467891], - id: "259d79d0-053e-11ea-b0b3-379d853a3ff4", - isCircle: true, - isValidFeature: true - }, - geometry: { - type: "Circle", - coordinates: [-6.576492309570317, 41.6007838467891] - } - }; - const featureColl = { - type: "FeatureCollection", - features: [selected], - tempFeatures: [], - properties: { - id: '1asdfads' - }, - style: {} - }; - const coordinates = [[1, 1]]; - // with defined radius - const state = annotations({ - editing: featureColl, - selected, - featureType: "Text", - unsavedGeometry: true - }, changeSelected(coordinates, 3567, null, "EPSG:3857")); - - // with undefined radius - const state2 = annotations({ - editing: featureColl, - selected: {...selected, properties: {...selected.properties}}, - featureType: "Text", - unsavedGeometry: true - }, changeSelected(coordinates, undefined, null, "EPSG:4326")); - - expect(state.selected.properties).toNotEqual(state2.selected.properties); - }); - it('UPDATE_SYMBOLS', () => { - let annotationsState = annotations({}, updateSymbols()); - expect(annotationsState.symbolList.length).toBe(0); - - annotationsState = annotations({}, updateSymbols([{ - value: "pink", - name: "pink", - symbolUrl: "path/pink.svg" - }])); - expect(annotationsState.symbolList.length).toBe(1); - expect(annotationsState.symbolList[0].value).toBe("pink"); - - annotationsState = annotations({ - symbolList: [{ - value: "circle", - name: "circle", - symbolUrl: "path/circle.svg" - }] - }, updateSymbols([{ - value: "exagon", - name: "exagon", - symbolUrl: "path/exagon.svg" - }])); - expect(annotationsState.symbolList.length).toBe(1); - expect(annotationsState.symbolList[0].value).toBe("exagon"); - }); - it('UPDATE_SYMBOLS', () => { - let annotationsState = annotations({}, updateSymbols()); - expect(annotationsState.symbolList.length).toBe(0); - - annotationsState = annotations({}, updateSymbols([{ - value: "pink", - name: "pink", - symbolUrl: "path/pink.svg" - }])); - expect(annotationsState.symbolList.length).toBe(1); - expect(annotationsState.symbolList[0].value).toBe("pink"); - - annotationsState = annotations({ - symbolList: [{ - value: "circle", - name: "circle", - symbolUrl: "path/circle.svg" - }] - }, updateSymbols([{ - value: "exagon", - name: "exagon", - symbolUrl: "path/exagon.svg" - }])); - expect(annotationsState.symbolList.length).toBe(1); - expect(annotationsState.symbolList[0].value).toBe("exagon"); - }); - - it('TOGGLE_CONTROL, not annotations', () => { - // original state returned - let annotationsState = annotations({ - editing: null, - selected: null - }, toggleControl("queryform")); - expect(annotationsState.editing).toBe(null); - expect(annotationsState.selected).toBe(null); - }); - it('SET_STYLE updating selected feature', () => { - let annotationsState = annotations({ - editing: null, - selected: { - properties: { - isText: true, - canEdit: true, - valueText: "text", - id: '1' - }, - geometry: { - type: "LineString", - coordinates: [1, 1] - }, - style: [ - {...DEFAULT_ANNOTATIONS_STYLES.LineString}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, filtering: false}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, filtering: false} - ] - } - }, setStyle([ - {...DEFAULT_ANNOTATIONS_STYLES.LineString}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, filtering: true}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, filtering: false}] - )); - expect(annotationsState.selected.style[1].filtering).toBe(true); - }); - it('SET_STYLE updating selected feature and the one in the editing fcoll', () => { - const selected = { - properties: { - isText: true, - canEdit: true, - valueText: "text", - id: '1' - }, - geometry: { - type: "LineString", - coordinates: [1, 1] - }, - style: [ - {...DEFAULT_ANNOTATIONS_STYLES.LineString}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, filtering: false}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, filtering: false} - ] - }; - let annotationsState = annotations({ - editing: { - features: [selected, {...selected, properties: {...selected.properties, id: "2"}}] - }, - selected - }, setStyle([ - {...DEFAULT_ANNOTATIONS_STYLES.LineString}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, filtering: true}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, filtering: false}] - )); - expect(annotationsState.selected.style[1].filtering).toBe(true); - expect(annotationsState.editing.features[0].style[1].filtering).toBe(true); - expect(annotationsState.editing.features[0].style[2].filtering).toBe(false); - expect(annotationsState.editing.features[1].style[1].filtering).toBe(false); - expect(annotationsState.editing.features[1].style[2].filtering).toBe(false); - }); - it('setDefaultStyle', () => { - const state = annotations({}, setDefaultStyle('POINT.symbol', {size: 64})); - expect(state.defaultStyles?.POINT?.symbol).toEqual({size: 64}); - }); - it('loading', () => { - const state = annotations({}, loading(true, 'loadingFlag')); - expect(state.loading).toBe(true); - expect(state.loadFlags).toEqual({loadingFlag: true}); - }); - it('Change geometry title', ()=>{ - const state = annotations({ - editing: {features: [{properties: {id: '1', geometryTitle: ""}}]}, - selected: {properties: {id: '1', geometryTitle: ""}}}, changeGeometryTitle("New title")); - expect(state.selected).toBeTruthy(); - expect(state.selected.properties.geometryTitle).toBe('New title'); - }); - it('Change marker filter option', ()=>{ - const state = annotations({ - config: {"config1": 1} - }, filterMarker("glass")); - expect(state.config).toBeTruthy(); - expect(state.config.filter).toBe('glass'); - }); - it('Hide measure warning', ()=>{ - const state = annotations({ - config: {"config1": 1} - }, hideMeasureWarning()); - expect(state.showPopupWarning).toBe(false); - }); - it('Init plugin', ()=>{ - const state = annotations({ - config: {"config1": 1} - }, initPlugin()); - const showPopupWarning = getApi().getItem("showPopupWarning") !== null ? getApi().getItem("showPopupWarning") === "true" : true; - expect(state.showPopupWarning).toBe(showPopupWarning); - }); - it('Init plugin with accessDenied', ()=>{ - setApi("memoryStorage"); - const api = getApi(); - api.setAccessDenied(true); - const state = annotations({ - config: {"config1": 1} - }, initPlugin()); - expect(state).toEqual({config: {"config1": 1}}); - api.setAccessDenied(false); - setApi("localStorage"); - }); - it('toggleShowAgain', ()=>{ - const state = annotations({ - config: {"config1": 1} - }, toggleShowAgain(false)); - expect(state.showAgain).toBeTruthy(); - expect(state.showAgain).toBe(true); - }); - it('unSelectFeature', ()=>{ - const selected = { - properties: { - isText: true, - canEdit: true, - valueText: "text", - id: '1' - }, - geometry: { - type: "LineString", - coordinates: [1, 1] - }, - style: [ - {...DEFAULT_ANNOTATIONS_STYLES.LineString}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, filtering: false}, - {...DEFAULT_ANNOTATIONS_STYLES.Point, filtering: false} - ] - }; - const state = annotations({ - editing: { - features: [selected, {...selected, properties: {...selected.properties, id: "2"}}] - }, - selected - }, unSelectFeature()); - expect(state.drawing).toBe(false); - expect(state.coordinateEditorEnabled).toBe(false); - expect(state.unsavedGeometry).toBe(false); - expect(state.selected).toBeFalsy(); - expect(state.showUnsavedGeometryModal).toBe(false); - const features = state.editing.features; - expect(features[0].properties.canEdit).toBe(false); - expect(features[1].properties.canEdit).toBe(false); - }); - it('START_DRAWING', () => { - let annotationsState = annotations({ - editing: null, - selected: null - }, startDrawing({geodesic: true})); - expect(annotationsState.config).toBeTruthy(); - expect(annotationsState.config.geodesic).toBe(true); - }); - it('validate features - valid geometries', () => { - const features = Object.values(testValidFeatures); - let state = annotations({ - editing: { - features - }, - selected: null - }, validateFeature()); - expect(state.editing.features[0].properties.isValidFeature).toBe(true); - expect(state.editing.features[1].properties.isValidFeature).toBe(true); - expect(state.editing.features[2].properties.isValidFeature).toBe(true); - expect(state.editing.features[3].properties.isValidFeature).toBe(true); - expect(state.editing.features[4].properties.isValidFeature).toBe(true); - }); - it('validate features - invalid geometries', () => { - const features = Object.values(testValidFeatures); - features[0].geometry.coordinates = [ - [ - [1, null] - ] - ]; - features[1].geometry.coordinates = [ - [ - [1, null] - ] - ]; - features[2].geometry.coordinates = [1, null]; - features[3].geometry.coordinates = [1, null]; - features[4].geometry.coordinates = [ - [ - [1, null] - ] - ]; - features[4].properties.center = [null, 45]; - features[4].properties.radius = null; - let state = annotations({ - editing: { - features - }, - selected: null - }, validateFeature()); - expect(state.editing.features[0].properties.isValidFeature).toBe(false); - expect(state.editing.features[1].properties.isValidFeature).toBe(false); - expect(state.editing.features[2].properties.isValidFeature).toBe(false); - expect(state.editing.features[3].properties.isValidFeature).toBe(false); - expect(state.editing.features[4].properties.isValidFeature).toBe(false); - }); - it('validate features - invalid text, missing coordinates', () => { - const features = [testValidFeatures.text]; - features[0].geometry.coordinates = [1, null]; - let state = annotations({ - editing: { - features - }, - selected: null - }, validateFeature()); - expect(state.editing.features[0].properties.isValidFeature).toBe(false); - }); - it('validate features - invalid text, missing text value', () => { - const features = [testValidFeatures.text]; - features[0].properties.valueText = null; - let state = annotations({ - editing: { - features - }, - selected: null - }, validateFeature()); - expect(state.editing.features[0].properties.isValidFeature).toBe(false); - }); - it('validate features - invalid circle, missing radius', () => { - const features = [testValidFeatures.circle]; - features[0].properties.radius = null; - let state = annotations({ - editing: { - features - }, - selected: null - }, validateFeature()); - expect(state.editing.features[0].properties.isValidFeature).toBe(false); - }); - it('validate features - invalid circle, missing center', () => { - const features = [testValidFeatures.circle]; - features[0].geometry.coordinates = [ - [ - [null, 45] - ] - ]; - features[0].properties.center = [null, 45]; - let state = annotations({ - editing: { - features - }, - selected: null - }, validateFeature()); - expect(state.editing.features[0].properties.isValidFeature).toBe(false); - }); - -}); diff --git a/web/client/reducers/__tests__/config-test.js b/web/client/reducers/__tests__/config-test.js index 4b0ab8e061..81d88c60db 100644 --- a/web/client/reducers/__tests__/config-test.js +++ b/web/client/reducers/__tests__/config-test.js @@ -125,21 +125,26 @@ describe('Test the mapConfig reducer', () => { type: "FeatureCollection", features: [{ type: "Feature", + id: 'feature-01', geometry: { type: "MultiPoint", coordinates: [[1, 2], [4, 5]] }, properties: { + id: 'feature-01', useGeodesicLines: true } }, { type: "Feature", + id: 'feature-02', geometry: { type: "LineString", coordinates: [[1, 2], [4, 5]] }, - properties: {}, + properties: { + id: 'feature-02' + }, style: [{ color: "#303030" }] @@ -148,15 +153,24 @@ describe('Test the mapConfig reducer', () => { }] }}}); expect(state.map).toExist(); expect(state.layers).toExist(); - const newAnnotationsFeature = state.layers[0].features[0].features[0]; - const otherLineString = state.layers[0].features[0].features[1]; + const newAnnotationsFeature = state.layers[0].features[0]; + const otherLineString = state.layers[0].features[1]; expect(newAnnotationsFeature.geometry).toEqual({ type: "MultiPoint", coordinates: [[1, 2], [4, 5]] }); - expect(newAnnotationsFeature.properties.geometryGeodesic.type).toBe("LineString"); - expect(newAnnotationsFeature.properties.geometryGeodesic.coordinates.length).toBe(100); - expect(otherLineString.properties).toEqual({}); + expect(newAnnotationsFeature.properties).toEqual({ + geodesic: true, + id: 'feature-01', + annotationType: 'MultiPoint', + name: 'MultiPoint' + }); + expect(otherLineString.properties).toEqual({ + geodesic: false, + id: 'feature-02', + annotationType: 'LineString', + name: 'LineString' + }); expect(otherLineString.geometry).toEqual({ type: "LineString", coordinates: [[1, 2], [4, 5]] diff --git a/web/client/reducers/__tests__/featuregrid-test.js b/web/client/reducers/__tests__/featuregrid-test.js index 5d1e512d2b..4f945b9c18 100644 --- a/web/client/reducers/__tests__/featuregrid-test.js +++ b/web/client/reducers/__tests__/featuregrid-test.js @@ -91,9 +91,14 @@ import {isViewportFilterActive, paginationSelector, useLayerFilterSelector} from import { featureTypeLoaded, createQuery, updateQuery } from '../../actions/wfsquery'; import { changeDrawingStatus } from '../../actions/draw'; import { configureMap } from '../../actions/config'; +import { getApi, setApi } from '../../api/userPersistedStorage'; + import museam from '../../test-resources/wfs/museam.json'; describe('Test the featuregrid reducer', () => { - + beforeEach(() => { + setApi("localStorage"); + getApi().removeItem("showPopoverSync"); + }); it('returns original state on unrecognized action', () => { let state = featuregrid(1, {type: 'UNKNOWN'}); expect(state).toBe(1); diff --git a/web/client/reducers/__tests__/mapInfo-test.js b/web/client/reducers/__tests__/mapInfo-test.js index b9ab04cdb3..5951d2cacb 100644 --- a/web/client/reducers/__tests__/mapInfo-test.js +++ b/web/client/reducers/__tests__/mapInfo-test.js @@ -243,54 +243,6 @@ describe('Test the mapInfo reducer', () => { expect(state.index).toBe(undefined); expect(state.loaded).toBe(true); }); - it('creates a feature info data from vector info request', () => { - let testAction = { - type: 'GET_VECTOR_INFO', - layer: { - features: [{ - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [ - [ [9.0, 42.0], [11.0, 42.0], [11.0, 44.0], - [9.0, 44.0], [9.0, 42.0] ] - ] - }, - "properties": { - "prop0": "value0", - "prop1": {"this": "that"} - } - }] - }, - request: { - lng: 10.0, - lat: 43.0 - }, - metadata: "meta" - }; - - let state = mapInfo({requests: [{}], configuration: {}}, testAction); - expect(state.responses).toExist(); - expect(state.loaded).toBe(true); - expect(state.index).toBe(1); - expect(state.responses.length).toBe(2); - expect(state.responses[1].response).toExist(); - expect(state.responses[1].response.features.length).toBe(1); - expect(state.responses[1].format).toBe('JSON'); - expect(state.responses[1].queryParams.lng).toBe(10.0); - expect(state.responses[1].layerMetadata).toBe("meta"); - - state = mapInfo({requests: [{}], configuration: {trigger: "hover"}}, testAction); - expect(state.responses).toExist(); - expect(state.responses.length).toBe(1); - expect(state.loaded).toBe(true); - expect(state.index).toBe(0); - expect(state.responses[0].response).toExist(); - expect(state.responses[0].response.features.length).toBe(1); - expect(state.responses[0].format).toBe('JSON'); - expect(state.responses[0].queryParams.lng).toBe(10.0); - expect(state.responses[0].layerMetadata).toBe("meta"); - }); it('creates a new mapinfo request', () => { let state = mapInfo({}, {type: 'NEW_MAPINFO_REQUEST', reqId: 1, request: "request"}); @@ -419,389 +371,6 @@ describe('Test the mapInfo reducer', () => { }); - it('creates a feature info data from vector info request, with FeatureCollection inside', () => { - let testAction = { - type: 'GET_VECTOR_INFO', - layer: { - type: 'vector', - visibility: true, - id: 'annotations', - name: 'Annotations', - hideLoading: true, - style: { - type: 'FeatureCollection', - Polygon: { - color: '#ffcc33', - opacity: 1, - weight: 3, - fillColor: '#ffffff', - fillOpacity: 0.2, - editing: { - fill: 1 - } - }, - MultiPolygon: { - color: '#ffcc33', - opacity: 1, - weight: 3, - fillColor: '#ffffff', - fillOpacity: 0.2, - editing: { - fill: 1 - } - } - }, - features: [ - { - type: 'FeatureCollection', - properties: { - title: 'ads', - id: '77359220-6b2d-11e8-af0b-7f182f5005a7' - }, - features: [ - { - type: 'Feature', - geometry: { - coordinates: [ - [ - [ - 1.4062499999999993, - 0.07690427378333507 - ], - [ - 2.878417968750001, - -2.2077054557054083 - ], - [ - -1.5600585937500016, - -1.7245930431979002 - ], - [ - 1.4062499999999993, - 0.07690427378333507 - ] - ] - ], - type: 'Polygon' - }, - properties: { - id: '782dadc0-6b2d-11e8-af0b-7f182f5005a7', - isValidFeature: true, - canEdit: false - } - }, - { - type: 'Feature', - geometry: { - coordinates: [ - [ - [ - -4.394531250000002, - 0.03295898255728466 - ], - [ - -3.4716796875000018, - -2.3174830687583046 - ], - [ - -6.767578125000002, - -2.8442900428132867 - ], - [ - -4.394531250000002, - 0.03295898255728466 - ] - ] - ], - type: 'Polygon' - }, - properties: { - id: '7a4199a0-6b2d-11e8-af0b-7f182f5005a7', - isValidFeature: true, - canEdit: false - } - } - ], - style: { - type: 'FeatureCollection', - Polygon: { - color: '#ffcc33', - opacity: 1, - weight: 3, - fillColor: '#ffffff', - fillOpacity: 0.2, - editing: { - fill: 1 - } - }, - MultiPolygon: { - color: '#ffcc33', - opacity: 1, - weight: 3, - fillColor: '#ffffff', - fillOpacity: 0.2, - editing: { - fill: 1 - } - }, - highlight: false - } - }, - { - type: 'FeatureCollection', - properties: { - title: 'dfgd', - id: '87056c20-6b2d-11e8-af0b-7f182f5005a7' - }, - features: [ - { - type: 'Feature', - geometry: { - coordinates: [ - -1.0107421874999996, - 2.7126091154394105 - ], - type: 'Point' - }, - properties: { - id: '87f9b730-6b2d-11e8-af0b-7f182f5005a7', - isValidFeature: true, - canEdit: false - } - }, - { - type: 'Feature', - geometry: { - type: 'Polygon', - coordinates: [ - [ - [ - -1.801757812500001, - 0.2966295342722069 - ], - [ - 0.3735351562500003, - -1.461023280622767 - ], - [ - -5.075683593750002, - -1.6147764249055092 - ], - [ - -1.801757812500001, - 0.2966295342722069 - ] - ] - ] - }, - properties: { - id: '8984eb10-6b2d-11e8-af0b-7f182f5005a7', - isValidFeature: true, - canEdit: false, - selected: true - } - }, - { - type: 'Feature', - geometry: { - coordinates: [ - 4.724121093750001, - 2.0100855878673873 - ], - type: 'Point' - }, - properties: { - id: '8e11c630-6b2d-11e8-af0b-7f182f5005a7', - isValidFeature: true, - canEdit: false, - isText: true, - valueText: 'New' - } - }, - { - type: 'Feature', - geometry: { - coordinates: [ - [ - [ - 1.4950389402841207, - 0.6481795331595092 - ], - - [ - 1.4950318567997916, - 0.6480669516034593 - ], - [ - 1.495037167664108, - 0.6481231310851803 - ], - [ - 1.4950389402841207, - 0.6481795331595092 - ] - ] - ], - type: 'Polygon' - }, - properties: { - isCircle: true, - radius: 187065.88083090802, - center: [ - 1.494140625000001, - 0.6481795331595092 - ], - id: '902563f0-6b2d-11e8-af0b-7f182f5005a7', - polygonGeom: { - coordinates: [ - [ - [ - 1.4950389402841207, - 0.6481795331595092 - ], - [ - 1.495037167664108, - 0.6481231310851803 - ], - [ - 1.4950389402841207, - 0.6481795331595092 - ] - ] - ], - type: 'Polygon' - }, - isValidFeature: true, - canEdit: false - } - }, - { - type: 'Feature', - geometry: { - coordinates: [ - [ - 2.0654296874999982, - 3.568247821628616 - ], - [ - -5.844726562500002, - -0.0769042737833478 - ] - ], - type: 'LineString' - }, - properties: { - id: '921748e0-6b2d-11e8-af0b-7f182f5005a7', - isValidFeature: true, - canEdit: false - } - } - ], - style: { - type: 'FeatureCollection', - Point: { - iconGlyph: 'comment', - iconShape: 'square', - iconColor: 'blue' - }, - MultiPoint: { - iconGlyph: 'comment', - iconShape: 'square', - iconColor: 'blue' - }, - Polygon: { - color: '#ffcc33', - opacity: 1, - weight: 3, - fillColor: '#ffffff', - fillOpacity: 0.2, - editing: { - fill: 1 - } - }, - MultiPolygon: { - color: '#ffcc33', - opacity: 1, - weight: 3, - fillColor: '#ffffff', - fillOpacity: 0.2, - editing: { - fill: 1 - } - }, - Text: { - fontStyle: 'normal', - fontSize: '14', - fontSizeUom: 'px', - fontFamily: 'Arial', - fontWeight: 'normal', - font: '14px Arial', - textAlign: 'center', - color: '#000000', - opacity: 1 - }, - Circle: { - color: '#ffcc33', - opacity: 1, - weight: 3, - fillColor: '#ffffff', - fillOpacity: 0.2, - radius: 10 - }, - LineString: { - color: '#ffcc33', - opacity: 1, - weight: 3, - fillColor: '#ffffff', - fillOpacity: 0.2, - editing: { - fill: 1 - } - }, - MultiLineString: { - color: '#ffcc33', - opacity: 1, - weight: 3, - fillColor: '#ffffff', - fillOpacity: 0.2, - editing: { - fill: 1 - } - }, - highlight: false - } - } - ], - handleClickOnLayer: true - }, - request: { - lat: 0.6481795331595066, - lng: 1.4941406250000009 - }, - metadata: { - fields: [ - 'title', - 'id' - ], - title: 'Annotations', - resolution: 2445.98490512564, - buffer: 2, - units: 'm' - } - }; - - let state = mapInfo({requests: []}, testAction); - expect(state.responses).toExist(); - expect(state.responses.length).toBe(1); - expect(state.responses[0].response).toExist(); - expect(state.responses[0].response.features.length).toBe(1); - expect(state.responses[0].format).toBe('JSON'); - expect(state.responses[0].queryParams.lng).toBe(1.4941406250000009); - expect(state.responses[0].layerMetadata.fields.length).toBe(2); - expect(state.responses[0].layerMetadata.title).toBe("Annotations"); - expect(state.responses[0].layerMetadata.buffer).toBe(2); - }); - it('TOGGLE_EMPTY_MESSAGE_GFI', () => { let state = mapInfo({ infoFormat: "text/html", @@ -842,112 +411,6 @@ describe('Test the mapInfo reducer', () => { expect(state).toExist(); expect(state.formatCoord).toBe("decimal"); }); - it('test get FeatureInfo', () => { - const coordinates = [ - [ - 10.588610688032599, - 47.299871638197 - ], - [ - -16.352332555255717, - 49.53350105609461 - ] - ]; - - // mid point of coordinate segment - const MPoint = { - x: (coordinates[0][0] + coordinates[1][0] ) / 2, - y: (coordinates[0][1] + coordinates[1][1]) / 2 - }; - const getVectorInfoAction = { - type: 'GET_VECTOR_INFO', - layer: { - type: 'vector', - visibility: true, - id: 'annotations', - name: 'Annotations', - hideLoading: true, - style: null, - features: [ - { - type: 'FeatureCollection', - features: [ - { - type: 'Feature', - geometry: { - type: 'Point', - coordinates: [ - -16.352332555255717, - 49.53350105609461 - ] - }, - properties: { - valueText: '1998753.55 m', - isText: true, - isValidFeature: true, - id: 'e3129731-40b7-11e9-8a48-ad0c6ec638ad' - }, - style: [{}] - }, - { - type: 'Feature', - geometry: { - type: 'MultiPoint', - // start end ponts - coordinates - }, - properties: { - isValidFeature: true, - useGeodesicLines: true, - id: 'e312be41-40b7-11e9-8a48-ad0c6ec638ad', - geometryGeodesic: { - type: 'LineString', - // simplified for tests. Densified in rea world - coordinates - } - }, - style: [{}] - } - ], - properties: { - id: 'e3129730-40b7-11e9-8a48-ad0c6ec638ad', - title: 'New annotation', - description: '<p>1998753.55 m</p>' - }, - style: {} - } - ], - handleClickOnLayer: true - }, - // click on mid point (one that belongs to the `geometryGeodesic`) - request: { - lat: MPoint.y, - lng: MPoint.x - }, - metadata: { - fields: [ - 'id', - 'title', - 'description' - ], - title: 'Annotations', - resolution: 10583.33333333336, - buffer: 2, - units: 'm' - } - }; - let state = mapInfo({ - requests: [], - responses: [], - formatCoord: "aeronautical" - }, getVectorInfoAction); - expect(state).toExist(); - expect(state.responses.length).toBe(1); - const response = state.responses[0].response; - // check the click has been intercepted - expect(response.features.length).toBe(1); - expect(response.features[0].type).toBe("FeatureCollection"); - }); it('mapInfo changePage', () => { const action = changePage(1); const state = mapInfo( undefined, action); diff --git a/web/client/reducers/annotations.js b/web/client/reducers/annotations.js deleted file mode 100644 index de617380fc..0000000000 --- a/web/client/reducers/annotations.js +++ /dev/null @@ -1,775 +0,0 @@ -/* - * Copyright 2017, GeoSolutions Sas. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. - */ - -import assign from 'object-assign'; - -import {transformLineToArcs} from '../utils/CoordinatesUtils'; -import circle from '@turf/circle'; -import {PURGE_MAPINFO_RESULTS} from '../actions/mapInfo'; -import {TOGGLE_CONTROL} from '../actions/controls'; -import {DRAWING_FEATURE, FEATURES_SELECTED} from '../actions/draw'; - -import { - ADD_NEW_FEATURE, - ADD_TEXT, - CANCEL_CLOSE_ANNOTATIONS, - CANCEL_EDIT_ANNOTATION, - CANCEL_REMOVE_ANNOTATION, - CANCEL_SHOW_ANNOTATION, - CHANGE_FORMAT, - CHANGE_GEOMETRY_TITLE, - CHANGE_RADIUS, - CHANGE_TEXT, - CHANGED_PROPERTIES, - CHANGED_SELECTED, - CLOSE_ANNOTATIONS, - CONFIRM_CLOSE_ANNOTATIONS, - CONFIRM_DELETE_FEATURE, - CONFIRM_REMOVE_ANNOTATION, - EDIT_ANNOTATION, - ERROR_SYMBOLS, - FILTER_ANNOTATIONS, - FILTER_MARKER, - HIDE_MEASURE_WARNING, - HIGHLIGHT_POINT, - INIT_PLUGIN, - LOADING, - NEW_ANNOTATION, - REMOVE_ANNOTATION, - REMOVE_ANNOTATION_GEOMETRY, - RESET_COORD_EDITOR, - SAVE_ANNOTATION, - SET_DEFAULT_STYLE, - SET_EDITING_FEATURE, - SET_INVALID_SELECTED, - VALIDATE_FEATURE, - SET_STYLE, - SHOW_ANNOTATION, - START_DRAWING, - TOGGLE_ADD, - TOGGLE_CHANGES_MODAL, - TOGGLE_DELETE_FT_MODAL, - TOGGLE_GEOMETRY_MODAL, - TOGGLE_SHOW_AGAIN, - TOGGLE_STYLE, - TOGGLE_STYLE_MODAL, - UNSAVED_CHANGES, - UNSAVED_STYLE, - UNSELECT_FEATURE, - UPDATE_SYMBOLS, - VALIDATION_ERROR -} from '../actions/annotations'; - -import { - addIds, - convertGeoJSONToInternalModel, - getAvailableStyler, - getBaseCoord, - getComponents, getGeometryType, - updateAllStyles, - validateCoordsArray, - validateFeature -} from '../utils/AnnotationsUtils'; - -import {set} from '../utils/ImmutableUtils'; -import {castArray, findIndex, get, head, isNil, slice} from 'lodash'; -import uuid from 'uuid'; -import {getApi} from '../api/userPersistedStorage'; - -const fixCoordinates = (coords, type) => { - switch (type) { - case "Polygon": return [coords]; - case "LineString": case "MultiPoint": return coords; - default: return coords[0]; - } -}; - -function annotations(state = {validationErrors: {}}, action) { - switch (action.type) { - case INIT_PLUGIN: { - try { - return { - ...state, - showPopupWarning: getApi().getItem("showPopupWarning") !== null ? getApi().getItem("showPopupWarning") === "true" : true - }; - } catch (e) { - console.error(e); - return state; - } - } - case CHANGED_SELECTED: { - let newState = set(`unsavedGeometry`, true, state); - let {coordinates, radius, text} = action; - let validCoordinates; - let ftChangedIndex = findIndex(state.editing.features, (f) => f.properties.id === state.selected.properties.id); - let ftChanged = ftChangedIndex === -1 ? {type: "Feature", geometry: { - type: state.selected.geometry.type - }, properties: {...state.selected.properties}} : assign({}, state.editing.features[ftChangedIndex]); - if (ftChanged.geometry && !ftChanged.geometry.type || !ftChanged.geometry) { - ftChanged = set("geometry.type", state.selected.geometry.type, ftChanged); - } - if (!isNil(coordinates)) { - - validCoordinates = coordinates;// .filter(validateCoordsArray); - switch (ftChanged.geometry.type) { - case "Polygon": ftChanged = assign({}, ftChanged, { - geometry: assign({}, ftChanged.geometry, { - coordinates: fixCoordinates(validCoordinates, ftChanged.geometry.type) - }) - }); break; - case "LineString": case "MultiPoint": ftChanged = assign({}, ftChanged, { - geometry: assign({}, ftChanged.geometry, { - coordinates: fixCoordinates(validCoordinates, ftChanged.geometry.type) - }) - }); break; - default: ftChanged = assign({}, ftChanged, { - geometry: assign({}, ftChanged.geometry, { - coordinates: fixCoordinates(validCoordinates, ftChanged.geometry.type) - }) - }); - } - } - let selected = assign({}, ftChanged); - - let features; - if (selected.properties.isCircle) { - let centerCoords = !isNil(coordinates) ? validCoordinates[0] : state.selected.properties.center; - - selected = assign({}, {...selected, properties: { - ...state.selected.properties, center: centerCoords, radius: !isNil(radius) ? radius : selected.properties.radius - }}); - features = state.editing.features.map(f => { - return f.properties.id === state.selected.properties.id ? selected : f; - }); - selected = { ...selected, geometry: { coordinates: centerCoords, type: "Circle"}}; - let center; - let c = { - type: 'Polygon', - coordinates: [[[]]] - }; - // polygonGeom setting - if (validateCoordsArray(selected.properties.center)) { - center = selected.properties.center; - // turf/circle by default use km unit hence we divide by 1000 the radius(in meters) - // this try catch prevents the app from crashing when there is no radius maybe we can use a default value for radius incase action.radius === undefined - const circleRadius = action.radius ?? 0.0001; - c = circle( - center, - action.crs === "EPSG:4326" ? circleRadius : circleRadius / 1000, - { steps: 100, units: action.crs === "EPSG:4326" ? "degrees" : "kilometers" } - ).geometry; - } else { - selected = set("properties.center", [], selected); - } - - selected = set("properties.polygonGeom", c, selected); - } else if (selected.properties.isText) { - let c = !isNil(coordinates) ? validCoordinates[0] : state.selected.geometry.coordinates; - selected = assign({}, {...selected, - properties: { - ...state.selected.properties, - valueText: !isNil(text) ? text : state.selected.properties.valueText - }}); - features = state.editing.features.map(f => { - return f.properties.id === state.selected.properties.id ? selected : f; - }); - selected = {...selected, geometry: {coordinates: c, type: "Point"}}; - } else { - features = state.editing.features.map(f => { - return f.properties.id === state.selected.properties.id ? selected : f; - }); - selected = {...selected, geometry: {...selected.geometry, coordinates: fixCoordinates(!isNil(coordinates) ? coordinates : selected.geometry.coordinates, selected.geometry.type)}}; - } - selected = set("properties.isValidFeature", validateFeature({ - properties: selected.properties, - components: getComponents(selected.geometry), - type: selected.geometry.type - }), selected); - return assign({}, newState, { - editing: {...newState.editing, features}, - selected, - unsavedChanges: true - }); - } - case FEATURES_SELECTED: { - let newState = state; - let selected = head(action.features) || null; - if (!selected) { - return state; - } - selected = set("properties.canEdit", true, selected); - if (selected && selected.properties && selected.properties.isCircle) { - selected = set("geometry.coordinates", selected.properties.center, selected); - selected = set("geometry.type", "Circle", selected); - } - if (selected && selected.properties && selected.properties.isText) { - selected = set("geometry.type", "Text", selected); - } - - let ftChangedIndex = findIndex(state.editing.features, (f) => f.properties.id === selected.properties.id); - let selectedGeoJSON = selected; - if (selected && selected.properties && selected.properties.isCircle) { - if (selected.properties.polygonGeom ) { - selectedGeoJSON = set("geometry", selected.properties.polygonGeom, selectedGeoJSON); - } else { - selectedGeoJSON = set("geometry.coordinates", [], selectedGeoJSON); - selectedGeoJSON = set("geometry.type", 'Polygon', selectedGeoJSON); - } - - } else if (selected && selected.properties && selected.properties.isText) { - selectedGeoJSON = set("geometry.type", "Point", selectedGeoJSON); - } - newState = set(`editing.features`, state.editing.features.map(f => { - return set("properties.canEdit", false, f); - }), state); - newState = set(`editing.tempFeatures`, newState.editing.features, newState); - newState = set(`editing`, updateAllStyles(newState.editing, {highlight: false}), newState); - if (ftChangedIndex === -1) { - - newState = set("editing.features", newState.editing.features.concat([selectedGeoJSON]), newState); - } else { - selectedGeoJSON = set("style", castArray(newState.editing.features[ftChangedIndex].style).map(s => ({...s, highlight: true})), selectedGeoJSON); - newState = set(`editing.features[${ftChangedIndex}]`, selectedGeoJSON, newState); - selected = set("style", newState.editing.features[ftChangedIndex].style, selected); - } - - - return assign({}, newState, { - selected, - coordinateEditorEnabled: !!selected, - featureType: selected.geometry.type - }); - } - case DRAWING_FEATURE: { - let selected = head(action.features) || null; - selected = set("style", state.selected.style, selected); - let newState = state; - if (selected && selected.properties && selected.properties.isCircle) { - selected = set("properties.polygonGeom", selected.geometry, selected); - selected = set("geometry", {coordinates: selected.properties.center, type: "Circle"}, selected); - } else if (selected && selected.properties && selected.properties.isText) { - selected = set("geometry.type", "Text", selected); - } - selected = set("properties.isValidFeature", validateFeature({ - properties: selected.properties, - components: getComponents(selected.geometry), - type: selected.geometry.type - }), selected); - selected = set("properties.canEdit", true, selected); - newState = set(`editing.features`, state.editing.features.map(f => { - return set("properties.canEdit", false, f); - }), state); - - let ftChangedIndex = findIndex(state.editing.features, (f) => f.properties.id === selected.properties.id); - let selectedGeoJSON = selected; - if (selected && selected.properties && selected.properties.isCircle) { - if (selected.properties.polygonGeom ) { - selectedGeoJSON = set("geometry", selected.properties.polygonGeom, selectedGeoJSON); - } else { - selectedGeoJSON = set("geometry.coordinates", [], selectedGeoJSON); - selectedGeoJSON = set("geometry.type", 'Polygon', selectedGeoJSON); - } - - } else if (selected && selected.properties && selected.properties.isText) { - selectedGeoJSON = set("geometry.type", "Point", selectedGeoJSON); - } - - newState = set(`unsavedGeometry`, true, newState); - if (ftChangedIndex === -1) { - newState = set("editing.features", newState.editing.features.concat([selectedGeoJSON]), newState); - } else { - newState = set(`editing.features[${ftChangedIndex}]`, selectedGeoJSON, newState); - } - - return assign({}, newState, { - selected, - unsavedChanges: true, - stylerType: head(getAvailableStyler(convertGeoJSONToInternalModel(selected.geometry))) - }); - } - case REMOVE_ANNOTATION: - return assign({}, state, { - removing: action.id - }); - case CHANGE_RADIUS: { - let newState; - let selected = set("properties.radius", action.radius, state.selected); - selected = set("properties.isValidFeature", validateFeature({ - properties: selected.properties, - components: getComponents({coordinates: action.components[0] || [], type: "Circle"}), - type: "Circle" - }), selected); - selected = set("properties.center", action.components[0], selected); - selected = set("geometry.coordinates", action.components[0], selected); - - // need to change the polygon coords after radius changes - // but this implementation is ugly. is using openlayers to do that and maybe we need to refactor this - - let feature = circle( - selected.properties.center, - action.crs === "EPSG:4326" ? action.radius : action.radius / 1000, - { steps: 100, units: action.crs === "EPSG:4326" ? "degrees" : "kilometers" } - ); - selected = set("properties.polygonGeom", feature.geometry, selected); - - let ftChangedIndex = findIndex(state.editing.features, (f) => f.properties.id === state.selected.properties.id); - const selectedGeoJSON = set("geometry", selected.properties.polygonGeom, selected); - newState = set(`editing.features`, state.editing.features.map(f => { - return set("properties.canEdit", false, f); - }), state); - - newState = set(`unsavedGeometry`, true, newState); - if (ftChangedIndex === -1) { - newState = set("editing.features", newState.editing.features.concat([selectedGeoJSON]), newState); - } else { - newState = set(`editing.features[${ftChangedIndex}]`, selectedGeoJSON, newState); - } - return assign({}, newState, { - selected, - unsavedChanges: true, - circleCoordinates: action.components[0] - }); - } - case CHANGE_TEXT: { - let newState; - let selected = set("properties.valueText", action.text, state.selected); - selected = set("style[0].label", action.text, selected); - selected = set("properties.isValidFeature", validateFeature({ - properties: selected.properties, - components: getComponents({coordinates: action.components[0] || [], type: "Text"}), - type: "Text" - }), selected); - selected = set("properties.isText", true, selected); - selected = set("geometry.coordinates", action.components[0] || [[]], selected); - - let ftChangedIndex = findIndex(state.editing.features, (f) => f.properties.id === state.selected.properties.id); - const selectedGeoJSON = set("geometry.type", "Point", selected); - newState = set(`editing.features`, state.editing.features.map(f => { - return set("properties.canEdit", false, f); - }), state); - - newState = set(`unsavedGeometry`, true, newState); - if (ftChangedIndex === -1) { - newState = set("editing.features", newState.editing.features.concat([selectedGeoJSON]), newState); - } else { - newState = set(`editing.features[${ftChangedIndex}]`, selectedGeoJSON, newState); - } - return assign({}, newState, { - selected, - unsavedChanges: true - }); - } - case RESET_COORD_EDITOR: { - let newState = set(`editing.features`, state.editing.features.map(f => { - return set("properties.canEdit", false, f); - }), state); - const newfeatures = newState.editing.features; - // only for the circles the feature is not being added - - let features = newState.editing.tempFeatures; - if (state.featureType !== "Circle" && state.drawing) { - features = slice(newfeatures, 0, newfeatures.length - 1); - } - return assign({}, newState, { - editing: { - ...newState.editing, - features - }, - drawing: false, - coordinateEditorEnabled: false, - unsavedGeometry: false, - selected: null, - showUnsavedGeometryModal: false - }); - } - case UNSELECT_FEATURE: { - let editing = state.editing; - const selected = state.selected; - const ftChangedIndex = findIndex(editing.features, (f) => f.properties.id === selected.properties.id); - const selectedGeoJSON = editing.features[ftChangedIndex]; - const styleChanged = castArray(selectedGeoJSON.style).map(s => ({...s, highlight: false})); - editing = set(`features[${ftChangedIndex}]`, set("style", styleChanged, selectedGeoJSON), editing); - let newState = set(`editing.features`, editing.features.map(f => { - return set("properties.canEdit", false, f); - }), state); - return assign({}, newState, { - drawing: false, - coordinateEditorEnabled: false, - unsavedGeometry: false, - selected: null, - showUnsavedGeometryModal: false - }); - } - case ADD_NEW_FEATURE: { - let selected = state.selected; - let newState = state; - if (selected.properties && selected.properties.isCircle ) { - // verify this condition - selected = set("geometry", selected.properties.polygonGeom, selected); - } - if (selected.properties && selected.properties.isText) { - selected = set("geometry.type", "Point", selected); - } - if (selected.properties && selected.properties.useGeodesicLines) { - selected = set("properties.geometryGeodesic", {type: "LineString", coordinates: transformLineToArcs(selected.geometry.coordinates)}, selected); - } - selected = set("properties.canEdit", false, selected); - - let ftChangedIndex = findIndex(state.editing.features, (f) => f.properties.id === state.selected.properties.id); - if (ftChangedIndex === -1) { - newState = set("editing.features", newState.editing.features.concat([selected]), newState); - } else { - selected = set("style", castArray(newState.editing.features[ftChangedIndex].style).map(s => ({...s, highlight: false})), selected); - newState = set(`editing.features[${ftChangedIndex}]`, selected, newState); - } - newState = set(`editing.tempFeatures`, newState.editing.features, newState); - newState = {...newState, editing: {...newState.editing, properties: {...newState.editing.properties, ...newState.editedFields}}}; - - return assign({}, newState, { - coordinateEditorEnabled: false, - drawing: false, - unsavedGeometry: false, - selected: null, - config: {...newState.config, filter: ''} - }); - } - case SET_EDITING_FEATURE: { - if (!action.feature || action.feature.type !== 'FeatureCollection') { - return state; - } - const feature = set('features', action.feature.features.map(x => set('properties.canEdit', false, x)), action.feature); - const newFeature = set('newFeature', get(action.feature, "newFeature", true), set('properties.canEdit', false, set('tempFeatures', feature.features, feature))); - const newState = set('editing', newFeature, state); - return assign({}, newState, { - coordinateEditorEnabled: false, - drawing: false, - unsavedGeometry: false, - selected: null, - config: {...newState.config, filter: ''} - }); - } - case TOGGLE_DELETE_FT_MODAL: { - return set("showDeleteFeatureModal", !state.showDeleteFeatureModal, state); - } - case CONFIRM_DELETE_FEATURE: { - let newState = set("editing.features", state.editing.features.filter(f => f.properties.id !== state.selected.properties.id), state); - newState = set("unsavedChanges", true, newState); - newState = set("drawing", false, newState); - newState = set("coordinateEditorEnabled", false, newState); - return newState; - } - case ADD_TEXT: { - return assign({}, state, { - drawingText: { - ...state.drawingText, - drawing: true - } - }); - } - case SET_INVALID_SELECTED: { - let selected = set("properties.isValidFeature", false, state.selected); - switch (action.errorFrom) { - case "text": selected = set("properties.valueText", undefined, selected); break; - case "radius": selected = set("properties.radius", undefined, selected); break; - case "coords": selected = set("geometry.coordinates", fixCoordinates(action.coordinates, selected.geometry.type), selected); break; - default: break; - } - return assign({}, state, {selected}); - } - - case REMOVE_ANNOTATION_GEOMETRY: - return assign({}, state, { - removing: action.id, - unsavedChanges: true - }); - case EDIT_ANNOTATION: { - const features = addIds(action.feature.features); - const selected = head(action.feature.features); - let featureType = selected && selected.geometry && selected.geometry.type; - if (selected && selected.properties && selected.properties.isCircle) { - featureType = "Circle"; - } - if (selected && selected.properties && selected.properties.isText) { - featureType = "Text"; - } - return assign({}, state, { - editing: updateAllStyles(assign({}, action.feature, {features}), {highlight: false}), - stylerType: head(getAvailableStyler(convertGeoJSONToInternalModel(action.feature.geometry || action.feature))), - originalStyle: null, - featureType - }); - } - case NEW_ANNOTATION: - const id = uuid.v1(); - return assign({}, state, { - editing: { - type: "FeatureCollection", - id, - geometry: null, - features: [], - newFeature: true, - properties: { - id - } - }, - selected: {}, - originalStyle: null - }); - case CONFIRM_REMOVE_ANNOTATION: - const features = state.editing?.features?.filter(feature=> feature.properties.id !== action.id) || []; - const delSelectedFeature = state?.selected?.properties?.id === action.id || false; - return assign({}, state, { - removing: null, - stylerType: "", - current: null, - ...(delSelectedFeature && {selected: null}), - editing: state.editing ? assign({}, state.editing, { - features, - style: { - type: state.featureType - } - }) : null - }); - case CHANGE_GEOMETRY_TITLE: { - let newState = state; - const ftIndex = findIndex(state.editing.features, (f) => f.properties.id === state.selected.properties.id); - const editingFt = set("properties.geometryTitle", action.title, state.editing.features[ftIndex]); - const selectedFt = set("properties.geometryTitle", action.title, state.selected); - newState = set(`editing.features[${ftIndex}]`, editingFt, newState); - return {...newState, selected: selectedFt}; - } - case CANCEL_REMOVE_ANNOTATION: - return assign({}, state, { - removing: null - }); - case CLOSE_ANNOTATIONS: - return assign({}, state, { - closing: true - }); - case UNSAVED_CHANGES: - return assign({}, state, { - unsavedChanges: action.unsavedChanges - }); - case UNSAVED_STYLE: - return assign({}, state, { - unsavedStyle: action.unsavedStyle - }); - case CONFIRM_CLOSE_ANNOTATIONS: { - return assign({}, state, { - closing: false, - coordinateEditorEnabled: false - }); - } - case CANCEL_CLOSE_ANNOTATIONS: - return assign({}, state, { - closing: false - }); - case TOGGLE_CHANGES_MODAL: - return assign({}, state, { - showUnsavedChangesModal: !state.showUnsavedChangesModal - }); - case TOGGLE_GEOMETRY_MODAL: - return assign({}, state, { - showUnsavedGeometryModal: !!state.unsavedGeometry && !state.showUnsavedGeometryModal - }); - case TOGGLE_STYLE_MODAL: - return assign({}, state, { - showUnsavedStyleModal: !state.showUnsavedStyleModal - }); - case CHANGED_PROPERTIES: - return assign({}, state, { - editedFields: assign({}, state.editedFields, { - [action.field]: action.value - }) - }); - case CANCEL_EDIT_ANNOTATION: - return assign({}, state, { - editing: null, - drawing: false, - styling: false, - originalStyle: null, - validationErrors: {}, - editedFields: {}, - unsavedChanges: false - }); - - case SAVE_ANNOTATION: - return assign({}, state, { - editing: null, - current: null, - drawing: false, - styling: false, - originalStyle: null, - validationErrors: {}, - editedFields: {}, - unsavedChanges: false - }); - case PURGE_MAPINFO_RESULTS: - return assign({}, state, { - editing: null, - removing: null, - validationErrors: {}, - styling: false, - drawing: false, - originalStyle: null, - selected: null, - filter: null, - unsavedChanges: false, - editedFields: {} - }); - case TOGGLE_ADD: { - const type = action.featureType || state.featureType; - let properties = { - id: uuid.v1(), - isValidFeature: false, - canEdit: true - }; - if (type === "Text") { - properties = set("isText", true, properties); - } - if (type === "Circle") { - properties = set("isCircle", true, properties); - properties = set("isDrawing", true, properties); - } - let selected = {type: "Feature", geometry: {type, coordinates: getBaseCoord(type)}, properties, - style: {...(state.config?.defaultPointType === 'symbol' ? state.defaultStyles?.POINT?.symbol : state.defaultStyles?.POINT.marker), id: uuid.v1()}}; - - let geojsonFt = set("geometry.type", type === "Text" ? "Point" : type === "Circle" ? "Polygon" : type, selected); - geojsonFt = set("geometry.coordinates", type === "Circle" ? [[]] : [], geojsonFt); - geojsonFt = set("geometry", type === "Point" || type === "Text" ? null : geojsonFt.geometry, geojsonFt); - - // Reset highlight properties of other features except the selected feature - const editingFeatures = state.editing.features.filter(({properties: prop})=> prop?.id !== selected?.properties?.id)?.map((ft = {})=>{ ft.style = ft?.style?.map(s=> {s.highlight = false; return s;}) || []; return ft;}); - let newState = set(`editing.tempFeatures`, editingFeatures, state); - - return assign({}, state, { - drawing: !newState.drawing, - featureType: type, - drawingText: { - show: false, - drawing: false - }, - validationErrors: {}, - coordinateEditorEnabled: true, - editing: assign({}, newState.editing, { - features: newState.editing.features.map(f => { - return set("properties.canEdit", false, f); - }).concat([geojsonFt]) - }), - stylerType: head(getAvailableStyler(convertGeoJSONToInternalModel(selected.geometry))), - selected - }); - } - case TOGGLE_STYLE: - // removing highlight when the styler is opened - // const newStyling = !state.styling; - const newStyling = action.styling; - return { - ...state, - styling: newStyling, - originalStyle: newStyling ? state.selected && state.selected.style : state.originalStyle, - selected: set("style", castArray(state.selected && state.selected.style).map(s => ({...s, highlight: !newStyling})), state.selected), - editing: set("features", (state.editing && state.editing.features || []).map(f => ({...f, style: castArray(f.style).map(s => ({...s, highlight: !newStyling ? f.properties.id === (state.selected && state.selected.properties.id) : false}))})), state.editing) - }; - case VALIDATION_ERROR: - return assign({}, state, { - validationErrors: action.errors - }); - case SET_STYLE: { - let selected = set("style", action.style, state.selected); - let originalFeatureIndex = findIndex(state.editing && state.editing.features, ftTemp => ftTemp.properties.id === state.selected.properties.id); - if (originalFeatureIndex !== -1) { - let editing = set(`features[${originalFeatureIndex}].style`, action.style, state.editing); - return assign({}, state, { selected, editing }); - } - return assign({}, state, { selected }); - } - case SHOW_ANNOTATION: - return assign({}, state, { - current: action.id - }); - case CANCEL_SHOW_ANNOTATION: - return assign({}, state, { - current: null - }); - case TOGGLE_CONTROL: - if (action.control === 'annotations') { - return assign({}, state, { - current: null, - editing: null, - removing: null, - validationErrors: {}, - styling: false, - drawing: false, - coordinateEditorEnabled: false, - filter: null, - editedFields: {}, - originalStyle: null, - selected: null - }); - } - return state; - case HIGHLIGHT_POINT: { - return !action.point ? - {...state, clickPoint: null, showMarker: false} : - assign({}, state, { - clickPoint: {latlng: {lat: action.point.lat, lng: action.point.lon }}, - showMarker: true - }); - } - case CHANGE_FORMAT: { - return {...state, format: action.format}; - } - case UPDATE_SYMBOLS: { - return {...state, symbolList: action.symbols || []}; - } - case FILTER_ANNOTATIONS: - return assign({}, state, { - filter: action.filter - }); - case ERROR_SYMBOLS: - return {...state, symbolErrors: action.symbolErrors}; - case SET_DEFAULT_STYLE: - return set(`defaultStyles.${action.path}`, action.style, state); - case LOADING: { - // anyway sets loading to true - return set(action.name === "loading" ? "loading" : `loadFlags.${action.name}`, action.value, set( - "loading", action.value, state - )); - } - case FILTER_MARKER: { - return {...state, config: {...state.config, filter: action.filter}}; - } - case TOGGLE_SHOW_AGAIN: { - return {...state, showAgain: !state.showAgain}; - } - case HIDE_MEASURE_WARNING: { - return {...state, showPopupWarning: false}; - } - case START_DRAWING: - return {...state, config: {...state.config, geodesic: get(action.options, 'geodesic', false)}}; - case VALIDATE_FEATURE: - let updatedFeatures = state.editing.features.map((f) => { - const isValidFeature = validateFeature({ - properties: f.properties, - components: getComponents(f.geometry), - type: getGeometryType(f) - }); - return set(`properties.isValidFeature`, isValidFeature, f); - }); - - return assign({}, state, { - editing: {...state.editing, features: updatedFeatures } - }); - default: - return state; - - } -} - -export default annotations; diff --git a/web/client/reducers/config.js b/web/client/reducers/config.js index 8119591743..ef022e6353 100644 --- a/web/client/reducers/config.js +++ b/web/client/reducers/config.js @@ -23,7 +23,7 @@ import { MAP_TYPE_CHANGED, VISUALIZATION_MODE_CHANGED } from '../actions/maptype import assign from 'object-assign'; import ConfigUtils from '../utils/ConfigUtils'; import { set, unset } from '../utils/ImmutableUtils'; -import { transformLineToArcs } from '../utils/CoordinatesUtils'; +import { updateAnnotationsLayer } from '../plugins/Annotations/utils/AnnotationsUtils'; import { findIndex, castArray } from 'lodash'; import { getVisualizationModeFromMapLibrary, @@ -47,24 +47,12 @@ function mapConfig(state = null, action) { // regenerate geodesic lines as property since that info has not been saved let annotationsLayerIndex = findIndex(mapState.layers, layer => layer.id === "annotations"); if (annotationsLayerIndex !== -1) { - let featuresLayer = mapState.layers[annotationsLayerIndex].features.map(feature => { - if (feature.type === "FeatureCollection") { - return { - ...feature, - features: feature.features.map(f => { - if (f.properties.useGeodesicLines) { - return set("properties.geometryGeodesic", {type: "LineString", coordinates: transformLineToArcs(f.geometry.coordinates)}, f); - } - return f; - }) - }; + mapState.layers = mapState.layers.reduce((acc, layer, idx) => { + if (annotationsLayerIndex === idx) { + return [...acc, ...updateAnnotationsLayer(mapState.layers[annotationsLayerIndex])]; } - if (feature.properties.geometryGeodesic) { - return set("properties.geometryGeodesic", {type: "LineString", coordinates: transformLineToArcs(feature.geometry.coordinates)}, feature); - } - return state; - }); - mapState.layers[annotationsLayerIndex] = set("features", featuresLayer, mapState.layers[annotationsLayerIndex]); + return [...acc, layer]; + }, []); } let newMapState = { diff --git a/web/client/reducers/mapInfo.js b/web/client/reducers/mapInfo.js index 38cd59b055..7c0260bedf 100644 --- a/web/client/reducers/mapInfo.js +++ b/web/client/reducers/mapInfo.js @@ -6,8 +6,6 @@ * LICENSE file in the root directory of this source tree. */ import assign from 'object-assign'; -import buffer from 'turf-buffer'; -import intersect from 'turf-intersect'; import { findIndex, isUndefined, isEmpty } from 'lodash'; import { MAP_CONFIG_LOADED } from '../actions/config'; @@ -24,7 +22,6 @@ import { HIDE_MAPINFO_MARKER, SHOW_REVERSE_GEOCODE, HIDE_REVERSE_GEOCODE, - GET_VECTOR_INFO, NO_QUERYABLE_LAYERS, CLEAR_WARNING, FEATURE_INFO_CLICK, @@ -341,84 +338,6 @@ function mapInfo(state = initState, action) { } }); } - case GET_VECTOR_INFO: { - const point = { - "type": "Feature", - "properties": {}, - "geometry": { - "type": "Point", - "coordinates": [action.request.lng, action.request.lat] - } - }; - let unit = action.metadata && action.metadata.units; - switch (unit) { - case "m": - unit = "meters"; - break; - case "deg": - unit = "degrees"; - break; - case "mi": - unit = "miles"; - break; - default: - unit = "meters"; - } - let resolution = action.metadata && action.metadata.resolution || 1; - let bufferedPoint = buffer(point, (action.metadata.buffer || 1) * resolution, unit); - const intersected = (action.layer.features || []).filter( - (feature) => { - try { - // TODO: instead of create a fixed buffer, we should check the feature style to create the proper buffer. - - if (feature.type === "FeatureCollection" && feature.features && feature.features.length) { - return feature.features.reduce((p, c) => { - // if required use the geodesic geometry - let ft = c.properties.useGeodesicLines && c.properties.geometryGeodesic ? {...c, - geometry: c.properties.geometryGeodesic - } : c; - return p || intersect(bufferedPoint, resolution && action.metadata.buffer && unit ? buffer(ft, 1, "meters") : ft); - }, false); - } - return intersect(bufferedPoint, resolution && action.metadata.buffer && unit ? buffer(feature, 1, "meters") : feature); - - } catch (e) { - return false; - } - } - - ); - let responses = state.responses || []; - // Display feature info in popup - const isHover = state?.configuration?.trigger === 'hover' || state?.showInMapPopup; - const vectorResponse = { - response: { - crs: null, - features: intersected, - totalFeatures: "unknown", - type: "FeatureCollection" - }, - queryParams: action.request, - layerMetadata: action.metadata, - format: 'JSON' - }; - let vectorAction; - // Add response such that it doesn't replace other layer response's index - if (!isHover) { - responses[state.requests.length] = vectorResponse; - // To identify vector request index - vectorAction = {reqId: state.requests.length}; - } else { - responses = [...responses, vectorResponse]; - vectorAction = {reqId: 0}; - } - const requests = [...state.requests, {}]; - return receiveResponse(assign({}, state, { - requests, - queryableLayers: action.queryableLayers, - responses: [...responses] - }), vectorAction, "vector"); - } case UPDATE_CENTER_TO_MARKER: { return assign({}, state, { centerToMarker: action.status diff --git a/web/client/selectors/__tests__/annotations-test.js b/web/client/selectors/__tests__/annotations-test.js deleted file mode 100644 index 6d7e2da27f..0000000000 --- a/web/client/selectors/__tests__/annotations-test.js +++ /dev/null @@ -1,627 +0,0 @@ -/* -* Copyright 2019, GeoSolutions Sas. -* All rights reserved. -* -* This source code is licensed under the BSD-style license found in the -* LICENSE file in the root directory of this source tree. -*/ - -import expect from 'expect'; - -import { isEmpty, isArray } from 'lodash'; - -import { - annotationsLayerSelector, - multiGeometrySelector, - removingSelector, - showUnsavedChangesModalSelector, - showUnsavedStyleModalSelector, - showUnsavedGeometryModalSelector, - closingSelector, - formatSelector, - editingSelector, - drawingSelector, - stylerTypeSelector, - drawingTextSelector, - currentSelector, - modeSelector, - editedFieldsSelector, - stylingSelector, - unsavedChangesSelector, - unsavedStyleSelector, - unsavedGeometrySelector, - errorsSelector, - configSelector, - aeronauticalOptionsSelector, - annotationSelector, - annotationsListSelector, - symbolListSelector, - editGeometrySelector -} from '../annotations'; - -const state = { - controls: { - queryPanel: { - enabled: true - }, - layerdownload: { - available: true - } - }, - layers: { - flat: [{ - id: 'undefined__5', - group: 'background', - source: 'ol', - title: 'Empty Background', - type: 'empty', - visibility: false, - singleTile: false, - dimensions: [], - hideLoading: false, - handleClickOnLayer: false - }, { - id: 'annotations', - features: [{ - type: 'Feature', - properties: { - title: 'qe', - id: '051dc1f0-1004-11e8-b823-074c4aa21e05' - }, - geometry: { - type: 'GeometryCollection', - geometries: [ - { - type: 'MultiPoint', - coordinates: [ - [ - -15.292055042255983, - 50.92290805089552 - ] - ] - }, - { - type: 'MultiPoint', - coordinates: [ - [ - -8.260805042255983, - 50.25331169520629 - ] - ] - }, - { - type: 'MultiPoint', - coordinates: [ - [ - -8.392640979755985, - 48.62469821211753 - ] - ] - }, - { - type: 'MultiPoint', - coordinates: [ - [ - -11.600648792255985, - 47.12149867823992 - ] - ] - } - ] - }, - style: { - type: 'MultiPoint', - MultiPoint: { - iconColor: 'cyan', - iconShape: 'circle', - iconGlyph: 'comment' - }, - Point: { - iconColor: 'cyan', - iconShape: 'circle', - iconGlyph: 'comment' - }, - highlight: false - } - }, - { - type: 'Feature', - properties: { - title: 'multi geom with texts', - description: '<p>description of the annotation (<strong>only text here</strong>)</p>', - id: '14f738e0-1004-11e8-b823-074c4aa21e05', - textValues: [ - 'text annotation' - ], - textGeometriesIndexes: [ - 3 - ] - }, - geometry: { - type: 'GeometryCollection', - geometries: [ - { - type: 'MultiPoint', - coordinates: [ - [ - -15.116273792255985, - 43.85726130570702 - ] - ] - }, - { - type: 'MultiLineString', - coordinates: [ - [ - [ - -12.611390979755985, - 41.26847014527159 - ], - [ - -8.304750354755985, - 45.60534743757343 - ] - ] - ] - }, - { - type: 'MultiPolygon', - coordinates: [ - [ - [ - [ - -9.798890979755983, - 45.111286652123994 - ], - [ - -14.281312854755985, - 40.37056482316976 - ], - [ - -13.666078479755987, - 43.92060275549285 - ] - ] - ] - ] - }, - { - type: 'MultiPoint', - coordinates: [ - [ - -16.742250354755985, - 42.41428591353268 - ] - ] - } - ] - }, - style: { - type: 'GeometryCollection', - MultiPoint: { - iconColor: 'pink', - iconShape: 'square', - iconGlyph: 'comment' - }, - Point: { - iconColor: 'pink', - iconShape: 'square', - iconGlyph: 'comment' - }, - MultiLineString: { - color: '#A033FF', - opacity: 1, - weight: 3, - fillColor: '#ffffff', - fillOpacity: 0.2, - editing: { - fill: 1 - } - }, - LineString: { - color: '#A033FF', - opacity: 1, - weight: 3, - fillColor: '#ffffff', - fillOpacity: 0.2, - editing: { - fill: 1 - } - }, - MultiPolygon: { - color: '#33FF99', - opacity: 1, - weight: 3, - fillColor: '#65D495', - fillOpacity: 0.2, - editing: { - fill: 1 - } - }, - Polygon: { - color: '#33FF99', - opacity: 1, - weight: 3, - fillColor: '#65D495', - fillOpacity: 0.2, - editing: { - fill: 1 - } - }, - Text: { - font: '14px Arial', - color: '#1726E6', - weight: 1, - opacity: 1 - }, - highlight: false - } - }, - { - type: 'Feature', - properties: { - title: 'ads', - id: '9b39c170-10c7-11e8-8bd1-5d54c2264561', - textValues: [ - 'asd' - ], - textGeometriesIndexes: [ - 0 - ] - }, - geometry: { - type: 'GeometryCollection', - geometries: [ - { - type: 'MultiPoint', - coordinates: [ - [ - -16.522523792255985, - 46.00359577260061 - ] - ] - } - ] - }, - style: { - type: 'GeometryCollection', - Text: { - fontStyle: 'normal', - fontSize: '21', - fontSizeUom: 'px', - fontFamily: 'Arial', - fontWeight: 'normal', - font: 'normal normal 21px Arial', - textAlign: 'center', - color: '#A424C0', - opacity: 1 - }, - highlight: false - } - } - ], - name: 'Annotations', - style: { - type: 'MultiPoint', - MultiPoint: { - iconColor: 'cyan', - iconShape: 'circle', - iconGlyph: 'comment' - }, - Point: { - iconColor: 'cyan', - iconShape: 'circle', - iconGlyph: 'comment' - } - }, - type: 'vector', - visibility: true, - singleTile: false, - dimensions: [], - hideLoading: true, - handleClickOnLayer: true - } - ], - groups: [ - { - id: 'Default', - title: 'Default', - name: 'Default', - nodes: [ - 'annotations' - ], - expanded: true - } - ] - }, - annotations: { - format: "decimal", - config: { - multiGeometry: true - }, - current: '9b39c170-10c7-11e8-8bd1-5d54c2264561', - editing: { - type: 'Feature', - properties: { - title: 'ads', - id: '9b39c170-10c7-11e8-8bd1-5d54c2264561', - textValues: [ - 'asd', - 'asdfafdsa', - 'asdfafdsa' - ], - textGeometriesIndexes: [ - 0, - 0, - 1 - ] - }, - geometry: { - type: 'GeometryCollection', - geometries: [ - { - type: 'MultiPoint', - coordinates: [ - [ - -12.391664417255981, - 45.82014261504604 - ] - ] - }, - { - type: 'MultiPoint', - coordinates: [ - [ - -22.367250354755985, - 39.460534938478276 - ] - ] - } - ] - }, - style: { - type: 'GeometryCollection', - Text: { - fontStyle: 'normal', - fontSize: '21', - fontSizeUom: 'px', - fontFamily: 'Arial', - fontWeight: 'normal', - font: 'normal normal 21px Arial', - textAlign: 'center', - color: '#A424C0', - opacity: 1 - }, - highlight: true - } - }, - removing: null, - validationErrors: {}, - styling: true, - drawing: true, - filter: null, - originalStyle: { - type: 'GeometryCollection', - Text: { - fontStyle: 'normal', - fontSize: '21', - fontSizeUom: 'px', - fontFamily: 'Arial', - fontWeight: 'normal', - font: 'normal normal 21px Arial', - textAlign: 'center', - color: '#A424C0', - opacity: 1 - }, - highlight: false - }, - stylerType: 'text', - featureType: 'Text', - drawingText: { - show: false, - drawing: false - }, - unsavedChanges: true, - showUnsavedChangesModal: false, - showUnsavedStyleModal: false - } -}; - -describe('Test annotations selectors', () => { - it('test annotationsLayerSelector', () => { - const retVal = annotationsLayerSelector(state); - expect(retVal).toExist(); - expect(retVal.id).toBe("annotations"); - }); - it('test removingSelector', () => { - const retVal = removingSelector(state); - expect(retVal).toBe(null); - }); - it('test multiGeometrySelector when it is set', () => { - const multiGeometry = multiGeometrySelector(state); - expect(multiGeometry).toBe(true); - }); - it('test multiGeometrySelector when it is not set', () => { - const multiGeometry = multiGeometrySelector({}); - expect(multiGeometry).toBe(false); - }); - it('test showUnsavedChangesModalSelector', () => { - const retVal = showUnsavedChangesModalSelector(state); - expect(retVal).toBe(false); - }); - it('test formatSelector', () => { - const retVal = formatSelector(state); - expect(retVal).toBe("decimal"); - }); - it('test showUnsavedStyleModalSelector', () => { - const retVal = showUnsavedStyleModalSelector(state); - expect(retVal).toBe(false); - }); - it('test showUnsavedGeometryModalSelector', () => { - let retVal = showUnsavedGeometryModalSelector(state); - expect(retVal).toBe(false); - - retVal = showUnsavedGeometryModalSelector({annotations: {showUnsavedGeometryModal: true}}); - expect(retVal).toBe(true); - }); - it('test closingSelector', () => { - const retVal = closingSelector(state); - expect(retVal).toBe(false); - }); - it('test drawingSelector', () => { - const retVal = drawingSelector(state); - expect(retVal).toBe(true); - }); - it('test editingSelector', () => { - const retVal = editingSelector(state); - expect(retVal.properties.id).toBe("9b39c170-10c7-11e8-8bd1-5d54c2264561"); - }); - it('test currentSelector', () => { - const retVal = currentSelector(state); - expect(retVal).toBe("9b39c170-10c7-11e8-8bd1-5d54c2264561"); - }); - it('test drawingTextSelector', () => { - const retVal = drawingTextSelector(state); - expect(retVal.show).toBe(false); - expect(retVal.drawing).toBe(false); - }); - it('test stylerTypeSelector', () => { - const retVal = stylerTypeSelector(state); - expect(retVal).toBe("text"); - }); - it('test modeSelector', () => { - const retVal = modeSelector(state); - expect(retVal).toBe("editing"); - }); - it('test editedFieldsSelector', () => { - const retVal = editedFieldsSelector(state); - expect(isEmpty(retVal)).toBe(true); - }); - it('test stylingSelector', () => { - const retVal = stylingSelector(state); - expect(retVal).toBe(true); - }); - it('test unsavedChangesSelector', () => { - const retVal = unsavedChangesSelector(state); - expect(retVal).toBe(true); - }); - it('test unsavedStyleSelector', () => { - const retVal = unsavedStyleSelector(state); - expect(retVal).toBe(false); - }); - it('test unsavedGeometrySelector', () => { - let retVal = unsavedGeometrySelector(state); - expect(retVal).toBe(false); - retVal = unsavedGeometrySelector({annotations: {unsavedGeometry: true}}); - expect(retVal).toBe(true); - }); - it('test errorsSelector', () => { - const retVal = errorsSelector(state); - expect(isEmpty(retVal)).toBe(true); - }); - it('test configSelector', () => { - const retVal = configSelector(state); - expect(isEmpty(retVal)).toBe(false); - expect(retVal.multiGeometry).toBe(true); - }); - it('test annotationSelector', () => { - const retVal = annotationSelector(state); - expect(isEmpty(retVal)).toBe(false); - expect(retVal.annotation.properties.id).toBe("9b39c170-10c7-11e8-8bd1-5d54c2264561"); - }); - it('test annotationsListSelector', () => { - const retVal = annotationsListSelector(state); - expect(retVal.removing).toBe(null); - expect(retVal.filter).toBe(''); - }); - it('test aeronauticalOptionsSelector', () => { - const retVal = aeronauticalOptionsSelector(state); - expect(retVal).toBe(undefined); - }); - it('test aeronauticalOptionsSelector with true value', () => { - const retVal = aeronauticalOptionsSelector({annotations: {aeronauticalOptions: true}}); - expect(retVal).toBe(true); - }); - it('test symbolListSelector ', () => { - let retVal = symbolListSelector({annotations: {}}); - expect(isArray(retVal)).toBe(true); - expect(retVal.length).toBe(0); - - const symbolList = [{name: "symbolName"}]; - retVal = symbolListSelector({annotations: {symbolList}}); - expect(isArray(retVal)).toBe(true); - expect(retVal.length).toBe(symbolList.length); - }); - - it('modeSelector', () => { - // list mode - expect(modeSelector({ - annotations: { editing: false } - })).toBe('list'); - // editing mode - expect(modeSelector({ - annotations: {editing: true} - })).toBe('editing'); - - // detail mode - expect(modeSelector({ - layers: { - flat: [{id: 'annotations'}] - }, - annotations: { - current: true - } - })).toBe('detail'); - - // list mode if annotations layer is not present and editing deactivated - expect(modeSelector({ - layers: { - flat: [{ id: 'OTHER_LAYER' }] - }, - annotations: { - current: true - } - })).toBe('list'); - }); - - it('annotationsListSelector', () => { - // list mode - expect(annotationsListSelector({ - annotations: { editing: false } - }).mode).toBe('list'); - // editing mode - expect(annotationsListSelector({ - annotations: { editing: true } - }).mode).toBe('editing'); - - // detail mode - expect(annotationsListSelector({ - layers: { - flat: [{ id: 'annotations' }] - }, - annotations: { - current: true - } - }).mode).toBe('detail'); - - // list mode if annotations layer is not present and editing deactivated - expect(annotationsListSelector({ - layers: { - flat: [{ id: 'OTHER_LAYER' }] - }, - annotations: { - current: true - } - }).mode).toBe('list'); - }); - it('editGeometrySelector', () => { - // Edit geometry - expect(editGeometrySelector({ - annotations: {editGeometry: false} - })).toBe(false); - // Default edit geometry - expect(editGeometrySelector({ - annotations: {} - })).toBe(true); - }); -}); diff --git a/web/client/selectors/annotations.js b/web/client/selectors/annotations.js deleted file mode 100644 index 7937818d10..0000000000 --- a/web/client/selectors/annotations.js +++ /dev/null @@ -1,126 +0,0 @@ -/* -* Copyright 2017, GeoSolutions Sas. -* All rights reserved. -* -* This source code is licensed under the BSD-style license found in the -* LICENSE file in the root directory of this source tree. -*/ - -import { createSelector } from 'reselect'; - -import { layersSelector } from './layers'; -import { projectionSelector } from './map'; -import { isOpenlayers } from './maptype'; -import { isMapInfoOpen } from './mapInfo'; -import { head, get } from 'lodash'; -import assign from 'object-assign'; -import { getConfigProp } from '../utils/ConfigUtils'; - -export const annotationsLayerSelector = createSelector([ - layersSelector -], (layers) => head(layers.filter(l => l.id === 'annotations')) -); - -export const multiGeometrySelector = (state) => get(state, 'annotations.config.multiGeometry', false); -export const removingSelector = (state) => get(state, "annotations.removing"); -export const formatSelector = (state) => get(state, "annotations.format"); -export const aeronauticalOptionsSelector = (state) => get(state, "annotations.aeronauticalOptions"); -export const showUnsavedChangesModalSelector = (state) => get(state, "annotations.showUnsavedChangesModal", false); -export const showUnsavedStyleModalSelector = (state) => get(state, "annotations.showUnsavedStyleModal", false); -export const showUnsavedGeometryModalSelector = (state) => get(state, "annotations.showUnsavedGeometryModal", false); -export const showDeleteFeatureModalSelector = (state) => get(state, "annotations.showDeleteFeatureModal", false); -export const closingSelector = (state) => !!get(state, "annotations.closing"); -export const editingSelector = (state) => get(state, "annotations.editing"); -export const editGeometrySelector = (state) => get(state, "annotations.editGeometry", true); -export const featureTypeSelector = (state) => get(state, "annotations.featureType"); -export const coordinateEditorEnabledSelector = (state) => get(state, "annotations.coordinateEditorEnabled"); -export const drawingSelector = (state) => !!get(state, "annotations.drawing"); -export const stylerTypeSelector = (state) => get(state, "annotations.stylerType"); -export const drawingTextSelector = (state) => get(state, "annotations.drawingText"); -export const currentSelector = (state) => get(state, "annotations.current"); -export const editedFieldsSelector = (state) => get(state, "annotations.editedFields", {}); -export const stylingSelector = (state) => !!get(state, "annotations.styling"); -export const selectedSelector = (state) => get(state, "annotations.selected", null); -export const unsavedChangesSelector = (state) => get(state, "annotations.unsavedChanges", false); -export const unsavedGeometrySelector = (state) => get(state, "annotations.unsavedGeometry", false); -export const unsavedStyleSelector = (state) => get(state, "annotations.unsavedStyle", false); -export const errorsSelector = (state) => get(state, "annotations.validationErrors", {}); -export const configSelector = (state) => get(state, "annotations.config", {}); -export const symbolListSelector = (state) => get(state, "annotations.symbolList", []); -export const symbolErrorsSelector = (state) => get(state, "annotations.symbolErrors", []); -export const modeSelector = (state) => editingSelector(state) && 'editing' || annotationsLayerSelector(state) && currentSelector(state) && 'detail' || 'list'; -export const defaultStylesSelector = state => state.annotations.defaultStyles; -export const loadingSelector = state => state.annotations.loading; -export const showAgainSelector = (state) => get(state, "annotations.showAgain", false); -export const showPopupWarningSelector = (state) => get(state, "annotations.showPopupWarning", true); - -export const annotationsInfoSelector = (state) => (assign({}, { - symbolErrors: symbolErrorsSelector(state), - showEdit: isOpenlayers(state), - canEdit: editGeometrySelector(state), - mouseHoverEvents: isMapInfoOpen(state), - closing: closingSelector(state), - format: formatSelector(state) || getConfigProp("defaultCoordinateFormat"), - aeronauticalOptions: aeronauticalOptionsSelector(state), - config: configSelector(state), - drawing: drawingSelector(state), - drawingText: drawingTextSelector(state), - errors: errorsSelector(state), - editing: editingSelector(state), - coordinateEditorEnabled: coordinateEditorEnabledSelector(state), - editedFields: editedFieldsSelector(state), - mode: modeSelector(state), - selected: selectedSelector(state), - featureType: featureTypeSelector(state), - removing: removingSelector(state), - mapProjection: projectionSelector(state), - showUnsavedChangesModal: showUnsavedChangesModalSelector(state), - showDeleteFeatureModal: showDeleteFeatureModalSelector(state), - showUnsavedGeometryModal: showUnsavedGeometryModalSelector(state), - showUnsavedStyleModal: showUnsavedStyleModalSelector(state), - stylerType: stylerTypeSelector(state), - styling: stylingSelector(state), - unsavedChanges: unsavedChangesSelector(state), - unsavedGeometry: unsavedGeometrySelector(state), - unsavedStyle: unsavedStyleSelector(state), - symbolList: symbolListSelector(state), - showAgain: showAgainSelector(state), - showPopupWarning: showPopupWarningSelector(state) -}) ); - -export const annotationsSelector = (state) => ({ - ...(state.annotations || {}) -}); - -export const annotationsListSelector = createSelector([ - annotationsInfoSelector, - annotationsSelector, - annotationsLayerSelector, - modeSelector -], (info, annotations, layer, mode) => (assign({}, { - format: annotations.format, - aeronauticalOptions: annotations.aeronauticalOptions, - removing: annotations.removing, - showUnsavedChangesModal: annotations.showUnsavedChangesModal, - showUnsavedGeometryModal: annotations.showUnsavedGeometryModal, - showUnsavedStyleModal: annotations.showUnsavedStyleModal, - showDeleteFeatureModal: annotations.showDeleteFeatureModal, - closing: !!annotations.closing, - mode, - annotations: layer && layer.features || [], - current: annotations.current || null, - editing: info.editing, - selected: info.selected, - filter: annotations.filter || '', - defaultStyles: annotations.defaultStyles, - loading: annotations.loading -}, info.config ? { - config: info.config -} : { }))); - -export const annotationSelector = createSelector([annotationsListSelector], (annotations) => { - const id = annotations.current; - return { - annotation: head(annotations.annotations.filter(a => a.properties.id === id)) - }; -}); diff --git a/web/client/themes/default/icons.less b/web/client/themes/default/icons.less index 89e00c5c34..1432f6184b 100644 --- a/web/client/themes/default/icons.less +++ b/web/client/themes/default/icons.less @@ -95,304 +95,306 @@ .glyphicon-1-vector-alt:before { content: "\f135"; } .glyphicon-1-vector:before { content: "\f136"; } .glyphicon-3d:before { content: "\f137"; } -.glyphicon-add-dashboard:before { content: "\f138"; } -.glyphicon-add-folder:before { content: "\f139"; } -.glyphicon-add-geostory:before { content: "\f13a"; } -.glyphicon-add-layer:before { content: "\f13b"; } -.glyphicon-add-map:before { content: "\f13c"; } -.glyphicon-add-row-after:before { content: "\f13d"; } -.glyphicon-add-row-before:before { content: "\f13e"; } -.glyphicon-adjust:before { content: "\f13f"; } -.glyphicon-admin-geofence:before { content: "\f140"; } -.glyphicon-alert:before { content: "\f141"; } -.glyphicon-align-center:before { content: "\f142"; } -.glyphicon-align-justify:before { content: "\f143"; } -.glyphicon-align-left:before { content: "\f144"; } -.glyphicon-align-right:before { content: "\f145"; } -.glyphicon-angle:before { content: "\f146"; } -.glyphicon-arrow-down:before { content: "\f147"; } -.glyphicon-arrow-left:before { content: "\f148"; } -.glyphicon-arrow-right:before { content: "\f149"; } -.glyphicon-arrow-up:before { content: "\f14a"; } -.glyphicon-asterisk:before { content: "\f14b"; } -.glyphicon-audio-low:before { content: "\f14c"; } -.glyphicon-audio:before { content: "\f14d"; } -.glyphicon-back:before { content: "\f14e"; } -.glyphicon-backward:before { content: "\f14f"; } -.glyphicon-ban-circle:before { content: "\f150"; } -.glyphicon-barcode:before { content: "\f151"; } -.glyphicon-bold:before { content: "\f152"; } -.glyphicon-book:before { content: "\f153"; } -.glyphicon-bookmark:before { content: "\f154"; } -.glyphicon-bulb-off:before { content: "\f155"; } -.glyphicon-bulb-on:before { content: "\f156"; } -.glyphicon-calendar:before { content: "\f157"; } -.glyphicon-camera:before { content: "\f158"; } -.glyphicon-caption:before { content: "\f159"; } -.glyphicon-check:before { content: "\f15a"; } -.glyphicon-chevron-down:before { content: "\f15b"; } -.glyphicon-chevron-left:before { content: "\f15c"; } -.glyphicon-chevron-right:before { content: "\f15d"; } -.glyphicon-chevron-up:before { content: "\f15e"; } -.glyphicon-circle-arrow-down:before { content: "\f15f"; } -.glyphicon-circle-arrow-left:before { content: "\f160"; } -.glyphicon-circle-arrow-right:before { content: "\f161"; } -.glyphicon-circle-arrow-up:before { content: "\f162"; } -.glyphicon-clear-brush:before { content: "\f163"; } -.glyphicon-clear-filter:before { content: "\f164"; } -.glyphicon-cloud-download:before { content: "\f165"; } -.glyphicon-cloud-upload:before { content: "\f166"; } -.glyphicon-cloud:before { content: "\f167"; } -.glyphicon-code:before { content: "\f168"; } -.glyphicon-cog:before { content: "\f169"; } -.glyphicon-collapse-down:before { content: "\f16a"; } -.glyphicon-collapse-up:before { content: "\f16b"; } -.glyphicon-comment:before { content: "\f16c"; } -.glyphicon-compressed:before { content: "\f16d"; } -.glyphicon-copy:before { content: "\f16e"; } -.glyphicon-counter:before { content: "\f16f"; } -.glyphicon-crs:before { content: "\f170"; } -.glyphicon-dashboard-save:before { content: "\f171"; } -.glyphicon-dashboard:before { content: "\f172"; } -.glyphicon-download-alt:before { content: "\f173"; } -.glyphicon-download:before { content: "\f174"; } -.glyphicon-dropper:before { content: "\f175"; } -.glyphicon-duplicate:before { content: "\f176"; } -.glyphicon-edit:before { content: "\f177"; } -.glyphicon-envelope:before { content: "\f178"; } -.glyphicon-exclamation-mark:before { content: "\f179"; } -.glyphicon-exclamation-sign:before { content: "\f17a"; } -.glyphicon-expand:before { content: "\f17b"; } -.glyphicon-export:before { content: "\f17c"; } -.glyphicon-ext-empty:before { content: "\f17d"; } -.glyphicon-ext-html:before { content: "\f17e"; } -.glyphicon-ext-json:before { content: "\f17f"; } -.glyphicon-ext-pdf:before { content: "\f180"; } -.glyphicon-ext-txt:before { content: "\f181"; } -.glyphicon-ext-wmc:before { content: "\f182"; } -.glyphicon-eye-close:before { content: "\f183"; } -.glyphicon-eye-open:before { content: "\f184"; } -.glyphicon-fast-backward:before { content: "\f185"; } -.glyphicon-fast-forward:before { content: "\f186"; } -.glyphicon-features-grid-download:before { content: "\f187"; } -.glyphicon-features-grid-set:before { content: "\f188"; } -.glyphicon-features-grid:before { content: "\f189"; } -.glyphicon-file:before { content: "\f18a"; } -.glyphicon-filter-layer:before { content: "\f18b"; } -.glyphicon-filter:before { content: "\f18c"; } -.glyphicon-fit-contain:before { content: "\f18d"; } -.glyphicon-fit-cover:before { content: "\f18e"; } -.glyphicon-flag:before { content: "\f18f"; } -.glyphicon-flash:before { content: "\f190"; } -.glyphicon-floppy-disk:before { content: "\f191"; } -.glyphicon-floppy-open:before { content: "\f192"; } -.glyphicon-floppy-remove:before { content: "\f193"; } -.glyphicon-floppy-save:before { content: "\f194"; } -.glyphicon-floppy-saved:before { content: "\f195"; } -.glyphicon-folder-close:before { content: "\f196"; } -.glyphicon-folder-open:before { content: "\f197"; } -.glyphicon-font-add:before { content: "\f198"; } -.glyphicon-font:before { content: "\f199"; } -.glyphicon-forward:before { content: "\f19a"; } -.glyphicon-geometry-collection:before { content: "\f19b"; } -.glyphicon-geoserver:before { content: "\f19c"; } -.glyphicon-geostory:before { content: "\f19d"; } -.glyphicon-globe:before { content: "\f19e"; } -.glyphicon-grab-handle:before { content: "\f19f"; } -.glyphicon-gray-scale:before { content: "\f1a0"; } -.glyphicon-grid-custom:before { content: "\f1a1"; } -.glyphicon-grid-regular:before { content: "\f1a2"; } -.glyphicon-hand-down:before { content: "\f1a3"; } -.glyphicon-hand-left:before { content: "\f1a4"; } -.glyphicon-hand-right:before { content: "\f1a5"; } -.glyphicon-hand-up:before { content: "\f1a6"; } -.glyphicon-hdd:before { content: "\f1a7"; } -.glyphicon-heart:before { content: "\f1a8"; } -.glyphicon-height-auto:before { content: "\f1a9"; } -.glyphicon-height-from-terrain:before { content: "\f1aa"; } -.glyphicon-height-view:before { content: "\f1ab"; } -.glyphicon-hide-marker:before { content: "\f1ac"; } -.glyphicon-home:before { content: "\f1ad"; } -.glyphicon-hourglass:before { content: "\f1ae"; } -.glyphicon-import:before { content: "\f1af"; } -.glyphicon-inbox:before { content: "\f1b0"; } -.glyphicon-info-sign:before { content: "\f1b1"; } -.glyphicon-italic:before { content: "\f1b2"; } -.glyphicon-layer-info:before { content: "\f1b3"; } -.glyphicon-leaf:before { content: "\f1b4"; } -.glyphicon-level-up:before { content: "\f1b5"; } -.glyphicon-line-dash:before { content: "\f1b6"; } -.glyphicon-line-minus:before { content: "\f1b7"; } -.glyphicon-line-plus:before { content: "\f1b8"; } -.glyphicon-line-remove:before { content: "\f1b9"; } -.glyphicon-line-trash:before { content: "\f1ba"; } -.glyphicon-line:before { content: "\f1bb"; } -.glyphicon-link:before { content: "\f1bc"; } -.glyphicon-list-alt:before { content: "\f1bd"; } -.glyphicon-list:before { content: "\f1be"; } -.glyphicon-lock:before { content: "\f1bf"; } -.glyphicon-log-in:before { content: "\f1c0"; } -.glyphicon-log-out:before { content: "\f1c1"; } -.glyphicon-loop:before { content: "\f1c2"; } -.glyphicon-magnet:before { content: "\f1c3"; } -.glyphicon-map-context:before { content: "\f1c4"; } -.glyphicon-map-edit:before { content: "\f1c5"; } -.glyphicon-map-filter:before { content: "\f1c6"; } -.glyphicon-map-marker:before { content: "\f1c7"; } -.glyphicon-map-synch:before { content: "\f1c8"; } -.glyphicon-map-view:before { content: "\f1c9"; } -.glyphicon-maps-catalog:before { content: "\f1ca"; } -.glyphicon-menu-hamburger:before { content: "\f1cb"; } -.glyphicon-minus-sign:before { content: "\f1cc"; } -.glyphicon-minus:before { content: "\f1cd"; } -.glyphicon-model-plus:before { content: "\f1ce"; } -.glyphicon-model:before { content: "\f1cf"; } -.glyphicon-mouse:before { content: "\f1d0"; } -.glyphicon-move-row-after:before { content: "\f1d1"; } -.glyphicon-move-row-before:before { content: "\f1d2"; } -.glyphicon-move:before { content: "\f1d3"; } -.glyphicon-muted:before { content: "\f1d4"; } -.glyphicon-new-window:before { content: "\f1d5"; } -.glyphicon-next:before { content: "\f1d6"; } -.glyphicon-off:before { content: "\f1d7"; } -.glyphicon-ok-circle:before { content: "\f1d8"; } -.glyphicon-ok-sign:before { content: "\f1d9"; } -.glyphicon-ok:before { content: "\f1da"; } -.glyphicon-open:before { content: "\f1db"; } -.glyphicon-option-horizontal:before { content: "\f1dc"; } -.glyphicon-option-vertical:before { content: "\f1dd"; } -.glyphicon-paperclip:before { content: "\f1de"; } -.glyphicon-paste:before { content: "\f1df"; } -.glyphicon-pause:before { content: "\f1e0"; } -.glyphicon-pencil-add:before { content: "\f1e1"; } -.glyphicon-pencil-edit:before { content: "\f1e2"; } -.glyphicon-pencil:before { content: "\f1e3"; } -.glyphicon-phone:before { content: "\f1e4"; } -.glyphicon-picture:before { content: "\f1e5"; } -.glyphicon-pie-chart:before { content: "\f1e6"; } -.glyphicon-plane:before { content: "\f1e7"; } -.glyphicon-play-circle:before { content: "\f1e8"; } -.glyphicon-play:before { content: "\f1e9"; } -.glyphicon-playback:before { content: "\f1ea"; } -.glyphicon-plug:before { content: "\f1eb"; } -.glyphicon-plus-sign:before { content: "\f1ec"; } -.glyphicon-plus-square:before { content: "\f1ed"; } -.glyphicon-plus:before { content: "\f1ee"; } -.glyphicon-point-coordinates:before { content: "\f1ef"; } -.glyphicon-point-dash:before { content: "\f1f0"; } -.glyphicon-point-minus:before { content: "\f1f1"; } -.glyphicon-point-plus:before { content: "\f1f2"; } -.glyphicon-point-remove:before { content: "\f1f3"; } -.glyphicon-point-trash:before { content: "\f1f4"; } -.glyphicon-point:before { content: "\f1f5"; } -.glyphicon-polygon-3d:before { content: "\f1f6"; } -.glyphicon-polygon-dash:before { content: "\f1f7"; } -.glyphicon-polygon-minus:before { content: "\f1f8"; } -.glyphicon-polygon-plus:before { content: "\f1f9"; } -.glyphicon-polygon-remove:before { content: "\f1fa"; } -.glyphicon-polygon-trash:before { content: "\f1fb"; } -.glyphicon-polygon:before { content: "\f1fc"; } -.glyphicon-polyline-3d:before { content: "\f1fd"; } -.glyphicon-polyline-dash:before { content: "\f1fe"; } -.glyphicon-polyline-minus:before { content: "\f1ff"; } -.glyphicon-polyline-plus:before { content: "\f200"; } -.glyphicon-polyline-remove:before { content: "\f201"; } -.glyphicon-polyline-trash:before { content: "\f202"; } -.glyphicon-polyline:before { content: "\f203"; } -.glyphicon-preview:before { content: "\f204"; } -.glyphicon-print:before { content: "\f205"; } -.glyphicon-pushpin:before { content: "\f206"; } -.glyphicon-qrcode:before { content: "\f207"; } -.glyphicon-question-sign:before { content: "\f208"; } -.glyphicon-random:before { content: "\f209"; } -.glyphicon-range-end:before { content: "\f20a"; } -.glyphicon-range-start:before { content: "\f20b"; } -.glyphicon-record:before { content: "\f20c"; } -.glyphicon-redo:before { content: "\f20d"; } -.glyphicon-refresh:before { content: "\f20e"; } -.glyphicon-remove-circle:before { content: "\f20f"; } -.glyphicon-remove-sign:before { content: "\f210"; } -.glyphicon-remove-square:before { content: "\f211"; } -.glyphicon-remove:before { content: "\f212"; } -.glyphicon-repeat:before { content: "\f213"; } -.glyphicon-resize-full:before { content: "\f214"; } -.glyphicon-resize-horizontal:before { content: "\f215"; } -.glyphicon-resize-small:before { content: "\f216"; } -.glyphicon-resize-vertical:before { content: "\f217"; } -.glyphicon-retweet:before { content: "\f218"; } -.glyphicon-rgb:before { content: "\f219"; } -.glyphicon-road:before { content: "\f21a"; } -.glyphicon-row-add:before { content: "\f21b"; } -.glyphicon-row-trash:before { content: "\f21c"; } -.glyphicon-save:before { content: "\f21d"; } -.glyphicon-saved:before { content: "\f21e"; } -.glyphicon-scissors:before { content: "\f21f"; } -.glyphicon-screenshot:before { content: "\f220"; } -.glyphicon-search-coords:before { content: "\f221"; } -.glyphicon-search:before { content: "\f222"; } -.glyphicon-send:before { content: "\f223"; } -.glyphicon-share-alt:before { content: "\f224"; } -.glyphicon-share:before { content: "\f225"; } -.glyphicon-sheet:before { content: "\f226"; } -.glyphicon-shopping-cart:before { content: "\f227"; } -.glyphicon-signal:before { content: "\f228"; } -.glyphicon-size-extra-large:before { content: "\f229"; } -.glyphicon-size-large:before { content: "\f22a"; } -.glyphicon-size-medium:before { content: "\f22b"; } -.glyphicon-size-small:before { content: "\f22c"; } -.glyphicon-slope:before { content: "\f22d"; } -.glyphicon-sort-by-alphabet-alt:before { content: "\f22e"; } -.glyphicon-sort-by-alphabet:before { content: "\f22f"; } -.glyphicon-sort-by-attributes-alt:before { content: "\f230"; } -.glyphicon-sort-by-attributes:before { content: "\f231"; } -.glyphicon-sort:before { content: "\f232"; } -.glyphicon-star-empty:before { content: "\f233"; } -.glyphicon-star:before { content: "\f234"; } -.glyphicon-stats:before { content: "\f235"; } -.glyphicon-step-backward:before { content: "\f236"; } -.glyphicon-step-forward:before { content: "\f237"; } -.glyphicon-stop:before { content: "\f238"; } -.glyphicon-story-banner-section:before { content: "\f239"; } -.glyphicon-story-carousel-section:before { content: "\f23a"; } -.glyphicon-story-immersive-content:before { content: "\f23b"; } -.glyphicon-story-immersive-section:before { content: "\f23c"; } -.glyphicon-story-media-section:before { content: "\f23d"; } -.glyphicon-story-paragraph-section:before { content: "\f23e"; } -.glyphicon-story-title-section:before { content: "\f23f"; } -.glyphicon-story-webpage-section:before { content: "\f240"; } -.glyphicon-tag:before { content: "\f241"; } -.glyphicon-tags:before { content: "\f242"; } -.glyphicon-tasks:before { content: "\f243"; } -.glyphicon-text-background:before { content: "\f244"; } -.glyphicon-text-colour:before { content: "\f245"; } -.glyphicon-text-height:before { content: "\f246"; } -.glyphicon-text-width:before { content: "\f247"; } -.glyphicon-th-large:before { content: "\f248"; } -.glyphicon-th-list:before { content: "\f249"; } -.glyphicon-th:before { content: "\f24a"; } -.glyphicon-thumbs-down:before { content: "\f24b"; } -.glyphicon-thumbs-up:before { content: "\f24c"; } -.glyphicon-time-current:before { content: "\f24d"; } -.glyphicon-time-offset:before { content: "\f24e"; } -.glyphicon-time:before { content: "\f24f"; } -.glyphicon-tint:before { content: "\f250"; } -.glyphicon-transfer:before { content: "\f251"; } -.glyphicon-trash-square:before { content: "\f252"; } -.glyphicon-trash:before { content: "\f253"; } -.glyphicon-unchecked:before { content: "\f254"; } -.glyphicon-undo:before { content: "\f255"; } -.glyphicon-unplug:before { content: "\f256"; } -.glyphicon-upload:before { content: "\f257"; } -.glyphicon-usd:before { content: "\f258"; } -.glyphicon-user:before { content: "\f259"; } -.glyphicon-vert-dashed:before { content: "\f25a"; } -.glyphicon-viewport-filter:before { content: "\f25b"; } -.glyphicon-warning-sign:before { content: "\f25c"; } -.glyphicon-webpage:before { content: "\f25d"; } -.glyphicon-wrench:before { content: "\f25e"; } -.glyphicon-zoom-in:before { content: "\f25f"; } -.glyphicon-zoom-out:before { content: "\f260"; } -.glyphicon-zoom-to:before { content: "\f261"; } +.glyphicon-add-comment:before { content: "\f138"; } +.glyphicon-add-dashboard:before { content: "\f139"; } +.glyphicon-add-folder:before { content: "\f13a"; } +.glyphicon-add-geostory:before { content: "\f13b"; } +.glyphicon-add-layer:before { content: "\f13c"; } +.glyphicon-add-map:before { content: "\f13d"; } +.glyphicon-add-row-after:before { content: "\f13e"; } +.glyphicon-add-row-before:before { content: "\f13f"; } +.glyphicon-adjust:before { content: "\f140"; } +.glyphicon-admin-geofence:before { content: "\f141"; } +.glyphicon-alert:before { content: "\f142"; } +.glyphicon-align-center:before { content: "\f143"; } +.glyphicon-align-justify:before { content: "\f144"; } +.glyphicon-align-left:before { content: "\f145"; } +.glyphicon-align-right:before { content: "\f146"; } +.glyphicon-angle:before { content: "\f147"; } +.glyphicon-arrow-down:before { content: "\f148"; } +.glyphicon-arrow-left:before { content: "\f149"; } +.glyphicon-arrow-right:before { content: "\f14a"; } +.glyphicon-arrow-up:before { content: "\f14b"; } +.glyphicon-asterisk:before { content: "\f14c"; } +.glyphicon-audio-low:before { content: "\f14d"; } +.glyphicon-audio:before { content: "\f14e"; } +.glyphicon-back:before { content: "\f14f"; } +.glyphicon-backward:before { content: "\f150"; } +.glyphicon-ban-circle:before { content: "\f151"; } +.glyphicon-barcode:before { content: "\f152"; } +.glyphicon-bold:before { content: "\f153"; } +.glyphicon-book:before { content: "\f154"; } +.glyphicon-bookmark:before { content: "\f155"; } +.glyphicon-bulb-off:before { content: "\f156"; } +.glyphicon-bulb-on:before { content: "\f157"; } +.glyphicon-calendar:before { content: "\f158"; } +.glyphicon-camera:before { content: "\f159"; } +.glyphicon-caption:before { content: "\f15a"; } +.glyphicon-check:before { content: "\f15b"; } +.glyphicon-chevron-down:before { content: "\f15c"; } +.glyphicon-chevron-left:before { content: "\f15d"; } +.glyphicon-chevron-right:before { content: "\f15e"; } +.glyphicon-chevron-up:before { content: "\f15f"; } +.glyphicon-circle-arrow-down:before { content: "\f160"; } +.glyphicon-circle-arrow-left:before { content: "\f161"; } +.glyphicon-circle-arrow-right:before { content: "\f162"; } +.glyphicon-circle-arrow-up:before { content: "\f163"; } +.glyphicon-clear-brush:before { content: "\f164"; } +.glyphicon-clear-filter:before { content: "\f165"; } +.glyphicon-cloud-download:before { content: "\f166"; } +.glyphicon-cloud-upload:before { content: "\f167"; } +.glyphicon-cloud:before { content: "\f168"; } +.glyphicon-code:before { content: "\f169"; } +.glyphicon-cog:before { content: "\f16a"; } +.glyphicon-collapse-down:before { content: "\f16b"; } +.glyphicon-collapse-up:before { content: "\f16c"; } +.glyphicon-comment:before { content: "\f16d"; } +.glyphicon-compressed:before { content: "\f16e"; } +.glyphicon-copy:before { content: "\f16f"; } +.glyphicon-counter:before { content: "\f170"; } +.glyphicon-crs:before { content: "\f171"; } +.glyphicon-dashboard-save:before { content: "\f172"; } +.glyphicon-dashboard:before { content: "\f173"; } +.glyphicon-download-alt:before { content: "\f174"; } +.glyphicon-download-comment:before { content: "\f175"; } +.glyphicon-download:before { content: "\f176"; } +.glyphicon-dropper:before { content: "\f177"; } +.glyphicon-duplicate:before { content: "\f178"; } +.glyphicon-edit:before { content: "\f179"; } +.glyphicon-envelope:before { content: "\f17a"; } +.glyphicon-exclamation-mark:before { content: "\f17b"; } +.glyphicon-exclamation-sign:before { content: "\f17c"; } +.glyphicon-expand:before { content: "\f17d"; } +.glyphicon-export:before { content: "\f17e"; } +.glyphicon-ext-empty:before { content: "\f17f"; } +.glyphicon-ext-html:before { content: "\f180"; } +.glyphicon-ext-json:before { content: "\f181"; } +.glyphicon-ext-pdf:before { content: "\f182"; } +.glyphicon-ext-txt:before { content: "\f183"; } +.glyphicon-ext-wmc:before { content: "\f184"; } +.glyphicon-eye-close:before { content: "\f185"; } +.glyphicon-eye-open:before { content: "\f186"; } +.glyphicon-fast-backward:before { content: "\f187"; } +.glyphicon-fast-forward:before { content: "\f188"; } +.glyphicon-features-grid-download:before { content: "\f189"; } +.glyphicon-features-grid-set:before { content: "\f18a"; } +.glyphicon-features-grid:before { content: "\f18b"; } +.glyphicon-file:before { content: "\f18c"; } +.glyphicon-filter-layer:before { content: "\f18d"; } +.glyphicon-filter:before { content: "\f18e"; } +.glyphicon-fit-contain:before { content: "\f18f"; } +.glyphicon-fit-cover:before { content: "\f190"; } +.glyphicon-flag:before { content: "\f191"; } +.glyphicon-flash:before { content: "\f192"; } +.glyphicon-floppy-disk:before { content: "\f193"; } +.glyphicon-floppy-open:before { content: "\f194"; } +.glyphicon-floppy-remove:before { content: "\f195"; } +.glyphicon-floppy-save:before { content: "\f196"; } +.glyphicon-floppy-saved:before { content: "\f197"; } +.glyphicon-folder-close:before { content: "\f198"; } +.glyphicon-folder-open:before { content: "\f199"; } +.glyphicon-font-add:before { content: "\f19a"; } +.glyphicon-font:before { content: "\f19b"; } +.glyphicon-forward:before { content: "\f19c"; } +.glyphicon-geometry-collection:before { content: "\f19d"; } +.glyphicon-geoserver:before { content: "\f19e"; } +.glyphicon-geostory:before { content: "\f19f"; } +.glyphicon-globe:before { content: "\f1a0"; } +.glyphicon-grab-handle:before { content: "\f1a1"; } +.glyphicon-gray-scale:before { content: "\f1a2"; } +.glyphicon-grid-custom:before { content: "\f1a3"; } +.glyphicon-grid-regular:before { content: "\f1a4"; } +.glyphicon-hand-down:before { content: "\f1a5"; } +.glyphicon-hand-left:before { content: "\f1a6"; } +.glyphicon-hand-right:before { content: "\f1a7"; } +.glyphicon-hand-up:before { content: "\f1a8"; } +.glyphicon-hdd:before { content: "\f1a9"; } +.glyphicon-heart:before { content: "\f1aa"; } +.glyphicon-height-auto:before { content: "\f1ab"; } +.glyphicon-height-from-terrain:before { content: "\f1ac"; } +.glyphicon-height-view:before { content: "\f1ad"; } +.glyphicon-hide-marker:before { content: "\f1ae"; } +.glyphicon-home:before { content: "\f1af"; } +.glyphicon-hourglass:before { content: "\f1b0"; } +.glyphicon-import:before { content: "\f1b1"; } +.glyphicon-inbox:before { content: "\f1b2"; } +.glyphicon-info-sign:before { content: "\f1b3"; } +.glyphicon-italic:before { content: "\f1b4"; } +.glyphicon-layer-info:before { content: "\f1b5"; } +.glyphicon-leaf:before { content: "\f1b6"; } +.glyphicon-level-up:before { content: "\f1b7"; } +.glyphicon-line-dash:before { content: "\f1b8"; } +.glyphicon-line-minus:before { content: "\f1b9"; } +.glyphicon-line-plus:before { content: "\f1ba"; } +.glyphicon-line-remove:before { content: "\f1bb"; } +.glyphicon-line-trash:before { content: "\f1bc"; } +.glyphicon-line:before { content: "\f1bd"; } +.glyphicon-link:before { content: "\f1be"; } +.glyphicon-list-alt:before { content: "\f1bf"; } +.glyphicon-list:before { content: "\f1c0"; } +.glyphicon-lock:before { content: "\f1c1"; } +.glyphicon-log-in:before { content: "\f1c2"; } +.glyphicon-log-out:before { content: "\f1c3"; } +.glyphicon-loop:before { content: "\f1c4"; } +.glyphicon-magnet:before { content: "\f1c5"; } +.glyphicon-map-context:before { content: "\f1c6"; } +.glyphicon-map-edit:before { content: "\f1c7"; } +.glyphicon-map-filter:before { content: "\f1c8"; } +.glyphicon-map-marker:before { content: "\f1c9"; } +.glyphicon-map-synch:before { content: "\f1ca"; } +.glyphicon-map-view:before { content: "\f1cb"; } +.glyphicon-maps-catalog:before { content: "\f1cc"; } +.glyphicon-menu-hamburger:before { content: "\f1cd"; } +.glyphicon-minus-sign:before { content: "\f1ce"; } +.glyphicon-minus:before { content: "\f1cf"; } +.glyphicon-model-plus:before { content: "\f1d0"; } +.glyphicon-model:before { content: "\f1d1"; } +.glyphicon-mouse:before { content: "\f1d2"; } +.glyphicon-move-row-after:before { content: "\f1d3"; } +.glyphicon-move-row-before:before { content: "\f1d4"; } +.glyphicon-move:before { content: "\f1d5"; } +.glyphicon-muted:before { content: "\f1d6"; } +.glyphicon-new-window:before { content: "\f1d7"; } +.glyphicon-next:before { content: "\f1d8"; } +.glyphicon-off:before { content: "\f1d9"; } +.glyphicon-ok-circle:before { content: "\f1da"; } +.glyphicon-ok-sign:before { content: "\f1db"; } +.glyphicon-ok:before { content: "\f1dc"; } +.glyphicon-open:before { content: "\f1dd"; } +.glyphicon-option-horizontal:before { content: "\f1de"; } +.glyphicon-option-vertical:before { content: "\f1df"; } +.glyphicon-paperclip:before { content: "\f1e0"; } +.glyphicon-paste:before { content: "\f1e1"; } +.glyphicon-pause:before { content: "\f1e2"; } +.glyphicon-pencil-add:before { content: "\f1e3"; } +.glyphicon-pencil-edit:before { content: "\f1e4"; } +.glyphicon-pencil:before { content: "\f1e5"; } +.glyphicon-phone:before { content: "\f1e6"; } +.glyphicon-picture:before { content: "\f1e7"; } +.glyphicon-pie-chart:before { content: "\f1e8"; } +.glyphicon-plane:before { content: "\f1e9"; } +.glyphicon-play-circle:before { content: "\f1ea"; } +.glyphicon-play:before { content: "\f1eb"; } +.glyphicon-playback:before { content: "\f1ec"; } +.glyphicon-plug:before { content: "\f1ed"; } +.glyphicon-plus-sign:before { content: "\f1ee"; } +.glyphicon-plus-square:before { content: "\f1ef"; } +.glyphicon-plus:before { content: "\f1f0"; } +.glyphicon-point-coordinates:before { content: "\f1f1"; } +.glyphicon-point-dash:before { content: "\f1f2"; } +.glyphicon-point-minus:before { content: "\f1f3"; } +.glyphicon-point-plus:before { content: "\f1f4"; } +.glyphicon-point-remove:before { content: "\f1f5"; } +.glyphicon-point-trash:before { content: "\f1f6"; } +.glyphicon-point:before { content: "\f1f7"; } +.glyphicon-polygon-3d:before { content: "\f1f8"; } +.glyphicon-polygon-dash:before { content: "\f1f9"; } +.glyphicon-polygon-minus:before { content: "\f1fa"; } +.glyphicon-polygon-plus:before { content: "\f1fb"; } +.glyphicon-polygon-remove:before { content: "\f1fc"; } +.glyphicon-polygon-trash:before { content: "\f1fd"; } +.glyphicon-polygon:before { content: "\f1fe"; } +.glyphicon-polyline-3d:before { content: "\f1ff"; } +.glyphicon-polyline-dash:before { content: "\f200"; } +.glyphicon-polyline-minus:before { content: "\f201"; } +.glyphicon-polyline-plus:before { content: "\f202"; } +.glyphicon-polyline-remove:before { content: "\f203"; } +.glyphicon-polyline-trash:before { content: "\f204"; } +.glyphicon-polyline:before { content: "\f205"; } +.glyphicon-preview:before { content: "\f206"; } +.glyphicon-print:before { content: "\f207"; } +.glyphicon-pushpin:before { content: "\f208"; } +.glyphicon-qrcode:before { content: "\f209"; } +.glyphicon-question-sign:before { content: "\f20a"; } +.glyphicon-random:before { content: "\f20b"; } +.glyphicon-range-end:before { content: "\f20c"; } +.glyphicon-range-start:before { content: "\f20d"; } +.glyphicon-record:before { content: "\f20e"; } +.glyphicon-redo:before { content: "\f20f"; } +.glyphicon-refresh:before { content: "\f210"; } +.glyphicon-remove-circle:before { content: "\f211"; } +.glyphicon-remove-sign:before { content: "\f212"; } +.glyphicon-remove-square:before { content: "\f213"; } +.glyphicon-remove:before { content: "\f214"; } +.glyphicon-repeat:before { content: "\f215"; } +.glyphicon-resize-full:before { content: "\f216"; } +.glyphicon-resize-horizontal:before { content: "\f217"; } +.glyphicon-resize-small:before { content: "\f218"; } +.glyphicon-resize-vertical:before { content: "\f219"; } +.glyphicon-retweet:before { content: "\f21a"; } +.glyphicon-rgb:before { content: "\f21b"; } +.glyphicon-road:before { content: "\f21c"; } +.glyphicon-row-add:before { content: "\f21d"; } +.glyphicon-row-trash:before { content: "\f21e"; } +.glyphicon-save:before { content: "\f21f"; } +.glyphicon-saved:before { content: "\f220"; } +.glyphicon-scissors:before { content: "\f221"; } +.glyphicon-screenshot:before { content: "\f222"; } +.glyphicon-search-coords:before { content: "\f223"; } +.glyphicon-search:before { content: "\f224"; } +.glyphicon-send:before { content: "\f225"; } +.glyphicon-share-alt:before { content: "\f226"; } +.glyphicon-share:before { content: "\f227"; } +.glyphicon-sheet:before { content: "\f228"; } +.glyphicon-shopping-cart:before { content: "\f229"; } +.glyphicon-signal:before { content: "\f22a"; } +.glyphicon-size-extra-large:before { content: "\f22b"; } +.glyphicon-size-large:before { content: "\f22c"; } +.glyphicon-size-medium:before { content: "\f22d"; } +.glyphicon-size-small:before { content: "\f22e"; } +.glyphicon-slope:before { content: "\f22f"; } +.glyphicon-sort-by-alphabet-alt:before { content: "\f230"; } +.glyphicon-sort-by-alphabet:before { content: "\f231"; } +.glyphicon-sort-by-attributes-alt:before { content: "\f232"; } +.glyphicon-sort-by-attributes:before { content: "\f233"; } +.glyphicon-sort:before { content: "\f234"; } +.glyphicon-star-empty:before { content: "\f235"; } +.glyphicon-star:before { content: "\f236"; } +.glyphicon-stats:before { content: "\f237"; } +.glyphicon-step-backward:before { content: "\f238"; } +.glyphicon-step-forward:before { content: "\f239"; } +.glyphicon-stop:before { content: "\f23a"; } +.glyphicon-story-banner-section:before { content: "\f23b"; } +.glyphicon-story-carousel-section:before { content: "\f23c"; } +.glyphicon-story-immersive-content:before { content: "\f23d"; } +.glyphicon-story-immersive-section:before { content: "\f23e"; } +.glyphicon-story-media-section:before { content: "\f23f"; } +.glyphicon-story-paragraph-section:before { content: "\f240"; } +.glyphicon-story-title-section:before { content: "\f241"; } +.glyphicon-story-webpage-section:before { content: "\f242"; } +.glyphicon-tag:before { content: "\f243"; } +.glyphicon-tags:before { content: "\f244"; } +.glyphicon-tasks:before { content: "\f245"; } +.glyphicon-text-background:before { content: "\f246"; } +.glyphicon-text-colour:before { content: "\f247"; } +.glyphicon-text-height:before { content: "\f248"; } +.glyphicon-text-width:before { content: "\f249"; } +.glyphicon-th-large:before { content: "\f24a"; } +.glyphicon-th-list:before { content: "\f24b"; } +.glyphicon-th:before { content: "\f24c"; } +.glyphicon-thumbs-down:before { content: "\f24d"; } +.glyphicon-thumbs-up:before { content: "\f24e"; } +.glyphicon-time-current:before { content: "\f24f"; } +.glyphicon-time-offset:before { content: "\f250"; } +.glyphicon-time:before { content: "\f251"; } +.glyphicon-tint:before { content: "\f252"; } +.glyphicon-transfer:before { content: "\f253"; } +.glyphicon-trash-square:before { content: "\f254"; } +.glyphicon-trash:before { content: "\f255"; } +.glyphicon-unchecked:before { content: "\f256"; } +.glyphicon-undo:before { content: "\f257"; } +.glyphicon-unplug:before { content: "\f258"; } +.glyphicon-upload:before { content: "\f259"; } +.glyphicon-usd:before { content: "\f25a"; } +.glyphicon-user:before { content: "\f25b"; } +.glyphicon-vert-dashed:before { content: "\f25c"; } +.glyphicon-viewport-filter:before { content: "\f25d"; } +.glyphicon-warning-sign:before { content: "\f25e"; } +.glyphicon-webpage:before { content: "\f25f"; } +.glyphicon-wrench:before { content: "\f260"; } +.glyphicon-zoom-in:before { content: "\f261"; } +.glyphicon-zoom-out:before { content: "\f262"; } +.glyphicon-zoom-to:before { content: "\f263"; } /* classes with icon code @@ -454,301 +456,303 @@ structure .glyphicon-{iconName}-content .glyphicon-1-vector-alt-content { content: "\f135"; } .glyphicon-1-vector-content { content: "\f136"; } .glyphicon-3d-content { content: "\f137"; } -.glyphicon-add-dashboard-content { content: "\f138"; } -.glyphicon-add-folder-content { content: "\f139"; } -.glyphicon-add-geostory-content { content: "\f13a"; } -.glyphicon-add-layer-content { content: "\f13b"; } -.glyphicon-add-map-content { content: "\f13c"; } -.glyphicon-add-row-after-content { content: "\f13d"; } -.glyphicon-add-row-before-content { content: "\f13e"; } -.glyphicon-adjust-content { content: "\f13f"; } -.glyphicon-admin-geofence-content { content: "\f140"; } -.glyphicon-alert-content { content: "\f141"; } -.glyphicon-align-center-content { content: "\f142"; } -.glyphicon-align-justify-content { content: "\f143"; } -.glyphicon-align-left-content { content: "\f144"; } -.glyphicon-align-right-content { content: "\f145"; } -.glyphicon-angle-content { content: "\f146"; } -.glyphicon-arrow-down-content { content: "\f147"; } -.glyphicon-arrow-left-content { content: "\f148"; } -.glyphicon-arrow-right-content { content: "\f149"; } -.glyphicon-arrow-up-content { content: "\f14a"; } -.glyphicon-asterisk-content { content: "\f14b"; } -.glyphicon-audio-low-content { content: "\f14c"; } -.glyphicon-audio-content { content: "\f14d"; } -.glyphicon-back-content { content: "\f14e"; } -.glyphicon-backward-content { content: "\f14f"; } -.glyphicon-ban-circle-content { content: "\f150"; } -.glyphicon-barcode-content { content: "\f151"; } -.glyphicon-bold-content { content: "\f152"; } -.glyphicon-book-content { content: "\f153"; } -.glyphicon-bookmark-content { content: "\f154"; } -.glyphicon-bulb-off-content { content: "\f155"; } -.glyphicon-bulb-on-content { content: "\f156"; } -.glyphicon-calendar-content { content: "\f157"; } -.glyphicon-camera-content { content: "\f158"; } -.glyphicon-caption-content { content: "\f159"; } -.glyphicon-check-content { content: "\f15a"; } -.glyphicon-chevron-down-content { content: "\f15b"; } -.glyphicon-chevron-left-content { content: "\f15c"; } -.glyphicon-chevron-right-content { content: "\f15d"; } -.glyphicon-chevron-up-content { content: "\f15e"; } -.glyphicon-circle-arrow-down-content { content: "\f15f"; } -.glyphicon-circle-arrow-left-content { content: "\f160"; } -.glyphicon-circle-arrow-right-content { content: "\f161"; } -.glyphicon-circle-arrow-up-content { content: "\f162"; } -.glyphicon-clear-brush-content { content: "\f163"; } -.glyphicon-clear-filter-content { content: "\f164"; } -.glyphicon-cloud-download-content { content: "\f165"; } -.glyphicon-cloud-upload-content { content: "\f166"; } -.glyphicon-cloud-content { content: "\f167"; } -.glyphicon-code-content { content: "\f168"; } -.glyphicon-cog-content { content: "\f169"; } -.glyphicon-collapse-down-content { content: "\f16a"; } -.glyphicon-collapse-up-content { content: "\f16b"; } -.glyphicon-comment-content { content: "\f16c"; } -.glyphicon-compressed-content { content: "\f16d"; } -.glyphicon-copy-content { content: "\f16e"; } -.glyphicon-counter-content { content: "\f16f"; } -.glyphicon-crs-content { content: "\f170"; } -.glyphicon-dashboard-save-content { content: "\f171"; } -.glyphicon-dashboard-content { content: "\f172"; } -.glyphicon-download-alt-content { content: "\f173"; } -.glyphicon-download-content { content: "\f174"; } -.glyphicon-dropper-content { content: "\f175"; } -.glyphicon-duplicate-content { content: "\f176"; } -.glyphicon-edit-content { content: "\f177"; } -.glyphicon-envelope-content { content: "\f178"; } -.glyphicon-exclamation-mark-content { content: "\f179"; } -.glyphicon-exclamation-sign-content { content: "\f17a"; } -.glyphicon-expand-content { content: "\f17b"; } -.glyphicon-export-content { content: "\f17c"; } -.glyphicon-ext-empty-content { content: "\f17d"; } -.glyphicon-ext-html-content { content: "\f17e"; } -.glyphicon-ext-json-content { content: "\f17f"; } -.glyphicon-ext-pdf-content { content: "\f180"; } -.glyphicon-ext-txt-content { content: "\f181"; } -.glyphicon-ext-wmc-content { content: "\f182"; } -.glyphicon-eye-close-content { content: "\f183"; } -.glyphicon-eye-open-content { content: "\f184"; } -.glyphicon-fast-backward-content { content: "\f185"; } -.glyphicon-fast-forward-content { content: "\f186"; } -.glyphicon-features-grid-download-content { content: "\f187"; } -.glyphicon-features-grid-set-content { content: "\f188"; } -.glyphicon-features-grid-content { content: "\f189"; } -.glyphicon-file-content { content: "\f18a"; } -.glyphicon-filter-layer-content { content: "\f18b"; } -.glyphicon-filter-content { content: "\f18c"; } -.glyphicon-fit-contain-content { content: "\f18d"; } -.glyphicon-fit-cover-content { content: "\f18e"; } -.glyphicon-flag-content { content: "\f18f"; } -.glyphicon-flash-content { content: "\f190"; } -.glyphicon-floppy-disk-content { content: "\f191"; } -.glyphicon-floppy-open-content { content: "\f192"; } -.glyphicon-floppy-remove-content { content: "\f193"; } -.glyphicon-floppy-save-content { content: "\f194"; } -.glyphicon-floppy-saved-content { content: "\f195"; } -.glyphicon-folder-close-content { content: "\f196"; } -.glyphicon-folder-open-content { content: "\f197"; } -.glyphicon-font-add-content { content: "\f198"; } -.glyphicon-font-content { content: "\f199"; } -.glyphicon-forward-content { content: "\f19a"; } -.glyphicon-geometry-collection-content { content: "\f19b"; } -.glyphicon-geoserver-content { content: "\f19c"; } -.glyphicon-geostory-content { content: "\f19d"; } -.glyphicon-globe-content { content: "\f19e"; } -.glyphicon-grab-handle-content { content: "\f19f"; } -.glyphicon-gray-scale-content { content: "\f1a0"; } -.glyphicon-grid-custom-content { content: "\f1a1"; } -.glyphicon-grid-regular-content { content: "\f1a2"; } -.glyphicon-hand-down-content { content: "\f1a3"; } -.glyphicon-hand-left-content { content: "\f1a4"; } -.glyphicon-hand-right-content { content: "\f1a5"; } -.glyphicon-hand-up-content { content: "\f1a6"; } -.glyphicon-hdd-content { content: "\f1a7"; } -.glyphicon-heart-content { content: "\f1a8"; } -.glyphicon-height-auto-content { content: "\f1a9"; } -.glyphicon-height-from-terrain-content { content: "\f1aa"; } -.glyphicon-height-view-content { content: "\f1ab"; } -.glyphicon-hide-marker-content { content: "\f1ac"; } -.glyphicon-home-content { content: "\f1ad"; } -.glyphicon-hourglass-content { content: "\f1ae"; } -.glyphicon-import-content { content: "\f1af"; } -.glyphicon-inbox-content { content: "\f1b0"; } -.glyphicon-info-sign-content { content: "\f1b1"; } -.glyphicon-italic-content { content: "\f1b2"; } -.glyphicon-layer-info-content { content: "\f1b3"; } -.glyphicon-leaf-content { content: "\f1b4"; } -.glyphicon-level-up-content { content: "\f1b5"; } -.glyphicon-line-dash-content { content: "\f1b6"; } -.glyphicon-line-minus-content { content: "\f1b7"; } -.glyphicon-line-plus-content { content: "\f1b8"; } -.glyphicon-line-remove-content { content: "\f1b9"; } -.glyphicon-line-trash-content { content: "\f1ba"; } -.glyphicon-line-content { content: "\f1bb"; } -.glyphicon-link-content { content: "\f1bc"; } -.glyphicon-list-alt-content { content: "\f1bd"; } -.glyphicon-list-content { content: "\f1be"; } -.glyphicon-lock-content { content: "\f1bf"; } -.glyphicon-log-in-content { content: "\f1c0"; } -.glyphicon-log-out-content { content: "\f1c1"; } -.glyphicon-loop-content { content: "\f1c2"; } -.glyphicon-magnet-content { content: "\f1c3"; } -.glyphicon-map-context-content { content: "\f1c4"; } -.glyphicon-map-edit-content { content: "\f1c5"; } -.glyphicon-map-filter-content { content: "\f1c6"; } -.glyphicon-map-marker-content { content: "\f1c7"; } -.glyphicon-map-synch-content { content: "\f1c8"; } -.glyphicon-map-view-content { content: "\f1c9"; } -.glyphicon-maps-catalog-content { content: "\f1ca"; } -.glyphicon-menu-hamburger-content { content: "\f1cb"; } -.glyphicon-minus-sign-content { content: "\f1cc"; } -.glyphicon-minus-content { content: "\f1cd"; } -.glyphicon-model-plus-content { content: "\f1ce"; } -.glyphicon-model-content { content: "\f1cf"; } -.glyphicon-mouse-content { content: "\f1d0"; } -.glyphicon-move-row-after-content { content: "\f1d1"; } -.glyphicon-move-row-before-content { content: "\f1d2"; } -.glyphicon-move-content { content: "\f1d3"; } -.glyphicon-muted-content { content: "\f1d4"; } -.glyphicon-new-window-content { content: "\f1d5"; } -.glyphicon-next-content { content: "\f1d6"; } -.glyphicon-off-content { content: "\f1d7"; } -.glyphicon-ok-circle-content { content: "\f1d8"; } -.glyphicon-ok-sign-content { content: "\f1d9"; } -.glyphicon-ok-content { content: "\f1da"; } -.glyphicon-open-content { content: "\f1db"; } -.glyphicon-option-horizontal-content { content: "\f1dc"; } -.glyphicon-option-vertical-content { content: "\f1dd"; } -.glyphicon-paperclip-content { content: "\f1de"; } -.glyphicon-paste-content { content: "\f1df"; } -.glyphicon-pause-content { content: "\f1e0"; } -.glyphicon-pencil-add-content { content: "\f1e1"; } -.glyphicon-pencil-edit-content { content: "\f1e2"; } -.glyphicon-pencil-content { content: "\f1e3"; } -.glyphicon-phone-content { content: "\f1e4"; } -.glyphicon-picture-content { content: "\f1e5"; } -.glyphicon-pie-chart-content { content: "\f1e6"; } -.glyphicon-plane-content { content: "\f1e7"; } -.glyphicon-play-circle-content { content: "\f1e8"; } -.glyphicon-play-content { content: "\f1e9"; } -.glyphicon-playback-content { content: "\f1ea"; } -.glyphicon-plug-content { content: "\f1eb"; } -.glyphicon-plus-sign-content { content: "\f1ec"; } -.glyphicon-plus-square-content { content: "\f1ed"; } -.glyphicon-plus-content { content: "\f1ee"; } -.glyphicon-point-coordinates-content { content: "\f1ef"; } -.glyphicon-point-dash-content { content: "\f1f0"; } -.glyphicon-point-minus-content { content: "\f1f1"; } -.glyphicon-point-plus-content { content: "\f1f2"; } -.glyphicon-point-remove-content { content: "\f1f3"; } -.glyphicon-point-trash-content { content: "\f1f4"; } -.glyphicon-point-content { content: "\f1f5"; } -.glyphicon-polygon-3d-content { content: "\f1f6"; } -.glyphicon-polygon-dash-content { content: "\f1f7"; } -.glyphicon-polygon-minus-content { content: "\f1f8"; } -.glyphicon-polygon-plus-content { content: "\f1f9"; } -.glyphicon-polygon-remove-content { content: "\f1fa"; } -.glyphicon-polygon-trash-content { content: "\f1fb"; } -.glyphicon-polygon-content { content: "\f1fc"; } -.glyphicon-polyline-3d-content { content: "\f1fd"; } -.glyphicon-polyline-dash-content { content: "\f1fe"; } -.glyphicon-polyline-minus-content { content: "\f1ff"; } -.glyphicon-polyline-plus-content { content: "\f200"; } -.glyphicon-polyline-remove-content { content: "\f201"; } -.glyphicon-polyline-trash-content { content: "\f202"; } -.glyphicon-polyline-content { content: "\f203"; } -.glyphicon-preview-content { content: "\f204"; } -.glyphicon-print-content { content: "\f205"; } -.glyphicon-pushpin-content { content: "\f206"; } -.glyphicon-qrcode-content { content: "\f207"; } -.glyphicon-question-sign-content { content: "\f208"; } -.glyphicon-random-content { content: "\f209"; } -.glyphicon-range-end-content { content: "\f20a"; } -.glyphicon-range-start-content { content: "\f20b"; } -.glyphicon-record-content { content: "\f20c"; } -.glyphicon-redo-content { content: "\f20d"; } -.glyphicon-refresh-content { content: "\f20e"; } -.glyphicon-remove-circle-content { content: "\f20f"; } -.glyphicon-remove-sign-content { content: "\f210"; } -.glyphicon-remove-square-content { content: "\f211"; } -.glyphicon-remove-content { content: "\f212"; } -.glyphicon-repeat-content { content: "\f213"; } -.glyphicon-resize-full-content { content: "\f214"; } -.glyphicon-resize-horizontal-content { content: "\f215"; } -.glyphicon-resize-small-content { content: "\f216"; } -.glyphicon-resize-vertical-content { content: "\f217"; } -.glyphicon-retweet-content { content: "\f218"; } -.glyphicon-rgb-content { content: "\f219"; } -.glyphicon-road-content { content: "\f21a"; } -.glyphicon-row-add-content { content: "\f21b"; } -.glyphicon-row-trash-content { content: "\f21c"; } -.glyphicon-save-content { content: "\f21d"; } -.glyphicon-saved-content { content: "\f21e"; } -.glyphicon-scissors-content { content: "\f21f"; } -.glyphicon-screenshot-content { content: "\f220"; } -.glyphicon-search-coords-content { content: "\f221"; } -.glyphicon-search-content { content: "\f222"; } -.glyphicon-send-content { content: "\f223"; } -.glyphicon-share-alt-content { content: "\f224"; } -.glyphicon-share-content { content: "\f225"; } -.glyphicon-sheet-content { content: "\f226"; } -.glyphicon-shopping-cart-content { content: "\f227"; } -.glyphicon-signal-content { content: "\f228"; } -.glyphicon-size-extra-large-content { content: "\f229"; } -.glyphicon-size-large-content { content: "\f22a"; } -.glyphicon-size-medium-content { content: "\f22b"; } -.glyphicon-size-small-content { content: "\f22c"; } -.glyphicon-slope-content { content: "\f22d"; } -.glyphicon-sort-by-alphabet-alt-content { content: "\f22e"; } -.glyphicon-sort-by-alphabet-content { content: "\f22f"; } -.glyphicon-sort-by-attributes-alt-content { content: "\f230"; } -.glyphicon-sort-by-attributes-content { content: "\f231"; } -.glyphicon-sort-content { content: "\f232"; } -.glyphicon-star-empty-content { content: "\f233"; } -.glyphicon-star-content { content: "\f234"; } -.glyphicon-stats-content { content: "\f235"; } -.glyphicon-step-backward-content { content: "\f236"; } -.glyphicon-step-forward-content { content: "\f237"; } -.glyphicon-stop-content { content: "\f238"; } -.glyphicon-story-banner-section-content { content: "\f239"; } -.glyphicon-story-carousel-section-content { content: "\f23a"; } -.glyphicon-story-immersive-content-content { content: "\f23b"; } -.glyphicon-story-immersive-section-content { content: "\f23c"; } -.glyphicon-story-media-section-content { content: "\f23d"; } -.glyphicon-story-paragraph-section-content { content: "\f23e"; } -.glyphicon-story-title-section-content { content: "\f23f"; } -.glyphicon-story-webpage-section-content { content: "\f240"; } -.glyphicon-tag-content { content: "\f241"; } -.glyphicon-tags-content { content: "\f242"; } -.glyphicon-tasks-content { content: "\f243"; } -.glyphicon-text-background-content { content: "\f244"; } -.glyphicon-text-colour-content { content: "\f245"; } -.glyphicon-text-height-content { content: "\f246"; } -.glyphicon-text-width-content { content: "\f247"; } -.glyphicon-th-large-content { content: "\f248"; } -.glyphicon-th-list-content { content: "\f249"; } -.glyphicon-th-content { content: "\f24a"; } -.glyphicon-thumbs-down-content { content: "\f24b"; } -.glyphicon-thumbs-up-content { content: "\f24c"; } -.glyphicon-time-current-content { content: "\f24d"; } -.glyphicon-time-offset-content { content: "\f24e"; } -.glyphicon-time-content { content: "\f24f"; } -.glyphicon-tint-content { content: "\f250"; } -.glyphicon-transfer-content { content: "\f251"; } -.glyphicon-trash-square-content { content: "\f252"; } -.glyphicon-trash-content { content: "\f253"; } -.glyphicon-unchecked-content { content: "\f254"; } -.glyphicon-undo-content { content: "\f255"; } -.glyphicon-unplug-content { content: "\f256"; } -.glyphicon-upload-content { content: "\f257"; } -.glyphicon-usd-content { content: "\f258"; } -.glyphicon-user-content { content: "\f259"; } -.glyphicon-vert-dashed-content { content: "\f25a"; } -.glyphicon-viewport-filter-content { content: "\f25b"; } -.glyphicon-warning-sign-content { content: "\f25c"; } -.glyphicon-webpage-content { content: "\f25d"; } -.glyphicon-wrench-content { content: "\f25e"; } -.glyphicon-zoom-in-content { content: "\f25f"; } -.glyphicon-zoom-out-content { content: "\f260"; } -.glyphicon-zoom-to-content { content: "\f261"; } +.glyphicon-add-comment-content { content: "\f138"; } +.glyphicon-add-dashboard-content { content: "\f139"; } +.glyphicon-add-folder-content { content: "\f13a"; } +.glyphicon-add-geostory-content { content: "\f13b"; } +.glyphicon-add-layer-content { content: "\f13c"; } +.glyphicon-add-map-content { content: "\f13d"; } +.glyphicon-add-row-after-content { content: "\f13e"; } +.glyphicon-add-row-before-content { content: "\f13f"; } +.glyphicon-adjust-content { content: "\f140"; } +.glyphicon-admin-geofence-content { content: "\f141"; } +.glyphicon-alert-content { content: "\f142"; } +.glyphicon-align-center-content { content: "\f143"; } +.glyphicon-align-justify-content { content: "\f144"; } +.glyphicon-align-left-content { content: "\f145"; } +.glyphicon-align-right-content { content: "\f146"; } +.glyphicon-angle-content { content: "\f147"; } +.glyphicon-arrow-down-content { content: "\f148"; } +.glyphicon-arrow-left-content { content: "\f149"; } +.glyphicon-arrow-right-content { content: "\f14a"; } +.glyphicon-arrow-up-content { content: "\f14b"; } +.glyphicon-asterisk-content { content: "\f14c"; } +.glyphicon-audio-low-content { content: "\f14d"; } +.glyphicon-audio-content { content: "\f14e"; } +.glyphicon-back-content { content: "\f14f"; } +.glyphicon-backward-content { content: "\f150"; } +.glyphicon-ban-circle-content { content: "\f151"; } +.glyphicon-barcode-content { content: "\f152"; } +.glyphicon-bold-content { content: "\f153"; } +.glyphicon-book-content { content: "\f154"; } +.glyphicon-bookmark-content { content: "\f155"; } +.glyphicon-bulb-off-content { content: "\f156"; } +.glyphicon-bulb-on-content { content: "\f157"; } +.glyphicon-calendar-content { content: "\f158"; } +.glyphicon-camera-content { content: "\f159"; } +.glyphicon-caption-content { content: "\f15a"; } +.glyphicon-check-content { content: "\f15b"; } +.glyphicon-chevron-down-content { content: "\f15c"; } +.glyphicon-chevron-left-content { content: "\f15d"; } +.glyphicon-chevron-right-content { content: "\f15e"; } +.glyphicon-chevron-up-content { content: "\f15f"; } +.glyphicon-circle-arrow-down-content { content: "\f160"; } +.glyphicon-circle-arrow-left-content { content: "\f161"; } +.glyphicon-circle-arrow-right-content { content: "\f162"; } +.glyphicon-circle-arrow-up-content { content: "\f163"; } +.glyphicon-clear-brush-content { content: "\f164"; } +.glyphicon-clear-filter-content { content: "\f165"; } +.glyphicon-cloud-download-content { content: "\f166"; } +.glyphicon-cloud-upload-content { content: "\f167"; } +.glyphicon-cloud-content { content: "\f168"; } +.glyphicon-code-content { content: "\f169"; } +.glyphicon-cog-content { content: "\f16a"; } +.glyphicon-collapse-down-content { content: "\f16b"; } +.glyphicon-collapse-up-content { content: "\f16c"; } +.glyphicon-comment-content { content: "\f16d"; } +.glyphicon-compressed-content { content: "\f16e"; } +.glyphicon-copy-content { content: "\f16f"; } +.glyphicon-counter-content { content: "\f170"; } +.glyphicon-crs-content { content: "\f171"; } +.glyphicon-dashboard-save-content { content: "\f172"; } +.glyphicon-dashboard-content { content: "\f173"; } +.glyphicon-download-alt-content { content: "\f174"; } +.glyphicon-download-comment-content { content: "\f175"; } +.glyphicon-download-content { content: "\f176"; } +.glyphicon-dropper-content { content: "\f177"; } +.glyphicon-duplicate-content { content: "\f178"; } +.glyphicon-edit-content { content: "\f179"; } +.glyphicon-envelope-content { content: "\f17a"; } +.glyphicon-exclamation-mark-content { content: "\f17b"; } +.glyphicon-exclamation-sign-content { content: "\f17c"; } +.glyphicon-expand-content { content: "\f17d"; } +.glyphicon-export-content { content: "\f17e"; } +.glyphicon-ext-empty-content { content: "\f17f"; } +.glyphicon-ext-html-content { content: "\f180"; } +.glyphicon-ext-json-content { content: "\f181"; } +.glyphicon-ext-pdf-content { content: "\f182"; } +.glyphicon-ext-txt-content { content: "\f183"; } +.glyphicon-ext-wmc-content { content: "\f184"; } +.glyphicon-eye-close-content { content: "\f185"; } +.glyphicon-eye-open-content { content: "\f186"; } +.glyphicon-fast-backward-content { content: "\f187"; } +.glyphicon-fast-forward-content { content: "\f188"; } +.glyphicon-features-grid-download-content { content: "\f189"; } +.glyphicon-features-grid-set-content { content: "\f18a"; } +.glyphicon-features-grid-content { content: "\f18b"; } +.glyphicon-file-content { content: "\f18c"; } +.glyphicon-filter-layer-content { content: "\f18d"; } +.glyphicon-filter-content { content: "\f18e"; } +.glyphicon-fit-contain-content { content: "\f18f"; } +.glyphicon-fit-cover-content { content: "\f190"; } +.glyphicon-flag-content { content: "\f191"; } +.glyphicon-flash-content { content: "\f192"; } +.glyphicon-floppy-disk-content { content: "\f193"; } +.glyphicon-floppy-open-content { content: "\f194"; } +.glyphicon-floppy-remove-content { content: "\f195"; } +.glyphicon-floppy-save-content { content: "\f196"; } +.glyphicon-floppy-saved-content { content: "\f197"; } +.glyphicon-folder-close-content { content: "\f198"; } +.glyphicon-folder-open-content { content: "\f199"; } +.glyphicon-font-add-content { content: "\f19a"; } +.glyphicon-font-content { content: "\f19b"; } +.glyphicon-forward-content { content: "\f19c"; } +.glyphicon-geometry-collection-content { content: "\f19d"; } +.glyphicon-geoserver-content { content: "\f19e"; } +.glyphicon-geostory-content { content: "\f19f"; } +.glyphicon-globe-content { content: "\f1a0"; } +.glyphicon-grab-handle-content { content: "\f1a1"; } +.glyphicon-gray-scale-content { content: "\f1a2"; } +.glyphicon-grid-custom-content { content: "\f1a3"; } +.glyphicon-grid-regular-content { content: "\f1a4"; } +.glyphicon-hand-down-content { content: "\f1a5"; } +.glyphicon-hand-left-content { content: "\f1a6"; } +.glyphicon-hand-right-content { content: "\f1a7"; } +.glyphicon-hand-up-content { content: "\f1a8"; } +.glyphicon-hdd-content { content: "\f1a9"; } +.glyphicon-heart-content { content: "\f1aa"; } +.glyphicon-height-auto-content { content: "\f1ab"; } +.glyphicon-height-from-terrain-content { content: "\f1ac"; } +.glyphicon-height-view-content { content: "\f1ad"; } +.glyphicon-hide-marker-content { content: "\f1ae"; } +.glyphicon-home-content { content: "\f1af"; } +.glyphicon-hourglass-content { content: "\f1b0"; } +.glyphicon-import-content { content: "\f1b1"; } +.glyphicon-inbox-content { content: "\f1b2"; } +.glyphicon-info-sign-content { content: "\f1b3"; } +.glyphicon-italic-content { content: "\f1b4"; } +.glyphicon-layer-info-content { content: "\f1b5"; } +.glyphicon-leaf-content { content: "\f1b6"; } +.glyphicon-level-up-content { content: "\f1b7"; } +.glyphicon-line-dash-content { content: "\f1b8"; } +.glyphicon-line-minus-content { content: "\f1b9"; } +.glyphicon-line-plus-content { content: "\f1ba"; } +.glyphicon-line-remove-content { content: "\f1bb"; } +.glyphicon-line-trash-content { content: "\f1bc"; } +.glyphicon-line-content { content: "\f1bd"; } +.glyphicon-link-content { content: "\f1be"; } +.glyphicon-list-alt-content { content: "\f1bf"; } +.glyphicon-list-content { content: "\f1c0"; } +.glyphicon-lock-content { content: "\f1c1"; } +.glyphicon-log-in-content { content: "\f1c2"; } +.glyphicon-log-out-content { content: "\f1c3"; } +.glyphicon-loop-content { content: "\f1c4"; } +.glyphicon-magnet-content { content: "\f1c5"; } +.glyphicon-map-context-content { content: "\f1c6"; } +.glyphicon-map-edit-content { content: "\f1c7"; } +.glyphicon-map-filter-content { content: "\f1c8"; } +.glyphicon-map-marker-content { content: "\f1c9"; } +.glyphicon-map-synch-content { content: "\f1ca"; } +.glyphicon-map-view-content { content: "\f1cb"; } +.glyphicon-maps-catalog-content { content: "\f1cc"; } +.glyphicon-menu-hamburger-content { content: "\f1cd"; } +.glyphicon-minus-sign-content { content: "\f1ce"; } +.glyphicon-minus-content { content: "\f1cf"; } +.glyphicon-model-plus-content { content: "\f1d0"; } +.glyphicon-model-content { content: "\f1d1"; } +.glyphicon-mouse-content { content: "\f1d2"; } +.glyphicon-move-row-after-content { content: "\f1d3"; } +.glyphicon-move-row-before-content { content: "\f1d4"; } +.glyphicon-move-content { content: "\f1d5"; } +.glyphicon-muted-content { content: "\f1d6"; } +.glyphicon-new-window-content { content: "\f1d7"; } +.glyphicon-next-content { content: "\f1d8"; } +.glyphicon-off-content { content: "\f1d9"; } +.glyphicon-ok-circle-content { content: "\f1da"; } +.glyphicon-ok-sign-content { content: "\f1db"; } +.glyphicon-ok-content { content: "\f1dc"; } +.glyphicon-open-content { content: "\f1dd"; } +.glyphicon-option-horizontal-content { content: "\f1de"; } +.glyphicon-option-vertical-content { content: "\f1df"; } +.glyphicon-paperclip-content { content: "\f1e0"; } +.glyphicon-paste-content { content: "\f1e1"; } +.glyphicon-pause-content { content: "\f1e2"; } +.glyphicon-pencil-add-content { content: "\f1e3"; } +.glyphicon-pencil-edit-content { content: "\f1e4"; } +.glyphicon-pencil-content { content: "\f1e5"; } +.glyphicon-phone-content { content: "\f1e6"; } +.glyphicon-picture-content { content: "\f1e7"; } +.glyphicon-pie-chart-content { content: "\f1e8"; } +.glyphicon-plane-content { content: "\f1e9"; } +.glyphicon-play-circle-content { content: "\f1ea"; } +.glyphicon-play-content { content: "\f1eb"; } +.glyphicon-playback-content { content: "\f1ec"; } +.glyphicon-plug-content { content: "\f1ed"; } +.glyphicon-plus-sign-content { content: "\f1ee"; } +.glyphicon-plus-square-content { content: "\f1ef"; } +.glyphicon-plus-content { content: "\f1f0"; } +.glyphicon-point-coordinates-content { content: "\f1f1"; } +.glyphicon-point-dash-content { content: "\f1f2"; } +.glyphicon-point-minus-content { content: "\f1f3"; } +.glyphicon-point-plus-content { content: "\f1f4"; } +.glyphicon-point-remove-content { content: "\f1f5"; } +.glyphicon-point-trash-content { content: "\f1f6"; } +.glyphicon-point-content { content: "\f1f7"; } +.glyphicon-polygon-3d-content { content: "\f1f8"; } +.glyphicon-polygon-dash-content { content: "\f1f9"; } +.glyphicon-polygon-minus-content { content: "\f1fa"; } +.glyphicon-polygon-plus-content { content: "\f1fb"; } +.glyphicon-polygon-remove-content { content: "\f1fc"; } +.glyphicon-polygon-trash-content { content: "\f1fd"; } +.glyphicon-polygon-content { content: "\f1fe"; } +.glyphicon-polyline-3d-content { content: "\f1ff"; } +.glyphicon-polyline-dash-content { content: "\f200"; } +.glyphicon-polyline-minus-content { content: "\f201"; } +.glyphicon-polyline-plus-content { content: "\f202"; } +.glyphicon-polyline-remove-content { content: "\f203"; } +.glyphicon-polyline-trash-content { content: "\f204"; } +.glyphicon-polyline-content { content: "\f205"; } +.glyphicon-preview-content { content: "\f206"; } +.glyphicon-print-content { content: "\f207"; } +.glyphicon-pushpin-content { content: "\f208"; } +.glyphicon-qrcode-content { content: "\f209"; } +.glyphicon-question-sign-content { content: "\f20a"; } +.glyphicon-random-content { content: "\f20b"; } +.glyphicon-range-end-content { content: "\f20c"; } +.glyphicon-range-start-content { content: "\f20d"; } +.glyphicon-record-content { content: "\f20e"; } +.glyphicon-redo-content { content: "\f20f"; } +.glyphicon-refresh-content { content: "\f210"; } +.glyphicon-remove-circle-content { content: "\f211"; } +.glyphicon-remove-sign-content { content: "\f212"; } +.glyphicon-remove-square-content { content: "\f213"; } +.glyphicon-remove-content { content: "\f214"; } +.glyphicon-repeat-content { content: "\f215"; } +.glyphicon-resize-full-content { content: "\f216"; } +.glyphicon-resize-horizontal-content { content: "\f217"; } +.glyphicon-resize-small-content { content: "\f218"; } +.glyphicon-resize-vertical-content { content: "\f219"; } +.glyphicon-retweet-content { content: "\f21a"; } +.glyphicon-rgb-content { content: "\f21b"; } +.glyphicon-road-content { content: "\f21c"; } +.glyphicon-row-add-content { content: "\f21d"; } +.glyphicon-row-trash-content { content: "\f21e"; } +.glyphicon-save-content { content: "\f21f"; } +.glyphicon-saved-content { content: "\f220"; } +.glyphicon-scissors-content { content: "\f221"; } +.glyphicon-screenshot-content { content: "\f222"; } +.glyphicon-search-coords-content { content: "\f223"; } +.glyphicon-search-content { content: "\f224"; } +.glyphicon-send-content { content: "\f225"; } +.glyphicon-share-alt-content { content: "\f226"; } +.glyphicon-share-content { content: "\f227"; } +.glyphicon-sheet-content { content: "\f228"; } +.glyphicon-shopping-cart-content { content: "\f229"; } +.glyphicon-signal-content { content: "\f22a"; } +.glyphicon-size-extra-large-content { content: "\f22b"; } +.glyphicon-size-large-content { content: "\f22c"; } +.glyphicon-size-medium-content { content: "\f22d"; } +.glyphicon-size-small-content { content: "\f22e"; } +.glyphicon-slope-content { content: "\f22f"; } +.glyphicon-sort-by-alphabet-alt-content { content: "\f230"; } +.glyphicon-sort-by-alphabet-content { content: "\f231"; } +.glyphicon-sort-by-attributes-alt-content { content: "\f232"; } +.glyphicon-sort-by-attributes-content { content: "\f233"; } +.glyphicon-sort-content { content: "\f234"; } +.glyphicon-star-empty-content { content: "\f235"; } +.glyphicon-star-content { content: "\f236"; } +.glyphicon-stats-content { content: "\f237"; } +.glyphicon-step-backward-content { content: "\f238"; } +.glyphicon-step-forward-content { content: "\f239"; } +.glyphicon-stop-content { content: "\f23a"; } +.glyphicon-story-banner-section-content { content: "\f23b"; } +.glyphicon-story-carousel-section-content { content: "\f23c"; } +.glyphicon-story-immersive-content-content { content: "\f23d"; } +.glyphicon-story-immersive-section-content { content: "\f23e"; } +.glyphicon-story-media-section-content { content: "\f23f"; } +.glyphicon-story-paragraph-section-content { content: "\f240"; } +.glyphicon-story-title-section-content { content: "\f241"; } +.glyphicon-story-webpage-section-content { content: "\f242"; } +.glyphicon-tag-content { content: "\f243"; } +.glyphicon-tags-content { content: "\f244"; } +.glyphicon-tasks-content { content: "\f245"; } +.glyphicon-text-background-content { content: "\f246"; } +.glyphicon-text-colour-content { content: "\f247"; } +.glyphicon-text-height-content { content: "\f248"; } +.glyphicon-text-width-content { content: "\f249"; } +.glyphicon-th-large-content { content: "\f24a"; } +.glyphicon-th-list-content { content: "\f24b"; } +.glyphicon-th-content { content: "\f24c"; } +.glyphicon-thumbs-down-content { content: "\f24d"; } +.glyphicon-thumbs-up-content { content: "\f24e"; } +.glyphicon-time-current-content { content: "\f24f"; } +.glyphicon-time-offset-content { content: "\f250"; } +.glyphicon-time-content { content: "\f251"; } +.glyphicon-tint-content { content: "\f252"; } +.glyphicon-transfer-content { content: "\f253"; } +.glyphicon-trash-square-content { content: "\f254"; } +.glyphicon-trash-content { content: "\f255"; } +.glyphicon-unchecked-content { content: "\f256"; } +.glyphicon-undo-content { content: "\f257"; } +.glyphicon-unplug-content { content: "\f258"; } +.glyphicon-upload-content { content: "\f259"; } +.glyphicon-usd-content { content: "\f25a"; } +.glyphicon-user-content { content: "\f25b"; } +.glyphicon-vert-dashed-content { content: "\f25c"; } +.glyphicon-viewport-filter-content { content: "\f25d"; } +.glyphicon-warning-sign-content { content: "\f25e"; } +.glyphicon-webpage-content { content: "\f25f"; } +.glyphicon-wrench-content { content: "\f260"; } +.glyphicon-zoom-in-content { content: "\f261"; } +.glyphicon-zoom-out-content { content: "\f262"; } +.glyphicon-zoom-to-content { content: "\f263"; } diff --git a/web/client/themes/default/icons/icons.eot b/web/client/themes/default/icons/icons.eot index 5b0b0b46e4dfedf9e74757e42b2f993b98037c71..70e7db02604adbedf9debcc76ad007ac13195fea 100755 GIT binary patch delta 9839 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 delta 9488 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 QG??z3Gw-i5Lt~Bn52n$(y8r+H diff --git a/web/client/themes/default/icons/icons.svg b/web/client/themes/default/icons/icons.svg index db8b56e719..e3fc09ea8f 100755 --- a/web/client/themes/default/icons/icons.svg +++ b/web/client/themes/default/icons/icons.svg @@ -337,1790 +337,1802 @@ <glyph glyph-name="3d-1" unicode="3d" horiz-adv-x="1200" d=" M233 848Q334 848 396 783Q447 730 447 663Q447 568 343 512Q405 498 442 452T479 341Q479 246 409.5 179T237 112Q139 112 75 168Q10 225 0 315L134 332Q140 281 168 253.5T236 226Q279 226 308 259Q337 291 337 346Q337 399 309 429.5T241 460Q214 460 178 449L193 562Q249 560 278 586Q308 612 308 655Q308 691 286.5 713T229 735T168 710T138 638L10 660Q24 725 50 764Q77 803 125 825Q173 848 233 848zM596 845H862Q952 845 999 831Q1062 813 1107.5 765T1176 648Q1200 579 1200 478Q1200 389 1178 324Q1151 246 1101 197Q1063 160 998 139Q950 124 870 124H596V845zM741 723V246H850Q911 246 938 253Q973 261 996 283Q1020 304 1035 352Q1050 401 1050 484.5T1035 612.5T993.5 682T926 716Q896 723 807 723H741z" /> - <glyph glyph-name="add-dashboard" + <glyph glyph-name="add-comment" unicode="" + horiz-adv-x="1200" d=" M950 1080C938.66667 1080 928.83333 1076 920.5 1068C912.16667 1060 908 1050.66667 908 1040L908 870L741 870C729.66667 870 720 866.3333299999999 712 859C704 851.6666700000001 700 842.1666700000001 700 830.5C700 818.8333299999999 704 809 712 801C720 793 729.66667 789 741 789L908 789L908 620C908 608.66667 912.16667 599.16667 920.5 591.5C928.83333 583.83333 938.66667 580 950 580C961.33333 580 971 583.83333 979 591.5C987 599.16667 991 608.66667 991 620L991 789L1160 789C1170.6667 789 1180 793 1188 801C1196 809 1200 818.8333299999999 1200 830.5C1200 842.1666700000001 1196 851.6666700000001 1188 859C1180 866.3333299999999 1170.6667 870 1160 870L991 870L991 1040C991 1050.66667 987 1060 979 1068C971 1076 961.33333 1080 950 1080zM78.853516 634C57.324992 634 38.79986 626.98927 23.279297 612.9707C7.7587341 598.95213 0 581.43021 0 560.40234L0 187.9082C0 166.8803 7.7587341 148.7312 23.279297 133.4609000000001C38.79986 118.1908000000001 57.324992 110.5565999999999 78.853516 110.5565999999999L156.20703 110.5565999999999L156.20703 -120L359.72656 110.5565999999999L849.375 110.5565999999999C871.40419 110.5565999999999 889.92932 118.1908000000001 904.94922 133.4609000000001C919.96912 148.7312 927.47852 166.8803 927.47852 187.9082L927.47852 478.04102C923.89748 478.59716 920.30699 479.10745 916.77734 479.9296900000001C889.20345 486.29394 863.504 500.74528 843.96094 521.24023C824.41007 541.53619 810.70745 567.24858 804.10742 594.60547C804.10102 607.73698 804.09444 620.86849 804.08789 634L78.853516 634z" /> + <glyph glyph-name="add-comment-1" + unicode="add-comment" + horiz-adv-x="1200" d=" M950 1080C938.66667 1080 928.83333 1076 920.5 1068C912.16667 1060 908 1050.66667 908 1040L908 870L741 870C729.66667 870 720 866.3333299999999 712 859C704 851.6666700000001 700 842.1666700000001 700 830.5C700 818.8333299999999 704 809 712 801C720 793 729.66667 789 741 789L908 789L908 620C908 608.66667 912.16667 599.16667 920.5 591.5C928.83333 583.83333 938.66667 580 950 580C961.33333 580 971 583.83333 979 591.5C987 599.16667 991 608.66667 991 620L991 789L1160 789C1170.6667 789 1180 793 1188 801C1196 809 1200 818.8333299999999 1200 830.5C1200 842.1666700000001 1196 851.6666700000001 1188 859C1180 866.3333299999999 1170.6667 870 1160 870L991 870L991 1040C991 1050.66667 987 1060 979 1068C971 1076 961.33333 1080 950 1080zM78.853516 634C57.324992 634 38.79986 626.98927 23.279297 612.9707C7.7587341 598.95213 0 581.43021 0 560.40234L0 187.9082C0 166.8803 7.7587341 148.7312 23.279297 133.4609000000001C38.79986 118.1908000000001 57.324992 110.5565999999999 78.853516 110.5565999999999L156.20703 110.5565999999999L156.20703 -120L359.72656 110.5565999999999L849.375 110.5565999999999C871.40419 110.5565999999999 889.92932 118.1908000000001 904.94922 133.4609000000001C919.96912 148.7312 927.47852 166.8803 927.47852 187.9082L927.47852 478.04102C923.89748 478.59716 920.30699 479.10745 916.77734 479.9296900000001C889.20345 486.29394 863.504 500.74528 843.96094 521.24023C824.41007 541.53619 810.70745 567.24858 804.10742 594.60547C804.10102 607.73698 804.09444 620.86849 804.08789 634L78.853516 634z" /> + <glyph glyph-name="add-dashboard" + unicode="" horiz-adv-x="1200" d=" M950 1080Q967 1080 979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080zM401 680Q565 680 683 562T801 280Q801 185 756 102Q708 1 612.5 -59.5T401.5 -120T190 -59.5T46 102Q0 185 0 280Q0 444 118.5 562T401 680zM400.5 627Q258 627 156 525T54 280Q54 187 102 102H699Q747 187 747 280Q747 423 645 525T400.5 627zM313 575Q347 575 347 539.5T313 504Q299 504 288.5 514T278 539Q278 553 288.5 564T313 575zM487 575Q523 575 523 539Q523 524 512.5 514T487 504Q473 504 462.5 514T452 539Q452 553 462.5 564T487 575zM582 533L513 343L452 164Q452 160 447 150Q438 132 417 125T378 126Q359 138 352 159.5T354 199Q354 201 356.5 203T361 207L467 365zM177 467Q191 467 201 456.5T211 430Q211 416 201 405.5T177 395Q160 395 150.5 405.5T141 430Q141 467 177 467zM627 467Q641 467 651 456.5T661 432Q661 398 626 398T591 432.5T627 467zM666 319Q684 319 693.5 309T703 284Q703 250 666 250Q631 250 631 284Q631 299 642 309T666 319zM131 314Q164 314 164 279.5T131 245Q117 245 106 255.5T95 280T106 304T131 314z" /> <glyph glyph-name="add-dashboard-1" unicode="add-dashboard" horiz-adv-x="1200" d=" M950 1080Q967 1080 979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080zM401 680Q565 680 683 562T801 280Q801 185 756 102Q708 1 612.5 -59.5T401.5 -120T190 -59.5T46 102Q0 185 0 280Q0 444 118.5 562T401 680zM400.5 627Q258 627 156 525T54 280Q54 187 102 102H699Q747 187 747 280Q747 423 645 525T400.5 627zM313 575Q347 575 347 539.5T313 504Q299 504 288.5 514T278 539Q278 553 288.5 564T313 575zM487 575Q523 575 523 539Q523 524 512.5 514T487 504Q473 504 462.5 514T452 539Q452 553 462.5 564T487 575zM582 533L513 343L452 164Q452 160 447 150Q438 132 417 125T378 126Q359 138 352 159.5T354 199Q354 201 356.5 203T361 207L467 365zM177 467Q191 467 201 456.5T211 430Q211 416 201 405.5T177 395Q160 395 150.5 405.5T141 430Q141 467 177 467zM627 467Q641 467 651 456.5T661 432Q661 398 626 398T591 432.5T627 467zM666 319Q684 319 693.5 309T703 284Q703 250 666 250Q631 250 631 284Q631 299 642 309T666 319zM131 314Q164 314 164 279.5T131 245Q117 245 106 255.5T95 280T106 304T131 314z" /> <glyph glyph-name="add-folder" - unicode="" + unicode="" horiz-adv-x="1200" d=" M950 1080Q967 1080 979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080zM36 634H42H292Q325 634 335 606Q337 600 337 593.5T338 581T340 570T344 560Q355 542 378 542Q381 540 383.5 539.5T387 539H897Q910 539 919.5 535.5T936 520Q938 516 940 511.5T942 500Q944 489 943 479T942 460V455H228Q198 455 176.5 436.5T151 391L0 30V595Q0 610 9.5 620.5T36 634zM254 350H958H1100L901 -117L899 -120H55L253 348z" /> <glyph glyph-name="add-folder-1" unicode="add-folder" horiz-adv-x="1200" d=" M950 1080Q967 1080 979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080zM36 634H42H292Q325 634 335 606Q337 600 337 593.5T338 581T340 570T344 560Q355 542 378 542Q381 540 383.5 539.5T387 539H897Q910 539 919.5 535.5T936 520Q938 516 940 511.5T942 500Q944 489 943 479T942 460V455H228Q198 455 176.5 436.5T151 391L0 30V595Q0 610 9.5 620.5T36 634zM254 350H958H1100L901 -117L899 -120H55L253 348z" /> <glyph glyph-name="add-geostory" - unicode="" + unicode="" horiz-adv-x="1200" d=" M950 1080C938.66667 1080 928.83333 1076 920.5 1068C912.16667 1060 908 1050.6667 908 1040L908 870L741 870C729.66667 870 720 866.3333299999999 712 859C704 851.6666700000001 700 842.1666700000001 700 830.5C700 818.8333299999999 704 809 712 801C720 793 729.66667 789 741 789L908 789L908 620C908 608.66667 912.16667 599.16667 920.5 591.5C928.83333 583.83333 938.66667 580 950 580C961.33333 580 971 583.83333 979 591.5C987 599.16667 991 608.66667 991 620L991 789L1160 789C1170.6667 789 1180 793 1188 801C1196 809 1200 818.8333299999999 1200 830.5C1200 842.1666700000001 1196 851.6666700000001 1188 859C1180 866.3333299999999 1170.6667 870 1160 870L991 870L991 1040C991 1050.6667 987 1060 979 1068C971 1076 961.33333 1080 950 1080zM218.92969 680C183.11709 680 160.13275 673.86226 134.21875 656.85938C109.53805 635.00342 97.845253 613.31535 96.564453 582.14844C96.056753 586.03388 95.789063 589.73211 95.789062 593.22266L95.789062 554.35352L95.789062 -32.3965000000001L100.74805 -55.5371C102.40095 -67.6584 113.55755 -81.4323999999999 134.21875 -96.8594C154.87995 -112.2864 183.11699 -120 218.92969 -120L693.21094 -120L693.21094 467.57617L693.21094 505.5918L693.21094 506.44727L673.7207 506.44727L673.7207 641.98242L693.21094 641.98242L693.21094 680L673.7207 680L650.8418 680L218.92969 680zM650.8418 641.98242L650.8418 506.44727L218.92969 506.44727C207.25959 506.44727 196.39909 507.27003 186.33789 508.9082C174.09159 511.88954 162.38028 516.79342 151.95898 524.16211C136.50128 532.33418 126.84932 568.93628 135.04492 594.60742C151.22722 632.37127 168.48082 639.44632 211.79492 641.97656L650.8418 641.98242zM138.76367 478.17578C151.71957 472.61352 165.35747 468.65572 179.26367 466.3418C336.19142 460.49084 493.24948 464.58793 650.23633 463.61914L650.23633 -77.0311999999999C513.14366 -77.171 376.0512 -76.6422 238.95898 -77.1699000000001C212.54188 -78.2137 183.95538 -77.7329999999999 161.01758 -63.1113C148.08238 -56.7487000000001 139.15217 -43.2428 138.76367 -28.7754L138.76367 478.17578zM217.11719 404.11914L217.11719 363.1484400000001L588.22656 363.1484400000001L588.22656 404.11914L217.11719 404.11914zM217.11719 330.3046900000001L217.11719 289.33398L500.56836 289.33398L500.56836 330.3046900000001L217.11719 330.3046900000001zM394.5 246.7207C374.8042 246.7207 355.87275 242.81431 337.70508 235.00391C319.7071900000001 227.1935 304.12951 216.70766 290.9707 203.54883C277.8118 190.39 267.3260200000001 174.7702999999999 259.51562 156.6875C251.70522 138.6047000000001 247.80078 119.7153000000001 247.80078 100.0195000000001C247.80078 80.3236999999999 251.70522 61.4344000000001 259.51562 43.3516C267.3260200000001 25.2688000000001 277.8118 9.6489999999999 290.9707 -3.5098C304.12951 -16.6686 319.74924 -27.1543999999999 337.83203 -34.9648C355.91481 -42.7753 374.8042 -46.6796999999999 394.5 -46.6796999999999C414.1958 -46.6796999999999 433.08519 -42.7753 451.16797 -34.9648C469.25076 -27.1543999999999 484.87047 -16.6686 498.0293 -3.5098C511.18813 9.6489999999999 521.67398 25.2688000000001 529.48438 43.3516C537.29477 61.4344000000001 541.19922 80.3236999999999 541.19922 100.0195000000001C541.19922 119.7153000000001 537.29477 138.6047000000001 529.48438 156.6875C521.67398 174.7702999999999 511.18813 190.39 498.0293 203.54883C484.87047 216.70766 469.25076 227.1935 451.16797 235.00391C433.08519 242.81431 414.1958 246.7207 394.5 246.7207zM401.37695 227.61914C404.60299 226.93998 407.74259 226.93998 410.79883 227.61914C413.00612 225.7514300000001 416.48804 224.05351 421.24219 222.52539C425.99635 220.99726 430.24115 219.7238200000001 433.97656 218.70508C437.71198 217.68632 440.8095 215.64804 443.27148 212.5918C445.73346 209.53555 446.54232 205.63111 445.69336 200.87695L442.63477 199.6035000000001C440.76707 198.9243 437.49935 198.7121 432.83008 198.9668C428.16082 199.2215 423.19517 200.45092 417.93164 202.6582C418.44101 202.4884100000001 418.82149 202.10794 419.07617 201.5136700000001C419.33087 200.9194 419.41692 200.11054 419.33203 199.0918C419.2471300000001 198.073 419.12097 197.184 418.95117 196.4199C418.78138 195.6559 418.52513 194.6788 418.18555 193.4902C417.84597 192.3017 417.67773 191.621 417.67773 191.4512C419.54544 190.4324 423.23764 188.4822 428.75586 185.5957C434.2740800000001 182.7092 438.43477 180.4147000000001 441.23633 178.7168C444.03789 177.0189 447.22149 174.5160000000001 450.78711 171.2050999999999C454.35273 167.8941 456.98373 164.2861 458.68164 160.3809000000001C457.15352 158.5132000000001 455.41158 157.1957 453.45898 156.4315999999999C451.50638 155.6676 449.8084600000001 155.2871 448.36523 155.2871C446.9220000000001 155.2871 444.84362 155.4151999999999 442.12695 155.6699000000001C439.41029 155.9246000000001 437.37201 156.0508 436.01367 156.0508C433.29701 152.9945 432.44805 149.9371000000001 433.4668 146.8809000000001C429.73139 145.1829 426.84413 143.2747 424.80664 141.1523C422.76914 139.0299 421.4556 137.1198 420.86133 135.4219000000001C420.26706 133.7239999999999 419.58633 131.0909999999999 418.82227 127.5254C418.05821 123.9598000000001 417.16719 120.9884 416.14844 118.6113C415.4692800000001 116.404 414.15377 114.3255999999999 412.20117 112.3730000000001C410.24857 110.4204 408.71887 108.5102999999999 407.61523 106.6425999999999C406.51158 104.7748999999999 406.21524 102.3121000000001 406.72461 99.2559000000001C407.23399 96.5391999999999 407.278 93.8221000000001 406.85352 91.1054999999999C406.42904 88.3888 405.7483 85.4594999999999 404.81445 82.3184000000001C403.8806 79.1772000000001 403.24389 76.5882999999999 402.9043 74.5508L401.63086 75.3145C400.6121 75.9936 399.29661 76.8866000000001 397.68359 77.9902C396.07057 79.0938000000001 394.37265 80.3672999999999 392.58984 81.8105000000001C390.80703 83.2538 388.98294 84.9937 387.11523 87.0311999999999C385.24752 89.0687 383.71784 91.1051 382.5293 93.1425999999999C381.51055 94.8405 379.8566400000001 95.9878000000001 377.56445 96.5820000000001C375.27227 97.1763000000001 372.42707 97.5147 369.03125 97.5996C365.63541 97.6845000000001 363.42694 97.8126 362.4082 97.9824000000001C359.69154 96.9637 357.8253900000001 95.0954999999999 356.80664 92.3788999999999C354.93894 87.2852 355.61772 82.3616 358.84375 77.6074000000001C362.06979 72.6833999999999 365.63581 72.3431000000001 369.54102 76.5879C372.59726 79.9838 375.22826 81.7678000000001 377.43555 81.9375C379.64283 82.1072999999999 381.21262 81.1302000000001 382.14648 79.0078000000001C383.08033 76.8853999999999 383.67695 74.5087000000001 383.93164 71.877C384.18633 69.2452000000001 384.22642 66.6561999999999 384.05664 64.1094000000001C384.7358 63.7698 386.81811 63.2172000000001 390.29883 62.4531C393.77955 61.6891000000001 396.02812 60.2034000000001 397.04688 57.9961000000001C397.04688 57.8263999999999 397.00481 55.6618000000001 396.91992 51.502C396.83502 47.3420000000001 397.13138 45.1776 397.81055 45.0078000000001C400.35742 41.1025999999999 405.95978 42.1216999999999 414.61914 48.0645C417.3358 49.9322 420.56342 51.3317999999999 424.29883 52.2656C428.03425 53.1994999999999 431.5983100000001 53.7520999999999 434.99414 53.9219000000001C438.38996 54.0916999999999 442.04207 54.2177999999999 445.94727 54.3027C449.85247 54.3876 453.33243 54.4315999999999 456.38867 54.4315999999999C459.27513 52.5639000000001 463.64806 50.9501 469.50586 49.5917999999999C475.36367 48.2335000000001 479.56447 46.9601 482.11133 45.7715000000001C484.14883 44.5830000000001 487.20625 43.9463000000001 491.28125 43.8613C495.35623 43.7764999999999 498.49779 43.0555999999999 500.70508 41.6973C500.19571 36.2638999999999 498.41172 30.9139 495.35547 25.6504C492.29923 20.3869 489.36992 16.2281 486.56836 13.1719000000001C483.7668 10.1156000000001 479.82031 6.1251 474.72656 1.2012C454.86097 -18.155 436.09775 -27.6638 418.43945 -27.3242C417.59049 -25.2867000000001 417.16602 -23.8431 417.16602 -22.9940999999999C417.16602 -22.1451999999999 417.46431 -20.9558999999999 418.05859 -19.4277C418.65286 -17.8996 418.95117 -16.5419999999999 418.95117 -15.3534999999999C415.72514 -14.6744000000001 412.62565 -13.1466 409.6543 -10.7695000000001C406.68295 -8.3924999999999 404.3483100000001 -6.0578 402.65039 -3.7655999999999C400.95248 -1.4735000000001 398.99831 1.4558999999999 396.79102 5.0215000000001C396.28165 7.9079999999999 397.0905 11.1335999999999 399.21289 14.6992C401.33529 18.2648999999999 403.24545 21.6606999999999 404.94336 24.8867C406.64128 28.1126999999999 406.89362 31 405.70508 33.5469000000001C400.78113 32.8677 395.89961 33.8008 391.06055 36.3477C386.2215 38.8945000000001 381.12773 42.1202000000001 375.7793 46.0254C370.4308700000001 49.9305999999999 365.97382 52.6477 362.4082 54.1758C360.54049 54.8549 357.61315 55.8741 353.62305 57.2324000000001C349.63295 58.5907 346.19309 59.8642 343.30664 61.0527C340.42018 62.2412999999999 337.6209600000001 63.5147 334.9043 64.8730000000001C333.71576 65.5522000000001 332.05795 66.7415000000001 329.93555 68.4395C327.81316 70.1374000000001 325.81888 71.4108000000001 323.95117 72.2598C322.08347 73.1087 320.13125 73.5332000000001 318.09375 73.5332000000001C318.26354 77.6081999999999 316.90598 82.6578999999999 314.01953 88.6855000000001C311.13307 94.7130999999999 309.68945 98.4914000000001 309.68945 100.0195000000001C310.7082 104.7737 310.02942 112.1600000000001 307.65234 122.1777C305.27526 132.1954000000001 304.85078 140.0904000000001 306.37891 145.8633C307.22786 149.5987 309.73269 156.3043 313.89258 165.9824000000001C318.0524700000001 175.6605 320.3871 183.3873 320.89648 189.1602C321.06627 190.3487 320.34349 191.9204 318.7304700000001 193.8730000000001C317.11745 195.8256 316.5667900000001 197.7358000000001 317.07617 199.6035000000001C317.58555 202.1503800000001 320.51291 205.07774 325.86133 208.3886700000001C331.20977 211.6996 335.58269 213.95013 338.97852 215.1386700000001C341.52539 215.98762 345.38778 216.15586 350.56641 215.64648C355.74505 215.13711 359.60743 215.13711 362.1543 215.64648C363.85221 215.9860700000001 367.1639400000001 216.5386600000001 372.08789 217.30273C377.01185 218.06679 380.6619800000001 218.74753 383.03906 219.3418C385.41614 219.93607 388.42957 220.95326 392.08008 222.39648C395.7306 223.83971 398.83009 225.58164 401.37695 227.61914zM397.81055 200.36523C396.45222 199.6861 395.05064 198.6249 393.60742 197.1816C392.16419 195.7384 391.01887 194.509 390.16992 193.4902C389.32096 192.4715 388.13164 191.9629 386.60352 191.9629C385.0753900000001 191.9629 383.46353 192.8119 381.76562 194.5098000000001C381.25624 193.3212 379.89673 191.1548 377.68945 188.0137C375.48216 184.8725 374.1246 182.3697 373.61523 180.502C376.33189 178.6343000000001 379.47345 177.2327 383.03906 176.2988C386.60468 175.365 391.06173 174.5160000000001 396.41016 173.752C401.75858 172.9879000000001 405.11236 172.5193999999999 406.4707 172.3496C406.4707 172.8589999999999 405.70585 174.8132000000001 404.17773 178.209C402.64961 181.6048 401.20795 185.4251000000001 399.84961 189.6699C398.49128 193.9147000000001 397.81055 197.4788 397.81055 200.36523z" /> <glyph glyph-name="add-geostory-1" unicode="add-geostory" horiz-adv-x="1200" d=" M950 1080C938.66667 1080 928.83333 1076 920.5 1068C912.16667 1060 908 1050.6667 908 1040L908 870L741 870C729.66667 870 720 866.3333299999999 712 859C704 851.6666700000001 700 842.1666700000001 700 830.5C700 818.8333299999999 704 809 712 801C720 793 729.66667 789 741 789L908 789L908 620C908 608.66667 912.16667 599.16667 920.5 591.5C928.83333 583.83333 938.66667 580 950 580C961.33333 580 971 583.83333 979 591.5C987 599.16667 991 608.66667 991 620L991 789L1160 789C1170.6667 789 1180 793 1188 801C1196 809 1200 818.8333299999999 1200 830.5C1200 842.1666700000001 1196 851.6666700000001 1188 859C1180 866.3333299999999 1170.6667 870 1160 870L991 870L991 1040C991 1050.6667 987 1060 979 1068C971 1076 961.33333 1080 950 1080zM218.92969 680C183.11709 680 160.13275 673.86226 134.21875 656.85938C109.53805 635.00342 97.845253 613.31535 96.564453 582.14844C96.056753 586.03388 95.789063 589.73211 95.789062 593.22266L95.789062 554.35352L95.789062 -32.3965000000001L100.74805 -55.5371C102.40095 -67.6584 113.55755 -81.4323999999999 134.21875 -96.8594C154.87995 -112.2864 183.11699 -120 218.92969 -120L693.21094 -120L693.21094 467.57617L693.21094 505.5918L693.21094 506.44727L673.7207 506.44727L673.7207 641.98242L693.21094 641.98242L693.21094 680L673.7207 680L650.8418 680L218.92969 680zM650.8418 641.98242L650.8418 506.44727L218.92969 506.44727C207.25959 506.44727 196.39909 507.27003 186.33789 508.9082C174.09159 511.88954 162.38028 516.79342 151.95898 524.16211C136.50128 532.33418 126.84932 568.93628 135.04492 594.60742C151.22722 632.37127 168.48082 639.44632 211.79492 641.97656L650.8418 641.98242zM138.76367 478.17578C151.71957 472.61352 165.35747 468.65572 179.26367 466.3418C336.19142 460.49084 493.24948 464.58793 650.23633 463.61914L650.23633 -77.0311999999999C513.14366 -77.171 376.0512 -76.6422 238.95898 -77.1699000000001C212.54188 -78.2137 183.95538 -77.7329999999999 161.01758 -63.1113C148.08238 -56.7487000000001 139.15217 -43.2428 138.76367 -28.7754L138.76367 478.17578zM217.11719 404.11914L217.11719 363.1484400000001L588.22656 363.1484400000001L588.22656 404.11914L217.11719 404.11914zM217.11719 330.3046900000001L217.11719 289.33398L500.56836 289.33398L500.56836 330.3046900000001L217.11719 330.3046900000001zM394.5 246.7207C374.8042 246.7207 355.87275 242.81431 337.70508 235.00391C319.7071900000001 227.1935 304.12951 216.70766 290.9707 203.54883C277.8118 190.39 267.3260200000001 174.7702999999999 259.51562 156.6875C251.70522 138.6047000000001 247.80078 119.7153000000001 247.80078 100.0195000000001C247.80078 80.3236999999999 251.70522 61.4344000000001 259.51562 43.3516C267.3260200000001 25.2688000000001 277.8118 9.6489999999999 290.9707 -3.5098C304.12951 -16.6686 319.74924 -27.1543999999999 337.83203 -34.9648C355.91481 -42.7753 374.8042 -46.6796999999999 394.5 -46.6796999999999C414.1958 -46.6796999999999 433.08519 -42.7753 451.16797 -34.9648C469.25076 -27.1543999999999 484.87047 -16.6686 498.0293 -3.5098C511.18813 9.6489999999999 521.67398 25.2688000000001 529.48438 43.3516C537.29477 61.4344000000001 541.19922 80.3236999999999 541.19922 100.0195000000001C541.19922 119.7153000000001 537.29477 138.6047000000001 529.48438 156.6875C521.67398 174.7702999999999 511.18813 190.39 498.0293 203.54883C484.87047 216.70766 469.25076 227.1935 451.16797 235.00391C433.08519 242.81431 414.1958 246.7207 394.5 246.7207zM401.37695 227.61914C404.60299 226.93998 407.74259 226.93998 410.79883 227.61914C413.00612 225.7514300000001 416.48804 224.05351 421.24219 222.52539C425.99635 220.99726 430.24115 219.7238200000001 433.97656 218.70508C437.71198 217.68632 440.8095 215.64804 443.27148 212.5918C445.73346 209.53555 446.54232 205.63111 445.69336 200.87695L442.63477 199.6035000000001C440.76707 198.9243 437.49935 198.7121 432.83008 198.9668C428.16082 199.2215 423.19517 200.45092 417.93164 202.6582C418.44101 202.4884100000001 418.82149 202.10794 419.07617 201.5136700000001C419.33087 200.9194 419.41692 200.11054 419.33203 199.0918C419.2471300000001 198.073 419.12097 197.184 418.95117 196.4199C418.78138 195.6559 418.52513 194.6788 418.18555 193.4902C417.84597 192.3017 417.67773 191.621 417.67773 191.4512C419.54544 190.4324 423.23764 188.4822 428.75586 185.5957C434.2740800000001 182.7092 438.43477 180.4147000000001 441.23633 178.7168C444.03789 177.0189 447.22149 174.5160000000001 450.78711 171.2050999999999C454.35273 167.8941 456.98373 164.2861 458.68164 160.3809000000001C457.15352 158.5132000000001 455.41158 157.1957 453.45898 156.4315999999999C451.50638 155.6676 449.8084600000001 155.2871 448.36523 155.2871C446.9220000000001 155.2871 444.84362 155.4151999999999 442.12695 155.6699000000001C439.41029 155.9246000000001 437.37201 156.0508 436.01367 156.0508C433.29701 152.9945 432.44805 149.9371000000001 433.4668 146.8809000000001C429.73139 145.1829 426.84413 143.2747 424.80664 141.1523C422.76914 139.0299 421.4556 137.1198 420.86133 135.4219000000001C420.26706 133.7239999999999 419.58633 131.0909999999999 418.82227 127.5254C418.05821 123.9598000000001 417.16719 120.9884 416.14844 118.6113C415.4692800000001 116.404 414.15377 114.3255999999999 412.20117 112.3730000000001C410.24857 110.4204 408.71887 108.5102999999999 407.61523 106.6425999999999C406.51158 104.7748999999999 406.21524 102.3121000000001 406.72461 99.2559000000001C407.23399 96.5391999999999 407.278 93.8221000000001 406.85352 91.1054999999999C406.42904 88.3888 405.7483 85.4594999999999 404.81445 82.3184000000001C403.8806 79.1772000000001 403.24389 76.5882999999999 402.9043 74.5508L401.63086 75.3145C400.6121 75.9936 399.29661 76.8866000000001 397.68359 77.9902C396.07057 79.0938000000001 394.37265 80.3672999999999 392.58984 81.8105000000001C390.80703 83.2538 388.98294 84.9937 387.11523 87.0311999999999C385.24752 89.0687 383.71784 91.1051 382.5293 93.1425999999999C381.51055 94.8405 379.8566400000001 95.9878000000001 377.56445 96.5820000000001C375.27227 97.1763000000001 372.42707 97.5147 369.03125 97.5996C365.63541 97.6845000000001 363.42694 97.8126 362.4082 97.9824000000001C359.69154 96.9637 357.8253900000001 95.0954999999999 356.80664 92.3788999999999C354.93894 87.2852 355.61772 82.3616 358.84375 77.6074000000001C362.06979 72.6833999999999 365.63581 72.3431000000001 369.54102 76.5879C372.59726 79.9838 375.22826 81.7678000000001 377.43555 81.9375C379.64283 82.1072999999999 381.21262 81.1302000000001 382.14648 79.0078000000001C383.08033 76.8853999999999 383.67695 74.5087000000001 383.93164 71.877C384.18633 69.2452000000001 384.22642 66.6561999999999 384.05664 64.1094000000001C384.7358 63.7698 386.81811 63.2172000000001 390.29883 62.4531C393.77955 61.6891000000001 396.02812 60.2034000000001 397.04688 57.9961000000001C397.04688 57.8263999999999 397.00481 55.6618000000001 396.91992 51.502C396.83502 47.3420000000001 397.13138 45.1776 397.81055 45.0078000000001C400.35742 41.1025999999999 405.95978 42.1216999999999 414.61914 48.0645C417.3358 49.9322 420.56342 51.3317999999999 424.29883 52.2656C428.03425 53.1994999999999 431.5983100000001 53.7520999999999 434.99414 53.9219000000001C438.38996 54.0916999999999 442.04207 54.2177999999999 445.94727 54.3027C449.85247 54.3876 453.33243 54.4315999999999 456.38867 54.4315999999999C459.27513 52.5639000000001 463.64806 50.9501 469.50586 49.5917999999999C475.36367 48.2335000000001 479.56447 46.9601 482.11133 45.7715000000001C484.14883 44.5830000000001 487.20625 43.9463000000001 491.28125 43.8613C495.35623 43.7764999999999 498.49779 43.0555999999999 500.70508 41.6973C500.19571 36.2638999999999 498.41172 30.9139 495.35547 25.6504C492.29923 20.3869 489.36992 16.2281 486.56836 13.1719000000001C483.7668 10.1156000000001 479.82031 6.1251 474.72656 1.2012C454.86097 -18.155 436.09775 -27.6638 418.43945 -27.3242C417.59049 -25.2867000000001 417.16602 -23.8431 417.16602 -22.9940999999999C417.16602 -22.1451999999999 417.46431 -20.9558999999999 418.05859 -19.4277C418.65286 -17.8996 418.95117 -16.5419999999999 418.95117 -15.3534999999999C415.72514 -14.6744000000001 412.62565 -13.1466 409.6543 -10.7695000000001C406.68295 -8.3924999999999 404.3483100000001 -6.0578 402.65039 -3.7655999999999C400.95248 -1.4735000000001 398.99831 1.4558999999999 396.79102 5.0215000000001C396.28165 7.9079999999999 397.0905 11.1335999999999 399.21289 14.6992C401.33529 18.2648999999999 403.24545 21.6606999999999 404.94336 24.8867C406.64128 28.1126999999999 406.89362 31 405.70508 33.5469000000001C400.78113 32.8677 395.89961 33.8008 391.06055 36.3477C386.2215 38.8945000000001 381.12773 42.1202000000001 375.7793 46.0254C370.4308700000001 49.9305999999999 365.97382 52.6477 362.4082 54.1758C360.54049 54.8549 357.61315 55.8741 353.62305 57.2324000000001C349.63295 58.5907 346.19309 59.8642 343.30664 61.0527C340.42018 62.2412999999999 337.6209600000001 63.5147 334.9043 64.8730000000001C333.71576 65.5522000000001 332.05795 66.7415000000001 329.93555 68.4395C327.81316 70.1374000000001 325.81888 71.4108000000001 323.95117 72.2598C322.08347 73.1087 320.13125 73.5332000000001 318.09375 73.5332000000001C318.26354 77.6081999999999 316.90598 82.6578999999999 314.01953 88.6855000000001C311.13307 94.7130999999999 309.68945 98.4914000000001 309.68945 100.0195000000001C310.7082 104.7737 310.02942 112.1600000000001 307.65234 122.1777C305.27526 132.1954000000001 304.85078 140.0904000000001 306.37891 145.8633C307.22786 149.5987 309.73269 156.3043 313.89258 165.9824000000001C318.0524700000001 175.6605 320.3871 183.3873 320.89648 189.1602C321.06627 190.3487 320.34349 191.9204 318.7304700000001 193.8730000000001C317.11745 195.8256 316.5667900000001 197.7358000000001 317.07617 199.6035000000001C317.58555 202.1503800000001 320.51291 205.07774 325.86133 208.3886700000001C331.20977 211.6996 335.58269 213.95013 338.97852 215.1386700000001C341.52539 215.98762 345.38778 216.15586 350.56641 215.64648C355.74505 215.13711 359.60743 215.13711 362.1543 215.64648C363.85221 215.9860700000001 367.1639400000001 216.5386600000001 372.08789 217.30273C377.01185 218.06679 380.6619800000001 218.74753 383.03906 219.3418C385.41614 219.93607 388.42957 220.95326 392.08008 222.39648C395.7306 223.83971 398.83009 225.58164 401.37695 227.61914zM397.81055 200.36523C396.45222 199.6861 395.05064 198.6249 393.60742 197.1816C392.16419 195.7384 391.01887 194.509 390.16992 193.4902C389.32096 192.4715 388.13164 191.9629 386.60352 191.9629C385.0753900000001 191.9629 383.46353 192.8119 381.76562 194.5098000000001C381.25624 193.3212 379.89673 191.1548 377.68945 188.0137C375.48216 184.8725 374.1246 182.3697 373.61523 180.502C376.33189 178.6343000000001 379.47345 177.2327 383.03906 176.2988C386.60468 175.365 391.06173 174.5160000000001 396.41016 173.752C401.75858 172.9879000000001 405.11236 172.5193999999999 406.4707 172.3496C406.4707 172.8589999999999 405.70585 174.8132000000001 404.17773 178.209C402.64961 181.6048 401.20795 185.4251000000001 399.84961 189.6699C398.49128 193.9147000000001 397.81055 197.4788 397.81055 200.36523z" /> <glyph glyph-name="add-layer" - unicode="" + unicode="" horiz-adv-x="1200" d=" M950 1080Q967 1080 979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080zM404 778L939 510L535 88L0 358zM876 360L971 307L557 -120L7 160L84 230L538 4z" /> <glyph glyph-name="add-layer-1" unicode="add-layer" horiz-adv-x="1200" d=" M950 1080Q967 1080 979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080zM404 778L939 510L535 88L0 358zM876 360L971 307L557 -120L7 160L84 230L538 4z" /> <glyph glyph-name="add-map" - unicode="" + unicode="" horiz-adv-x="1200" d=" M950 1080Q967 1080 979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080zM640.5 680Q681 680 709.5 650.5T738 584Q738 509 639 343Q542 495 542 584Q542 624 571 652T640.5 680zM639 614Q620 614 605 601T590 568T605 535T639 522Q687 522 687 568T639 614zM0 548L118 518L209 494V-120L72 -84L0 -66V548zM482 548Q483 507 509 447V-61L276 -120V494zM787 500L789 499V-116L670 -84L573 -61V322Q581 310 592.5 290.5T611 265L639 228L666 265Q751 392 787 500z" /> <glyph glyph-name="add-map-1" unicode="add-map" horiz-adv-x="1200" d=" M950 1080Q967 1080 979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080zM640.5 680Q681 680 709.5 650.5T738 584Q738 509 639 343Q542 495 542 584Q542 624 571 652T640.5 680zM639 614Q620 614 605 601T590 568T605 535T639 522Q687 522 687 568T639 614zM0 548L118 518L209 494V-120L72 -84L0 -66V548zM482 548Q483 507 509 447V-61L276 -120V494zM787 500L789 499V-116L670 -84L573 -61V322Q581 310 592.5 290.5T611 265L639 228L666 265Q751 392 787 500z" /> <glyph glyph-name="add-row-after" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1148 -120H54Q35 -120 18 -103T1 -67V-6Q1 46 54 46H1148Q1199 46 1199 -6V-67Q1199 -86 1184 -103T1148 -120zM599.5 147Q577 147 560.5 162.5T544 201V426H321Q298 426 282.5 441T267 479.5T282.5 519T321 535H544V759Q544 782 560.5 797.5T599.5 813T638.5 797.5T655 759V535H879Q900 535 916.5 519T933 479.5T916.5 441T879 426H655V201Q655 178 638.5 162.5T599.5 147z" /> <glyph glyph-name="add-row-after-1" unicode="add-row-after" horiz-adv-x="1200" d=" M1148 -120H54Q35 -120 18 -103T1 -67V-6Q1 46 54 46H1148Q1199 46 1199 -6V-67Q1199 -86 1184 -103T1148 -120zM599.5 147Q577 147 560.5 162.5T544 201V426H321Q298 426 282.5 441T267 479.5T282.5 519T321 535H544V759Q544 782 560.5 797.5T599.5 813T638.5 797.5T655 759V535H879Q900 535 916.5 519T933 479.5T916.5 441T879 426H655V201Q655 178 638.5 162.5T599.5 147z" /> <glyph glyph-name="add-row-before" - unicode="" + unicode="" horiz-adv-x="1200" d=" M52 1080H1146Q1165 1080 1182 1063T1199 1027V966Q1199 914 1146 914H52Q1 914 1 966V1027Q1 1046 16 1063T52 1080zM600.5 813Q623 813 639.5 797.5T656 759V534H879Q902 534 917.5 519T933 480.5T917.5 441T879 425H656V201Q656 178 639.5 162.5T600.5 147T561.5 162.5T545 201V425H321Q300 425 283.5 441T267 480.5T283.5 519T321 534H545V759Q545 782 561.5 797.5T600.5 813z" /> <glyph glyph-name="add-row-before-1" unicode="add-row-before" horiz-adv-x="1200" d=" M52 1080H1146Q1165 1080 1182 1063T1199 1027V966Q1199 914 1146 914H52Q1 914 1 966V1027Q1 1046 16 1063T52 1080zM600.5 813Q623 813 639.5 797.5T656 759V534H879Q902 534 917.5 519T933 480.5T917.5 441T879 425H656V201Q656 178 639.5 162.5T600.5 147T561.5 162.5T545 201V425H321Q300 425 283.5 441T267 480.5T283.5 519T321 534H545V759Q545 782 561.5 797.5T600.5 813z" /> <glyph glyph-name="adjust" - unicode="" + unicode="" horiz-adv-x="1200" d=" M375 1029Q600 1129 826 1029Q1044 935 1137 721Q1234 493 1137 267Q1044 49 826 -41Q600 -141 375 -41Q156 49 65 267Q-33 493 65 721Q156 935 375 1029zM600 28V956Q416 965 272.5 822T138 493Q133 305 272 164T600 28z" /> <glyph glyph-name="adjust-1" unicode="adjust" horiz-adv-x="1200" d=" M375 1029Q600 1129 826 1029Q1044 935 1137 721Q1234 493 1137 267Q1044 49 826 -41Q600 -141 375 -41Q156 49 65 267Q-33 493 65 721Q156 935 375 1029zM600 28V956Q416 965 272.5 822T138 493Q133 305 272 164T600 28z" /> <glyph glyph-name="admin-geofence" - unicode="" + unicode="" horiz-adv-x="1200" d=" M559 1080Q765 1080 914 1021Q986 993 1027.5 955.5T1074 877H1075V376Q1070 377 1066 378Q1033 383 1005 354Q999 355 1002 365Q1002 384 989 401Q989 456 989.5 573.5T989 745Q988 837 986 869Q984 875 980.5 880.5T970 891.5T960 899T947.5 907.5T937 914Q851 964 693 986Q628 994 553 993H544Q356 991 221 934Q201 925 189 919.5T161.5 902T136 877Q127 863 128 826Q130 819 129.5 788.5T129 751Q129 690 128.5 553T128 343Q133 337 145.5 327T163 311Q175 299 223.5 253T290 190.5L350 135.5L418.5 75.5L482.5 25L554 -27Q599 2 651 45Q665 39 682 39Q686 32 675 23Q662 8 661 -13T671 -50Q581 -120 554 -120Q532 -120 474.5 -78.5T350 21.5T219 139T113 239L70 281Q41 304 41 340Q41 349 43 357V877H44Q49 918 90.5 955.5T204 1021Q353 1080 559 1080zM559 893.5Q628 894 691 866.5T800 793T873 684T900 552Q900 487 876 428Q840 420 826 392Q824 387 823 375.5T820 360Q814 352 807 362Q800 369 791 374Q792 376 794 379Q804 397 806 416Q798 421 784 421T763 426Q754 430 733.5 434.5T703 446Q692 446 678.5 445.5T653 444.5T628 440.5T606 431Q575 410 566 424Q564 424 564.5 439L565 454Q561 462 549 464.5T534 468Q535 477 534 486.5T530 503T519 509.5T501 497Q487 483 476 500Q464 516 471 534Q475 544 484 547Q488 547 499.5 546.5T519 544T531 536Q535 529 541.5 522T554.5 509.5T566.5 500.5T575 494L578 493Q580 500 583 511T587.5 531.5T587 550Q585 561 589 567.5T600 580.5T609 595Q613 604 615.5 616T620 634T629 647.5T649 661Q646 672 655 682Q660 682 669.5 681.5T684 681T696 683.5T708 692Q702 706 689.5 717.5T667.5 735T638.5 751T613 765L614 769.5L615.5 776.5L616.5 782.5L616 788L614 791Q632 783 648 782T671 784L678 787Q681 803 672.5 814T651 828.5T621 837T597 849Q586 847 575 849Q566 842 553 837T532 830T506.5 825T483 821Q475 819 456.5 821T429 820Q418 816 399 804.5T378 784Q377 777 382.5 770.5T387 759Q386 739 371.5 705.5T354 659Q348 638 356.5 603.5T361 552Q361 547 371 525.5T381 490Q388 490 394.5 487T408.5 478T420 470Q429 465 439.5 461T464 452.5T484 445Q496 440 515 426.5T551 404T585 397Q589 388 583 377T569.5 353.5T564 331Q572 318 578 310T594 294T616 283Q616 279 614 273.5T612 265.5T614 255Q638 255 663 265Q668 247 680 233Q622 210 559 210Q490 210 427 237.5T318 311T244.5 420T217 552T244.5 684T318 793T427 866T559 893.5zM566 786Q566 775 571 760.5T581.5 734T587 720Q582 721 563.5 723.5T532.5 729.5T510 739Q512 746 519.5 757T529 772Q535 766 540.5 766T549 769.5T557 778T566 786zM910 380Q924 380 938 378Q951 378 951 363Q949 324 985 309Q1023 294 1047 324Q1056 332 1066 326Q1088 304 1105 285Q1113 273 1103 267Q1076 240 1090 204Q1102 171 1142 171Q1157 171 1157 157Q1161 131 1157 102Q1157 88 1142 88L1140 90Q1103 90 1088 55Q1075 19 1103 -7Q1113 -16 1105 -26Q1086 -47 1064 -67Q1054 -75 1046 -64Q1018 -36 983.5 -50.5T949 -104Q949 -117 937 -117Q917 -120 909 -120T880 -117Q868 -117 868 -102Q871 -64 835 -49Q797 -33 772 -64Q764 -72 753 -65Q730 -43 714 -24Q706 -13 716 -6Q743 21 729 56Q714 93 679 90Q662 90 662 103Q658 131 662 160Q662 172 677 172Q716 172 730 206Q745 242 718 268Q706 276 714 287Q741 316 755 327Q765 336 774 324Q801 297 836 311.5T871 364Q871 378 882 378Q896 380 910 380zM909 213Q876 213 851.5 188.5T827 131Q827 95 851.5 71T909 47Q944 47 969 71T994 131Q994 164 969 188.5T909 213z" /> <glyph glyph-name="admin-geofence-1" unicode="admin-geofence" horiz-adv-x="1200" d=" M559 1080Q765 1080 914 1021Q986 993 1027.5 955.5T1074 877H1075V376Q1070 377 1066 378Q1033 383 1005 354Q999 355 1002 365Q1002 384 989 401Q989 456 989.5 573.5T989 745Q988 837 986 869Q984 875 980.5 880.5T970 891.5T960 899T947.5 907.5T937 914Q851 964 693 986Q628 994 553 993H544Q356 991 221 934Q201 925 189 919.5T161.5 902T136 877Q127 863 128 826Q130 819 129.5 788.5T129 751Q129 690 128.5 553T128 343Q133 337 145.5 327T163 311Q175 299 223.5 253T290 190.5L350 135.5L418.5 75.5L482.5 25L554 -27Q599 2 651 45Q665 39 682 39Q686 32 675 23Q662 8 661 -13T671 -50Q581 -120 554 -120Q532 -120 474.5 -78.5T350 21.5T219 139T113 239L70 281Q41 304 41 340Q41 349 43 357V877H44Q49 918 90.5 955.5T204 1021Q353 1080 559 1080zM559 893.5Q628 894 691 866.5T800 793T873 684T900 552Q900 487 876 428Q840 420 826 392Q824 387 823 375.5T820 360Q814 352 807 362Q800 369 791 374Q792 376 794 379Q804 397 806 416Q798 421 784 421T763 426Q754 430 733.5 434.5T703 446Q692 446 678.5 445.5T653 444.5T628 440.5T606 431Q575 410 566 424Q564 424 564.5 439L565 454Q561 462 549 464.5T534 468Q535 477 534 486.5T530 503T519 509.5T501 497Q487 483 476 500Q464 516 471 534Q475 544 484 547Q488 547 499.5 546.5T519 544T531 536Q535 529 541.5 522T554.5 509.5T566.5 500.5T575 494L578 493Q580 500 583 511T587.5 531.5T587 550Q585 561 589 567.5T600 580.5T609 595Q613 604 615.5 616T620 634T629 647.5T649 661Q646 672 655 682Q660 682 669.5 681.5T684 681T696 683.5T708 692Q702 706 689.5 717.5T667.5 735T638.5 751T613 765L614 769.5L615.5 776.5L616.5 782.5L616 788L614 791Q632 783 648 782T671 784L678 787Q681 803 672.5 814T651 828.5T621 837T597 849Q586 847 575 849Q566 842 553 837T532 830T506.5 825T483 821Q475 819 456.5 821T429 820Q418 816 399 804.5T378 784Q377 777 382.5 770.5T387 759Q386 739 371.5 705.5T354 659Q348 638 356.5 603.5T361 552Q361 547 371 525.5T381 490Q388 490 394.5 487T408.5 478T420 470Q429 465 439.5 461T464 452.5T484 445Q496 440 515 426.5T551 404T585 397Q589 388 583 377T569.5 353.5T564 331Q572 318 578 310T594 294T616 283Q616 279 614 273.5T612 265.5T614 255Q638 255 663 265Q668 247 680 233Q622 210 559 210Q490 210 427 237.5T318 311T244.5 420T217 552T244.5 684T318 793T427 866T559 893.5zM566 786Q566 775 571 760.5T581.5 734T587 720Q582 721 563.5 723.5T532.5 729.5T510 739Q512 746 519.5 757T529 772Q535 766 540.5 766T549 769.5T557 778T566 786zM910 380Q924 380 938 378Q951 378 951 363Q949 324 985 309Q1023 294 1047 324Q1056 332 1066 326Q1088 304 1105 285Q1113 273 1103 267Q1076 240 1090 204Q1102 171 1142 171Q1157 171 1157 157Q1161 131 1157 102Q1157 88 1142 88L1140 90Q1103 90 1088 55Q1075 19 1103 -7Q1113 -16 1105 -26Q1086 -47 1064 -67Q1054 -75 1046 -64Q1018 -36 983.5 -50.5T949 -104Q949 -117 937 -117Q917 -120 909 -120T880 -117Q868 -117 868 -102Q871 -64 835 -49Q797 -33 772 -64Q764 -72 753 -65Q730 -43 714 -24Q706 -13 716 -6Q743 21 729 56Q714 93 679 90Q662 90 662 103Q658 131 662 160Q662 172 677 172Q716 172 730 206Q745 242 718 268Q706 276 714 287Q741 316 755 327Q765 336 774 324Q801 297 836 311.5T871 364Q871 378 882 378Q896 380 910 380zM909 213Q876 213 851.5 188.5T827 131Q827 95 851.5 71T909 47Q944 47 969 71T994 131Q994 164 969 188.5T909 213z" /> <glyph glyph-name="alert" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1367 -47Q1374 -58 1369 -66T1350 -74H720H652H22Q8 -74 3 -66T5 -47L320 501Q328 512 337.5 529T354 559L670 1105Q676 1116 686 1116T703 1105L1018 559Q1026 546 1035 529T1052 501zM621 314Q621 271 662 271H712Q751 271 751 314V779Q751 821 712 821H662Q621 821 621 779V314zM738 90Q759 112 759 145T738 198Q728 209 714.5 214.5T686.5 220T658 214.5T633 198Q615 180 615 145Q615 128 619.5 114.5T635 90Q645 80 658.5 75T686.5 70T714.5 75T738 90z" /> <glyph glyph-name="alert-1" unicode="alert" horiz-adv-x="1200" d=" M1367 -47Q1374 -58 1369 -66T1350 -74H720H652H22Q8 -74 3 -66T5 -47L320 501Q328 512 337.5 529T354 559L670 1105Q676 1116 686 1116T703 1105L1018 559Q1026 546 1035 529T1052 501zM621 314Q621 271 662 271H712Q751 271 751 314V779Q751 821 712 821H662Q621 821 621 779V314zM738 90Q759 112 759 145T738 198Q728 209 714.5 214.5T686.5 220T658 214.5T633 198Q615 180 615 145Q615 128 619.5 114.5T635 90Q645 80 658.5 75T686.5 70T714.5 75T738 90z" /> <glyph glyph-name="align-center" - unicode="" + unicode="" horiz-adv-x="1200" d=" M165 564Q118 564 118 607V664Q118 710 165 710H1035Q1081 710 1081 664V607Q1081 564 1035 564H165zM343 874Q300 874 300 921V978Q300 1025 343 1025H857Q900 1025 900 978V921Q900 874 857 874H343zM255 246Q209 246 209 292V349Q209 392 255 392H944Q990 392 990 349V292Q990 246 944 246H255zM1099 82Q1146 82 1146 35V-21Q1146 -38 1132 -53.5T1099 -69H102Q84 -69 68.5 -53.5T53 -21V35Q53 82 102 82H1099z" /> <glyph glyph-name="align-center-1" unicode="align-center" horiz-adv-x="1200" d=" M165 564Q118 564 118 607V664Q118 710 165 710H1035Q1081 710 1081 664V607Q1081 564 1035 564H165zM343 874Q300 874 300 921V978Q300 1025 343 1025H857Q900 1025 900 978V921Q900 874 857 874H343zM255 246Q209 246 209 292V349Q209 392 255 392H944Q990 392 990 349V292Q990 246 944 246H255zM1099 82Q1146 82 1146 35V-21Q1146 -38 1132 -53.5T1099 -69H102Q84 -69 68.5 -53.5T53 -21V35Q53 82 102 82H1099z" /> <glyph glyph-name="align-justify" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1099 84Q1146 84 1146 37V-19Q1146 -36 1132 -51.5T1099 -67H102Q84 -67 68.5 -51.5T53 -19V37Q53 84 102 84H1099zM1099 394Q1146 394 1146 351V294Q1146 248 1099 248H102Q53 248 53 294V351Q53 394 102 394H1099zM1099 712Q1146 712 1146 666V609Q1146 566 1099 566H102Q53 566 53 609V666Q53 712 102 712H1099zM1099 1027Q1118 1027 1132 1011.5T1146 980V923Q1146 876 1099 876H102Q53 876 53 923V980Q53 996 68.5 1011.5T102 1027H1099z" /> <glyph glyph-name="align-justify-1" unicode="align-justify" horiz-adv-x="1200" d=" M1099 84Q1146 84 1146 37V-19Q1146 -36 1132 -51.5T1099 -67H102Q84 -67 68.5 -51.5T53 -19V37Q53 84 102 84H1099zM1099 394Q1146 394 1146 351V294Q1146 248 1099 248H102Q53 248 53 294V351Q53 394 102 394H1099zM1099 712Q1146 712 1146 666V609Q1146 566 1099 566H102Q53 566 53 609V666Q53 712 102 712H1099zM1099 1027Q1118 1027 1132 1011.5T1146 980V923Q1146 876 1099 876H102Q53 876 53 923V980Q53 996 68.5 1011.5T102 1027H1099z" /> <glyph glyph-name="align-left" - unicode="" + unicode="" horiz-adv-x="1200" d=" M102 566Q53 566 53 609V666Q53 712 102 712H971Q1019 712 1019 666V609Q1019 566 971 566H102zM102 876Q53 876 53 923V980Q53 996 68.5 1011.5T102 1027H609Q629 1027 642.5 1011.5T656 980V923Q656 876 609 876H102zM102 248Q53 248 53 294V351Q53 394 102 394H791Q835 394 835 351V294Q835 248 791 248H102zM1099 84Q1146 84 1146 37V-19Q1146 -36 1132 -51.5T1099 -67H102Q84 -67 68.5 -51.5T53 -19V37Q53 84 102 84H1099z" /> <glyph glyph-name="align-left-1" unicode="align-left" horiz-adv-x="1200" d=" M102 566Q53 566 53 609V666Q53 712 102 712H971Q1019 712 1019 666V609Q1019 566 971 566H102zM102 876Q53 876 53 923V980Q53 996 68.5 1011.5T102 1027H609Q629 1027 642.5 1011.5T656 980V923Q656 876 609 876H102zM102 248Q53 248 53 294V351Q53 394 102 394H791Q835 394 835 351V294Q835 248 791 248H102zM1099 84Q1146 84 1146 37V-19Q1146 -36 1132 -51.5T1099 -67H102Q84 -67 68.5 -51.5T53 -19V37Q53 84 102 84H1099z" /> <glyph glyph-name="align-right" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1099 567H229Q182 567 182 610V667Q182 713 229 713H1099Q1146 713 1146 667V610Q1146 567 1099 567zM1099 877H590Q543 877 543 924V981Q543 997 557.5 1012.5T590 1028H1099Q1118 1028 1132 1012.5T1146 981V924Q1146 877 1099 877zM1099 249H408Q363 249 363 295V352Q363 395 408 395H1099Q1146 395 1146 352V295Q1146 249 1099 249zM102 85H1099Q1146 85 1146 38V-18Q1146 -35 1132 -50.5T1099 -66H102Q84 -66 68.5 -50.5T53 -18V38Q53 85 102 85z" /> <glyph glyph-name="align-right-1" unicode="align-right" horiz-adv-x="1200" d=" M1099 567H229Q182 567 182 610V667Q182 713 229 713H1099Q1146 713 1146 667V610Q1146 567 1099 567zM1099 877H590Q543 877 543 924V981Q543 997 557.5 1012.5T590 1028H1099Q1118 1028 1132 1012.5T1146 981V924Q1146 877 1099 877zM1099 249H408Q363 249 363 295V352Q363 395 408 395H1099Q1146 395 1146 352V295Q1146 249 1099 249zM102 85H1099Q1146 85 1146 38V-18Q1146 -35 1132 -50.5T1099 -66H102Q84 -66 68.5 -50.5T53 -18V38Q53 85 102 85z" /> <glyph glyph-name="angle" - unicode="" + unicode="" horiz-adv-x="1200" d=" M599.99994 919.230252L323.88016 440.9766200000001L-0.0000062500003 -120H647.75859H1200V-9.7051200000001H659.74664C643.81646 152.93417 558.25872 301.0502 425.33214 396.10646L695.51888 864.082769zM390.5975000000001 335.94686C502.4712500000001 253.65377 574.8767700000001 128.31872 590.2773500000001 -9.7051200000001H191.03612z" /> <glyph glyph-name="angle-1" unicode="angle" horiz-adv-x="1200" d=" M599.99994 919.230252L323.88016 440.9766200000001L-0.0000062500003 -120H647.75859H1200V-9.7051200000001H659.74664C643.81646 152.93417 558.25872 301.0502 425.33214 396.10646L695.51888 864.082769zM390.5975000000001 335.94686C502.4712500000001 253.65377 574.8767700000001 128.31872 590.2773500000001 -9.7051200000001H191.03612z" /> <glyph glyph-name="arrow-down" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1069 620Q1159 539 1073 457L593 -81L109 457Q80 488 80 537Q80 597 114 620Q201 704 278 614L453 418V1031H729V418L903 614Q981 704 1069 620z" /> <glyph glyph-name="arrow-down-1" unicode="arrow-down" horiz-adv-x="1200" d=" M1069 620Q1159 539 1073 457L593 -81L109 457Q80 488 80 537Q80 597 114 620Q201 704 278 614L453 418V1031H729V418L903 614Q981 704 1069 620z" /> <glyph glyph-name="arrow-left" - unicode="" + unicode="" horiz-adv-x="1200" d=" M743 -10Q664 -102 581 -15L46 466L581 947Q612 979 661 979Q719 979 743 943Q831 857 738 780L544 605H1154V328H544L738 150Q831 72 743 -10z" /> <glyph glyph-name="arrow-left-1" unicode="arrow-left" horiz-adv-x="1200" d=" M743 -10Q664 -102 581 -15L46 466L581 947Q612 979 661 979Q719 979 743 943Q831 857 738 780L544 605H1154V328H544L738 150Q831 72 743 -10z" /> <glyph glyph-name="arrow-right" - unicode="" + unicode="" horiz-adv-x="1200" d=" M452 946Q535 1038 616 952L1154 470L616 -11Q586 -43 539 -43Q477 -43 452 -7Q369 79 459 156L652 331H46V608H652L459 786Q369 863 452 946z" /> <glyph glyph-name="arrow-right-1" unicode="arrow-right" horiz-adv-x="1200" d=" M452 946Q535 1038 616 952L1154 470L616 -11Q586 -43 539 -43Q477 -43 452 -7Q369 79 459 156L652 331H46V608H652L459 786Q369 863 452 946z" /> <glyph glyph-name="arrow-up" - unicode="" + unicode="" horiz-adv-x="1200" d=" M120 357Q29 436 115 520L596 1058L1081 520Q1110 488 1110 440Q1110 379 1075 357Q988 272 911 362L736 558V-56H461V558L286 362Q209 272 120 357z" /> <glyph glyph-name="arrow-up-1" unicode="arrow-up" horiz-adv-x="1200" d=" M120 357Q29 436 115 520L596 1058L1081 520Q1110 488 1110 440Q1110 379 1075 357Q988 272 911 362L736 558V-56H461V558L286 362Q209 272 120 357z" /> <glyph glyph-name="asterisk" - unicode="" + unicode="" horiz-adv-x="1200" d=" M541 385Q545 396 537 400.5T518 400L216 183Q189 164 173 195L112 299Q97 326 128 342L466 496Q500 509 466 525L125 682Q97 698 112 725L173 825Q193 856 216 834L518 624Q526 621 531 621T538.5 625.5T541 639L513 1005Q513 1040 541 1040H657Q688 1040 688 1005L657 639Q654 628 662 623.5T682 624L983 834Q1008 856 1027 825L1087 725Q1103 698 1075 682L734 525Q701 509 734 496L1072 342Q1103 326 1087 299L1027 195Q1012 164 983 183L682 400Q672 403 667.5 403T660 398.5T657 385L688 19Q688 -16 657 -16H541Q513 -16 513 19z" /> <glyph glyph-name="asterisk-1" unicode="asterisk" horiz-adv-x="1200" d=" M541 385Q545 396 537 400.5T518 400L216 183Q189 164 173 195L112 299Q97 326 128 342L466 496Q500 509 466 525L125 682Q97 698 112 725L173 825Q193 856 216 834L518 624Q526 621 531 621T538.5 625.5T541 639L513 1005Q513 1040 541 1040H657Q688 1040 688 1005L657 639Q654 628 662 623.5T682 624L983 834Q1008 856 1027 825L1087 725Q1103 698 1075 682L734 525Q701 509 734 496L1072 342Q1103 326 1087 299L1027 195Q1012 164 983 183L682 400Q672 403 667.5 403T660 398.5T657 385L688 19Q688 -16 657 -16H541Q513 -16 513 19z" /> <glyph glyph-name="audio-low" - unicode="" + unicode="" horiz-adv-x="1200" d=" M479.99998 694L737.99998 866Q746.99998 872 752.99998 868.5Q759.00001 865 759.00001 855V105Q759.00001 95 752.99998 91.5Q746.99998 88 737.99998 94L479.99998 266Q458.99998 280 433.99998 280H183.99998Q173.99998 280 166.49998 287.5Q158.99998 295 158.99998 305V655Q158.99998 665 166.49998 672.5Q173.99998 680 183.99998 680H433.99998Q458.99998 680 479.99998 694zM925.00001 780H929.00001Q939.00001 779 945.00001 770Q1041 641 1041 480Q1041 326 951.00001 199Q945.00001 190 934.00001 189L931.00001 188Q922.00001 188 915.00001 194L886.00001 217Q879.00001 224 877.50001 233.5Q876.00001 243 882.00001 251Q954.00001 354 954.00001 480Q954.00001 612 876.00001 718Q870.00001 726 871.50001 736Q873.00001 746 881.00001 753L910.00001 775Q917.00001 780 925.00001 780z" /> <glyph glyph-name="audio-low-1" unicode="audio-low" horiz-adv-x="1200" d=" M479.99998 694L737.99998 866Q746.99998 872 752.99998 868.5Q759.00001 865 759.00001 855V105Q759.00001 95 752.99998 91.5Q746.99998 88 737.99998 94L479.99998 266Q458.99998 280 433.99998 280H183.99998Q173.99998 280 166.49998 287.5Q158.99998 295 158.99998 305V655Q158.99998 665 166.49998 672.5Q173.99998 680 183.99998 680H433.99998Q458.99998 680 479.99998 694zM925.00001 780H929.00001Q939.00001 779 945.00001 770Q1041 641 1041 480Q1041 326 951.00001 199Q945.00001 190 934.00001 189L931.00001 188Q922.00001 188 915.00001 194L886.00001 217Q879.00001 224 877.50001 233.5Q876.00001 243 882.00001 251Q954.00001 354 954.00001 480Q954.00001 612 876.00001 718Q870.00001 726 871.50001 736Q873.00001 746 881.00001 753L910.00001 775Q917.00001 780 925.00001 780z" /> <glyph glyph-name="audio" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1006 884.000002H1009Q1020 883.000002 1026 874.000002Q1161 695 1161 478Q1161 373 1127 271.5Q1093 170 1029 86Q1022 77 1012 76H1009Q999.99998 76 992.99998 82L950.99998 116Q942.99998 122 941.99998 132Q940.99998 142 946.99998 150Q1058 300 1058 478Q1058 568 1028.5 654Q998.99998 740 943.99998 811Q937.99998 820 938.99998 830Q939.99998 840 948.99998 846L990.99998 879.000002Q997.99998 884.000002 1006 884.000002zM360.00001 694L618.00001 866.000002Q627.00001 872.000002 633.00001 868.500002Q639.00001 865.000002 639.00001 855V105Q639.00001 95 633.00001 91.5Q627.00001 88 618.00001 94L360.00001 266Q339.00001 280 314.00001 280H64.000009Q54.000009 280 46.500009 287.5Q39.000009 295 39.000009 305V655Q39.000009 665 46.500009 672.5Q54.000009 680 64.000009 680H314.00001Q339.00001 680 360.00001 694zM804.99998 780H808.99998Q818.99998 779 824.99998 770Q920.99998 641 920.99998 480Q920.99998 326 830.99998 199Q824.99998 190 813.99998 189L810.99998 188Q801.99998 188 794.99998 194L765.99998 217Q758.99998 224 757.49998 233.5Q755.99998 243 761.99998 251Q833.99998 354 833.99998 480Q833.99998 612 755.99998 718Q749.99998 726 751.49998 736.5Q752.99998 747 760.99998 753L789.99998 775Q796.99998 780 804.99998 780z" /> <glyph glyph-name="audio-1" unicode="audio" horiz-adv-x="1200" d=" M1006 884.000002H1009Q1020 883.000002 1026 874.000002Q1161 695 1161 478Q1161 373 1127 271.5Q1093 170 1029 86Q1022 77 1012 76H1009Q999.99998 76 992.99998 82L950.99998 116Q942.99998 122 941.99998 132Q940.99998 142 946.99998 150Q1058 300 1058 478Q1058 568 1028.5 654Q998.99998 740 943.99998 811Q937.99998 820 938.99998 830Q939.99998 840 948.99998 846L990.99998 879.000002Q997.99998 884.000002 1006 884.000002zM360.00001 694L618.00001 866.000002Q627.00001 872.000002 633.00001 868.500002Q639.00001 865.000002 639.00001 855V105Q639.00001 95 633.00001 91.5Q627.00001 88 618.00001 94L360.00001 266Q339.00001 280 314.00001 280H64.000009Q54.000009 280 46.500009 287.5Q39.000009 295 39.000009 305V655Q39.000009 665 46.500009 672.5Q54.000009 680 64.000009 680H314.00001Q339.00001 680 360.00001 694zM804.99998 780H808.99998Q818.99998 779 824.99998 770Q920.99998 641 920.99998 480Q920.99998 326 830.99998 199Q824.99998 190 813.99998 189L810.99998 188Q801.99998 188 794.99998 194L765.99998 217Q758.99998 224 757.49998 233.5Q755.99998 243 761.99998 251Q833.99998 354 833.99998 480Q833.99998 612 755.99998 718Q749.99998 726 751.49998 736.5Q752.99998 747 760.99998 753L789.99998 775Q796.99998 780 804.99998 780z" /> <glyph glyph-name="back" - unicode="" + unicode="" horiz-adv-x="1200" d=" M803.69735 -120C852.92287 -119.9994999999999 892.8279 -80.0943999999999 892.82843 -30.8689100000001C892.82114 -7.5402300000001 883.66796 14.8557900000001 867.33369 31.51169C867.33369 31.51169 861.73596 37.2019599999999 867.33369 31.51169L508.64776 483.3267499999999L869.4357 930.83854L869.44067 930.8435C884.44745 947.23643 892.78864 968.64437 892.82843 990.8689C892.82791 1040.0944 852.92287 1079.9995 803.69735 1080C770.4521 1079.9701 739.98652 1061.4405 724.66935 1031.934C724.66935 1031.934 722.06312 1026.9234999999999 724.66935 1031.934L340.78897 555.78314C319.50269 537.74338 307.2118500000001 511.2662700000001 307.17155 483.3639800000001C307.18931 454.9583299999999 319.90286 428.0474900000001 341.83377 409.9943100000001L725.15081 -72.8448000000001V-72.8472999999999C740.63393 -101.8471999999999 770.82298 -119.9702 803.69735 -120z" /> <glyph glyph-name="back-1" unicode="back" horiz-adv-x="1200" d=" M803.69735 -120C852.92287 -119.9994999999999 892.8279 -80.0943999999999 892.82843 -30.8689100000001C892.82114 -7.5402300000001 883.66796 14.8557900000001 867.33369 31.51169C867.33369 31.51169 861.73596 37.2019599999999 867.33369 31.51169L508.64776 483.3267499999999L869.4357 930.83854L869.44067 930.8435C884.44745 947.23643 892.78864 968.64437 892.82843 990.8689C892.82791 1040.0944 852.92287 1079.9995 803.69735 1080C770.4521 1079.9701 739.98652 1061.4405 724.66935 1031.934C724.66935 1031.934 722.06312 1026.9234999999999 724.66935 1031.934L340.78897 555.78314C319.50269 537.74338 307.2118500000001 511.2662700000001 307.17155 483.3639800000001C307.18931 454.9583299999999 319.90286 428.0474900000001 341.83377 409.9943100000001L725.15081 -72.8448000000001V-72.8472999999999C740.63393 -101.8471999999999 770.82298 -119.9702 803.69735 -120z" /> <glyph glyph-name="backward" - unicode="" + unicode="" horiz-adv-x="1200" d=" M586 263Q649 212 594 158Q528 97 469 155L60 466L469 778Q489 798 529 798T594 774Q649 720 586 669L324 466zM1071 263Q1137 212 1073 158Q1014 97 949 155L542 466L949 778Q973 798 1012.5 798T1073 774Q1137 720 1071 669L809 466z" /> <glyph glyph-name="backward-1" unicode="backward" horiz-adv-x="1200" d=" M586 263Q649 212 594 158Q528 97 469 155L60 466L469 778Q489 798 529 798T594 774Q649 720 586 669L324 466zM1071 263Q1137 212 1073 158Q1014 97 949 155L542 466L949 778Q973 798 1012.5 798T1073 774Q1137 720 1071 669L809 466z" /> <glyph glyph-name="ban-circle" - unicode="" + unicode="" horiz-adv-x="1200" d=" M378 1026Q600 1118 823 1026Q1038 937 1130 719Q1223 497 1130 274Q1038 56 823 -33Q600 -125 378 -33Q160 56 72 274Q-22 497 72 719Q160 937 378 1026zM600 940Q421 942 288.5 809T158 497Q158 387 241 252L847 860Q711 940 600 940zM969 734L364 131Q493 53 600 53Q781 51 913.5 184T1043 497Q1043 600 969 734z" /> <glyph glyph-name="ban-circle-1" unicode="ban-circle" horiz-adv-x="1200" d=" M378 1026Q600 1118 823 1026Q1038 937 1130 719Q1223 497 1130 274Q1038 56 823 -33Q600 -125 378 -33Q160 56 72 274Q-22 497 72 719Q160 937 378 1026zM600 940Q421 942 288.5 809T158 497Q158 387 241 252L847 860Q711 940 600 940zM969 734L364 131Q493 53 600 53Q781 51 913.5 184T1043 497Q1043 600 969 734z" /> <glyph glyph-name="barcode" - unicode="" + unicode="" horiz-adv-x="1200" d=" M110 -45Q110 -66 89 -66H44Q28 -66 28 -45V1066Q28 1087 44 1087H89Q110 1087 110 1066V-45zM565 -45Q565 -66 547 -66H501Q483 -66 483 -45V1066Q483 1087 501 1087H547Q565 1087 565 1066V-45zM1020 -45Q1020 -66 1000 -66H952Q937 -66 937 -45V1066Q937 1087 952 1087H1000Q1020 1087 1020 1066V-45zM1172 -45Q1172 -66 1155 -66H1110Q1091 -66 1091 -45V1066Q1091 1087 1110 1087H1155Q1172 1087 1172 1066V-45zM889 -45Q889 -66 871 -66H754Q732 -66 732 -45V1066Q732 1087 754 1087H871Q889 1087 889 1066V-45zM406 -45Q406 -66 386 -66H266Q246 -66 246 -45V1066Q246 1087 266 1087H386Q406 1087 406 1066V-45z" /> <glyph glyph-name="barcode-1" unicode="barcode" horiz-adv-x="1200" d=" M110 -45Q110 -66 89 -66H44Q28 -66 28 -45V1066Q28 1087 44 1087H89Q110 1087 110 1066V-45zM565 -45Q565 -66 547 -66H501Q483 -66 483 -45V1066Q483 1087 501 1087H547Q565 1087 565 1066V-45zM1020 -45Q1020 -66 1000 -66H952Q937 -66 937 -45V1066Q937 1087 952 1087H1000Q1020 1087 1020 1066V-45zM1172 -45Q1172 -66 1155 -66H1110Q1091 -66 1091 -45V1066Q1091 1087 1110 1087H1155Q1172 1087 1172 1066V-45zM889 -45Q889 -66 871 -66H754Q732 -66 732 -45V1066Q732 1087 754 1087H871Q889 1087 889 1066V-45zM406 -45Q406 -66 386 -66H266Q246 -66 246 -45V1066Q246 1087 266 1087H386Q406 1087 406 1066V-45z" /> <glyph glyph-name="bold" - unicode="" + unicode="" horiz-adv-x="1200" d=" M618 1079Q824 1079 937 1000Q1052 919 1052 762Q1052 680 1009 618Q968 556 886 523Q990 500 1041 428Q1094 356 1094 259Q1094 92 984 6Q873 -79 673 -79H103V60L227 84V915L103 939V1079H227H618zM459 594H626Q721 594 769 632Q819 671 819 744Q819 823 769 862Q719 900 618 900H459V594zM459 434V98H673Q766 98 814 140Q863 180 863 259Q863 341 821 388Q778 434 690 434H459z" /> <glyph glyph-name="bold-1" unicode="bold" horiz-adv-x="1200" d=" M618 1079Q824 1079 937 1000Q1052 919 1052 762Q1052 680 1009 618Q968 556 886 523Q990 500 1041 428Q1094 356 1094 259Q1094 92 984 6Q873 -79 673 -79H103V60L227 84V915L103 939V1079H227H618zM459 594H626Q721 594 769 632Q819 671 819 744Q819 823 769 862Q719 900 618 900H459V594zM459 434V98H673Q766 98 814 140Q863 180 863 259Q863 341 821 388Q778 434 690 434H459z" /> <glyph glyph-name="book" - unicode="" + unicode="" horiz-adv-x="1200" d=" M567 174Q567 188 562 205.5T521.5 251T419 279H23V1037H415Q481 1037 519 1009T562 959L567 931V174zM636 174Q636 188 640.5 205.5T682.5 251T785 279H1186V1037H785Q720 1037 682.5 1009T642 959L636 931V174zM672 8H524V46Q524 54 519 68T486 98T410 114H13V188H410Q557 188 589 83H607Q642 188 785 188H1186V114H785Q738 114 710 98T677 65L672 46V8z" /> <glyph glyph-name="book-1" unicode="book" horiz-adv-x="1200" d=" M567 174Q567 188 562 205.5T521.5 251T419 279H23V1037H415Q481 1037 519 1009T562 959L567 931V174zM636 174Q636 188 640.5 205.5T682.5 251T785 279H1186V1037H785Q720 1037 682.5 1009T642 959L636 931V174zM672 8H524V46Q524 54 519 68T486 98T410 114H13V188H410Q557 188 589 83H607Q642 188 785 188H1186V114H785Q738 114 710 98T677 65L672 46V8z" /> <glyph glyph-name="bookmark" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1038 -220L599 192L161 -220V1127H1038V-220z" /> <glyph glyph-name="bookmark-1" unicode="bookmark" horiz-adv-x="1200" d=" M1038 -220L599 192L161 -220V1127H1038V-220z" /> <glyph glyph-name="bulb-off" - unicode="" + unicode="" horiz-adv-x="1200" d=" M600 862Q695 862 775 815.5T901.5 689T948 514Q948 410 891 323T738 195V125Q738 110 723 99T686 88H514Q492 88 477 99T462 125V194Q366 236 309 323T252 514Q252 609 298.5 689T425 815.5T600 862zM599 771H593Q512 769 444 717T353 587Q333 519 353 446T426 325Q440 313 456.5 302T496 278T529 258Q557 231 555 181Q563 181 595.5 180.5T645 180Q646 238 680 265Q692 274 723.5 290T768 320Q826 371 847.5 448.5T843 598Q820 663 765.5 709.5T644 767Q621 770 599 771zM514 19H686Q708 19 723 15T738 5V-49Q738 -54 724 -58.5T689 -63V-105Q689 -111 679 -115.5T655 -120H545Q531 -120 521 -115.5T511 -105V-63Q490 -63 476 -58.5T462 -49V5Q462 11 477 15T514 19z" /> <glyph glyph-name="bulb-off-1" unicode="bulb-off" horiz-adv-x="1200" d=" M600 862Q695 862 775 815.5T901.5 689T948 514Q948 410 891 323T738 195V125Q738 110 723 99T686 88H514Q492 88 477 99T462 125V194Q366 236 309 323T252 514Q252 609 298.5 689T425 815.5T600 862zM599 771H593Q512 769 444 717T353 587Q333 519 353 446T426 325Q440 313 456.5 302T496 278T529 258Q557 231 555 181Q563 181 595.5 180.5T645 180Q646 238 680 265Q692 274 723.5 290T768 320Q826 371 847.5 448.5T843 598Q820 663 765.5 709.5T644 767Q621 770 599 771zM514 19H686Q708 19 723 15T738 5V-49Q738 -54 724 -58.5T689 -63V-105Q689 -111 679 -115.5T655 -120H545Q531 -120 521 -115.5T511 -105V-63Q490 -63 476 -58.5T462 -49V5Q462 11 477 15T514 19z" /> <glyph glyph-name="bulb-on" - unicode="" + unicode="" horiz-adv-x="1200" d=" M574 1080H626V931Q613 933 600 933T574 932V1080zM218 933L323 828Q304 810 286 791L181 896zM982 933L1019 896L914 791Q896 810 877 828zM600 862Q695 862 775 815.5T901.5 689T948 514Q948 410 891 323T738 195V125Q738 110 723 99T686 88H514Q492 88 477 99T462 125V194Q366 236 309 323T252 514Q252 609 298.5 689T425 815.5T600 862zM599 771H593Q512 769 444 717T353 587Q333 519 353 446T426 325Q440 313 456.5 302T496 278T529 258Q557 231 555 181Q563 181 595.5 180.5T645 180Q646 238 680 265Q692 274 723.5 290T768 320Q826 371 847.5 448.5T843 598Q820 663 765.5 709.5T644 767Q621 770 599 771zM34 540H182Q181 527 181 514T182 488H34V540zM1018 540H1166V488H1018Q1019 501 1019 514T1018 540zM286 237Q304 217 323 200L218 95L181 132zM914 237L1019 132L982 95L877 200Q896 217 914 237zM514 19H686Q708 19 723 15T738 5V-49Q738 -54 724 -58.5T689 -63V-105Q689 -111 679 -115.5T655 -120H545Q531 -120 521 -115.5T511 -105V-63Q490 -63 476 -58.5T462 -49V5Q462 11 477 15T514 19z" /> <glyph glyph-name="bulb-on-1" unicode="bulb-on" horiz-adv-x="1200" d=" M574 1080H626V931Q613 933 600 933T574 932V1080zM218 933L323 828Q304 810 286 791L181 896zM982 933L1019 896L914 791Q896 810 877 828zM600 862Q695 862 775 815.5T901.5 689T948 514Q948 410 891 323T738 195V125Q738 110 723 99T686 88H514Q492 88 477 99T462 125V194Q366 236 309 323T252 514Q252 609 298.5 689T425 815.5T600 862zM599 771H593Q512 769 444 717T353 587Q333 519 353 446T426 325Q440 313 456.5 302T496 278T529 258Q557 231 555 181Q563 181 595.5 180.5T645 180Q646 238 680 265Q692 274 723.5 290T768 320Q826 371 847.5 448.5T843 598Q820 663 765.5 709.5T644 767Q621 770 599 771zM34 540H182Q181 527 181 514T182 488H34V540zM1018 540H1166V488H1018Q1019 501 1019 514T1018 540zM286 237Q304 217 323 200L218 95L181 132zM914 237L1019 132L982 95L877 200Q896 217 914 237zM514 19H686Q708 19 723 15T738 5V-49Q738 -54 724 -58.5T689 -63V-105Q689 -111 679 -115.5T655 -120H545Q531 -120 521 -115.5T511 -105V-63Q490 -63 476 -58.5T462 -49V5Q462 11 477 15T514 19z" /> <glyph glyph-name="calendar" - unicode="" + unicode="" horiz-adv-x="1200" d=" M505 571H694V383H505V571zM762 571H946V383H762V571zM505 316H694V126H505V316zM252 316H438V126H252V316zM762 316H946V126H762V316zM1068 947Q1091 947 1110 928.5T1129 887V-2Q1129 -28 1110 -47.5T1068 -67H131Q106 -67 88.5 -47.5T71 -2V887Q71 910 88.5 928.5T131 947H226V1103H396V947H799V1103H974V947H1068zM1042 683H174V23H1042V683z" /> <glyph glyph-name="calendar-1" unicode="calendar" horiz-adv-x="1200" d=" M505 571H694V383H505V571zM762 571H946V383H762V571zM505 316H694V126H505V316zM252 316H438V126H252V316zM762 316H946V126H762V316zM1068 947Q1091 947 1110 928.5T1129 887V-2Q1129 -28 1110 -47.5T1068 -67H131Q106 -67 88.5 -47.5T71 -2V887Q71 910 88.5 928.5T131 947H226V1103H396V947H799V1103H974V947H1068zM1042 683H174V23H1042V683z" /> <glyph glyph-name="camera" - unicode="" + unicode="" horiz-adv-x="1200" d=" M732 617Q791 563 791 483T735 348T599.5 293T466 348T412 483T467.5 617.5T600 672T732 617zM1197 932V31H2V932H880V1038H1041V932H1197zM327 482Q327 368 409 288.5T601.5 209T792.5 288.5T873 482Q873 593 792.5 674T601.5 755T409 674T327 482z" /> <glyph glyph-name="camera-1" unicode="camera" horiz-adv-x="1200" d=" M732 617Q791 563 791 483T735 348T599.5 293T466 348T412 483T467.5 617.5T600 672T732 617zM1197 932V31H2V932H880V1038H1041V932H1197zM327 482Q327 368 409 288.5T601.5 209T792.5 288.5T873 482Q873 593 792.5 674T601.5 755T409 674T327 482z" /> <glyph glyph-name="caption" - unicode="" + unicode="" horiz-adv-x="1200" d=" M116.00195 1078.81055L116.00195 347.8574200000001L1083.998 347.8574200000001L1083.998 1078.81055L116.00195 1078.81055zM179.89258 1023.16406L1020.9336 1023.16406L1020.9336 405.43945L179.89258 405.43945L179.89258 1023.16406zM0 231.19141L0 114.5234000000001L1200 114.5234000000001L1200 231.19141L0 231.19141zM0.00390625 -2.1425999999999L0.00390625 -118.8105L915.25391 -118.8105L915.25391 -2.1425999999999L0.00390625 -2.1425999999999z" /> <glyph glyph-name="caption-1" unicode="caption" horiz-adv-x="1200" d=" M116.00195 1078.81055L116.00195 347.8574200000001L1083.998 347.8574200000001L1083.998 1078.81055L116.00195 1078.81055zM179.89258 1023.16406L1020.9336 1023.16406L1020.9336 405.43945L179.89258 405.43945L179.89258 1023.16406zM0 231.19141L0 114.5234000000001L1200 114.5234000000001L1200 231.19141L0 231.19141zM0.00390625 -2.1425999999999L0.00390625 -118.8105L915.25391 -118.8105L915.25391 -2.1425999999999L0.00390625 -2.1425999999999z" /> <glyph glyph-name="check" - unicode="" + unicode="" horiz-adv-x="1200" d=" M547 398L879 859L931 934L982 1010Q1011 1050 1056 1050Q1089 1050 1120 1024Q1185 960 1146 903L1064 788L1003 706L547 71L198 533Q173 564 177 609T209 682.5T271 711Q308 711 337 676zM525 -80H532L529 -84zM796 -70H255Q155 -70 85 0.5T15 170V711Q15 812 85 880.5T255 949H607V870H255Q188 870 141 824T94 711V170Q94 101 141 55.5T255 10H796Q865 10 911 55.5T957 170V485H1037V170Q1037 71 966 0.5T796 -70z" /> <glyph glyph-name="check-1" unicode="check" horiz-adv-x="1200" d=" M547 398L879 859L931 934L982 1010Q1011 1050 1056 1050Q1089 1050 1120 1024Q1185 960 1146 903L1064 788L1003 706L547 71L198 533Q173 564 177 609T209 682.5T271 711Q308 711 337 676zM525 -80H532L529 -84zM796 -70H255Q155 -70 85 0.5T15 170V711Q15 812 85 880.5T255 949H607V870H255Q188 870 141 824T94 711V170Q94 101 141 55.5T255 10H796Q865 10 911 55.5T957 170V485H1037V170Q1037 71 966 0.5T796 -70z" /> <glyph glyph-name="chevron-down" - unicode="" + unicode="" horiz-adv-x="1200" d=" M78 720Q78 782 111 817Q195 911 270 813L574 414L874 813Q949 911 1035 817Q1122 732 1039 630L574 22L106 630Q78 666 78 720z" /> <glyph glyph-name="chevron-down-1" unicode="chevron-down" horiz-adv-x="1200" d=" M78 720Q78 782 111 817Q195 911 270 813L574 414L874 813Q949 911 1035 817Q1122 732 1039 630L574 22L106 630Q78 666 78 720z" /> <glyph glyph-name="chevron-left" - unicode="" + unicode="" horiz-adv-x="1200" d=" M853 943Q915 943 950 910Q1044 826 946 751L547 447L946 147Q1044 72 950 -14Q865 -101 763 -18L155 447L763 915Q799 943 853 943z" /> <glyph glyph-name="chevron-left-1" unicode="chevron-left" horiz-adv-x="1200" d=" M853 943Q915 943 950 910Q1044 826 946 751L547 447L946 147Q1044 72 950 -14Q865 -101 763 -18L155 447L763 915Q799 943 853 943z" /> <glyph glyph-name="chevron-right" - unicode="" + unicode="" horiz-adv-x="1200" d=" M346 -61Q284 -61 249 -28Q155 56 253 131L652 435L253 735Q155 810 249 896Q334 983 436 900L1044 435L436 -33Q400 -61 346 -61z" /> <glyph glyph-name="chevron-right-1" unicode="chevron-right" horiz-adv-x="1200" d=" M346 -61Q284 -61 249 -28Q155 56 253 131L652 435L253 735Q155 810 249 896Q334 983 436 900L1044 435L436 -33Q400 -61 346 -61z" /> <glyph glyph-name="chevron-up" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1122 209Q1122 147 1089 112Q1005 18 930 116L626 515L326 116Q251 18 165 112Q78 197 161 299L626 907L1094 299Q1122 263 1122 209z" /> <glyph glyph-name="chevron-up-1" unicode="chevron-up" horiz-adv-x="1200" d=" M1122 209Q1122 147 1089 112Q1005 18 930 116L626 515L326 116Q251 18 165 112Q78 197 161 299L626 907L1094 299Q1122 263 1122 209z" /> <glyph glyph-name="circle-arrow-down" - unicode="" + unicode="" horiz-adv-x="1200" d=" M185 82Q13 254 13 495.5T185.5 910T599 1083T1013.5 910T1187 495.5T1013.5 81T599 -92T185 82zM331 577Q312 563 312 530Q312 503 328 486L600 183L870 486Q918 532 868 577Q820 625 774 573L678 463V808H522V463L423 573Q379 625 331 577z" /> <glyph glyph-name="circle-arrow-down-1" unicode="circle-arrow-down" horiz-adv-x="1200" d=" M185 82Q13 254 13 495.5T185.5 910T599 1083T1013.5 910T1187 495.5T1013.5 81T599 -92T185 82zM331 577Q312 563 312 530Q312 503 328 486L600 183L870 486Q918 532 868 577Q820 625 774 573L678 463V808H522V463L423 573Q379 625 331 577z" /> <glyph glyph-name="circle-arrow-left" - unicode="" + unicode="" horiz-adv-x="1200" d=" M186 920Q358 1092 599.5 1092T1014 919.5T1187 506T1014 91.5T599.5 -82T185 91.5T12 506T186 920zM681 774Q667 793 634 793Q607 793 590 777L287 505L590 235Q636 187 681 237Q729 285 677 331L567 427H912V583H567L677 682Q729 726 681 774z" /> <glyph glyph-name="circle-arrow-left-1" unicode="circle-arrow-left" horiz-adv-x="1200" d=" M186 920Q358 1092 599.5 1092T1014 919.5T1187 506T1014 91.5T599.5 -82T185 91.5T12 506T186 920zM681 774Q667 793 634 793Q607 793 590 777L287 505L590 235Q636 187 681 237Q729 285 677 331L567 427H912V583H567L677 682Q729 726 681 774z" /> <glyph glyph-name="circle-arrow-right" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1013 89Q841 -83 599.5 -83T185 89.5T12 503T185 917.5T599.5 1091T1014 917.5T1187 503T1013 89zM518 235Q532 216 565 216Q592 216 609 232L912 504L609 774Q563 822 518 772Q470 724 522 678L632 582H287V426H632L522 327Q470 283 518 235z" /> <glyph glyph-name="circle-arrow-right-1" unicode="circle-arrow-right" horiz-adv-x="1200" d=" M1013 89Q841 -83 599.5 -83T185 89.5T12 503T185 917.5T599.5 1091T1014 917.5T1187 503T1013 89zM518 235Q532 216 565 216Q592 216 609 232L912 504L609 774Q563 822 518 772Q470 724 522 678L632 582H287V426H632L522 327Q470 283 518 235z" /> <glyph glyph-name="circle-arrow-up" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1015 910Q1187 738 1187 496.5T1014.5 82T601 -91T186.5 82T13 496.5T186.5 911T601 1084T1015 910zM869 415Q888 429 888 462Q888 489 872 506L600 809L330 506Q282 460 332 415Q380 367 426 419L522 529V184H678V529L777 419Q821 367 869 415z" /> <glyph glyph-name="circle-arrow-up-1" unicode="circle-arrow-up" horiz-adv-x="1200" d=" M1015 910Q1187 738 1187 496.5T1014.5 82T601 -91T186.5 82T13 496.5T186.5 911T601 1084T1015 910zM869 415Q888 429 888 462Q888 489 872 506L600 809L330 506Q282 460 332 415Q380 367 426 419L522 529V184H678V529L777 419Q821 367 869 415z" /> <glyph glyph-name="clear-brush" - unicode="" + unicode="" horiz-adv-x="1200" d=" M600 1080Q645 1080 677.5 1048.5T711 972V969V680H1114V475H1059V-120H141V475H86V680H489V969V972Q490 1017 522.5 1048.5T600 1080zM246 475V-15H380V286H445V-15H568V286H632V-15H758V286H822V-15H954V475H246z" /> <glyph glyph-name="clear-brush-1" unicode="clear-brush" horiz-adv-x="1200" d=" M600 1080Q645 1080 677.5 1048.5T711 972V969V680H1114V475H1059V-120H141V475H86V680H489V969V972Q490 1017 522.5 1048.5T600 1080zM246 475V-15H380V286H445V-15H568V286H632V-15H758V286H822V-15H954V475H246z" /> <glyph glyph-name="clear-filter" - unicode="" + unicode="" horiz-adv-x="1200" d=" M773 248Q761 260 761.5 277T774 306T802.5 318T831 306L949 187L1069 307Q1081 319 1098 318.5T1127 306T1139 277T1127 248L1008 129L1127 9Q1138 -2 1138.5 -18.5T1127 -47.5T1098 -59.5T1070 -48L950 71L831 -48Q819 -61 802 -60.5T773 -47.5T760.5 -18.5T772 11L892 130zM49 1074H936Q958 1074 973 1058T988 1022Q988 974 936 974H49Q0 974 0 1022Q0 1042 15 1058T49 1074zM593 380V84L395 -114V380L49 876H936z" /> <glyph glyph-name="clear-filter-1" unicode="clear-filter" horiz-adv-x="1200" d=" M773 248Q761 260 761.5 277T774 306T802.5 318T831 306L949 187L1069 307Q1081 319 1098 318.5T1127 306T1139 277T1127 248L1008 129L1127 9Q1138 -2 1138.5 -18.5T1127 -47.5T1098 -59.5T1070 -48L950 71L831 -48Q819 -61 802 -60.5T773 -47.5T760.5 -18.5T772 11L892 130zM49 1074H936Q958 1074 973 1058T988 1022Q988 974 936 974H49Q0 974 0 1022Q0 1042 15 1058T49 1074zM593 380V84L395 -114V380L49 876H936z" /> <glyph glyph-name="cloud-download" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1225 407Q1258 289 1188 187Q1129 108 1042 97Q1029 93 1008 93H897L966 169Q1006 214 1006 276Q998 335 955 378Q908 417 854 417Q818 417 780 397V640H459V397Q421 417 385 417Q332 417 287 378Q233 335 233 269Q233 214 276 169L342 93H242Q93 93 29 229Q-47 378 80 505Q121 543 186 553Q186 558 199 558Q178 674 260 736Q295 763 359.5 763T470 721Q488 763 515 801Q585 883 698 892Q818 907 922 857T1052 658Q1057 622 1052 579Q1047 579 1053 572Q1190 532 1225 407zM900 317Q955 271 905 222L791 93L619 -95L449 93L334 222Q316 240 316 268T339 317Q358 335 385.5 335T435 315L537 202V560H701V202L806 315Q826 335 855 335T900 317z" /> <glyph glyph-name="cloud-download-1" unicode="cloud-download" horiz-adv-x="1200" d=" M1225 407Q1258 289 1188 187Q1129 108 1042 97Q1029 93 1008 93H897L966 169Q1006 214 1006 276Q998 335 955 378Q908 417 854 417Q818 417 780 397V640H459V397Q421 417 385 417Q332 417 287 378Q233 335 233 269Q233 214 276 169L342 93H242Q93 93 29 229Q-47 378 80 505Q121 543 186 553Q186 558 199 558Q178 674 260 736Q295 763 359.5 763T470 721Q488 763 515 801Q585 883 698 892Q818 907 922 857T1052 658Q1057 622 1052 579Q1047 579 1053 572Q1190 532 1225 407zM900 317Q955 271 905 222L791 93L619 -95L449 93L334 222Q316 240 316 268T339 317Q358 335 385.5 335T435 315L537 202V560H701V202L806 315Q826 335 855 335T900 317z" /> <glyph glyph-name="cloud-upload" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1225 407Q1258 289 1188 187Q1129 108 1042 97Q1029 93 1008 93H962Q1006 143 1006 197T966 296L679 614L619 678L560 614L276 296Q233 248 233 190Q242 131 278 93H242Q93 93 29 229Q-47 378 80 505Q121 543 186 553Q186 558 199 558Q178 674 260 736Q295 763 359.5 763T470 721Q488 763 515 801Q585 883 698 892Q818 907 922 857T1052 658Q1057 622 1052 579Q1047 579 1053 572Q1190 532 1225 407zM905 244Q923 225 923 198Q923 165 900 143Q877 127 854 127Q829 127 806 150L701 261V-95H537V261L435 150Q409 127 385 127Q362 127 339 143Q287 194 334 244L619 560z" /> <glyph glyph-name="cloud-upload-1" unicode="cloud-upload" horiz-adv-x="1200" d=" M1225 407Q1258 289 1188 187Q1129 108 1042 97Q1029 93 1008 93H962Q1006 143 1006 197T966 296L679 614L619 678L560 614L276 296Q233 248 233 190Q242 131 278 93H242Q93 93 29 229Q-47 378 80 505Q121 543 186 553Q186 558 199 558Q178 674 260 736Q295 763 359.5 763T470 721Q488 763 515 801Q585 883 698 892Q818 907 922 857T1052 658Q1057 622 1052 579Q1047 579 1053 572Q1190 532 1225 407zM905 244Q923 225 923 198Q923 165 900 143Q877 127 854 127Q829 127 806 150L701 261V-95H537V261L435 150Q409 127 385 127Q362 127 339 143Q287 194 334 244L619 560z" /> <glyph glyph-name="cloud" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1228 408Q1260 287 1188 183Q1137 111 1043 93H1010H626Q239 90 239 93Q88 93 24 227Q-10 298 5.5 375T77 503Q114 537 183 554L197 559Q175 674 258 735Q302 762 357 764T469 725Q498 778 516 802Q584 882 698 898Q1005 920 1054 655Q1060 619 1054 580Q1046 573 1058 573Q1193 532 1228 408z" /> <glyph glyph-name="cloud-1" unicode="cloud" horiz-adv-x="1200" d=" M1228 408Q1260 287 1188 183Q1137 111 1043 93H1010H626Q239 90 239 93Q88 93 24 227Q-10 298 5.5 375T77 503Q114 537 183 554L197 559Q175 674 258 735Q302 762 357 764T469 725Q498 778 516 802Q584 882 698 898Q1005 920 1054 655Q1060 619 1054 580Q1046 573 1058 573Q1193 532 1228 408z" /> <glyph glyph-name="code" - unicode="" + unicode="" horiz-adv-x="1200" d=" M702 952V952Q729 952 748.5 932.5T768 886Q767 872 762 859L595 73Q594 60 589 48T575 27T554 13T529 8Q511 8 496 17T472 41T463 74Q463 85 467 95Q617 803 636 891V886V882V886V891Q637 908 646.5 922T670.5 944T702 952zM636 891zM636 881Q636 878 637 875Q636 878 636 881zM637 875Q637 872 638 868.5T640 862Q639 865 638 868.5T637 875zM640 862Q641 859 643 856Q641 859 640 862zM643 856Q644 854 646 851Q644 853 643 856zM646 851L650 845zM650 845Q652 843 654 840Q652 843 650 845zM655 840L659 836zM659 836Q662 834 664 832Q667 830 670 829Q667 830 664.5 832T659 836zM671 828L675 826zM676 825Q682 823 688 822Q682 823 676 825zM689 822Q692 821 694 821Q692 821 689 822zM712 821H706H712zM696 821Q699 820 702 820Q699 820 696 821zM352 752Q354 752 356 751Q385 752 406 731Q434 706 426.5 666T385 612Q344 581 267.5 523.5T173 453Q201 432 264 385T360 314Q362 312 373 304L387 293L385 294Q411 283 422.5 255.5T424 202Q413 170 378.5 158.5T316 167Q299 181 280 196.5T237 230.5T200 259Q191 267 129.5 315.5T34 388Q10 402 3 431T8 487.5T46 526Q107 574 301 727L321 742Q339 752 352 752zM850 752Q874 751 901 727Q1110 562 1156 526Q1182 515 1194 487.5T1199 431T1168 388Q1142 370 1114 348.5T1053.5 301T1002 259Q989 249 965 230.5T922 196.5T886 167Q858 147 823.5 158.5T778 202Q768 228 779.5 255.5T817 294Q812 291 818 296Q820 298 829 304L842 314Q875 338 938 385T1029 453Q1011 466 934.5 523.5T817 612Q783 626 775.5 666T796 731Q817 752 846 751Q848 752 850 752zM296 719zM906 719zM292 713zM910 713zM289 707zM913 707zM287 700zM915 700zM285 693L284 690V686V682Q284 688 285 693zM917 693Q918 688 918 682V686V690zM284 673Q284 670 285 666Q285 664 286 659V659L288 653L289 652Q290 648 291 646H292L289 652L286 659L285 666zM291 646H292H291zM918 673L917 666L916 659L913 652L910 646H911Q912 648 913 652L914 653L916 659V659Q917 664 917 666Q918 670 918 673zM910 646H911H910zM295 640zM907 640zM299 634zM903 634zM304 628zM898 628zM309 623zM893 623zM328 612Q332 610 335 609Q336 609 340 608Q333 610 328 612zM874 612Q869 610 862 608Q866 609 867 609Q870 610 874 612zM349 607zM333 296zM869 296zM529 140Q532 140 535 139Q538 139 541 138Q538 139 535 139Q532 140 529 140zM542 138Q545 138 548 137Q545 138 542 138zM548 137L554 135zM555 134Q557 133 560 132Q557 133 555 134zM561 131Q563 130 566 128Q564 130 561 131zM566 128Q569 126 571 124Q569 126 566 128zM587 104Q589 101 590 98Q589 101 587 104zM590 98L592 92zM592 91L594 85zM594 85V79V85z" /> <glyph glyph-name="code-1" unicode="code" horiz-adv-x="1200" d=" M702 952V952Q729 952 748.5 932.5T768 886Q767 872 762 859L595 73Q594 60 589 48T575 27T554 13T529 8Q511 8 496 17T472 41T463 74Q463 85 467 95Q617 803 636 891V886V882V886V891Q637 908 646.5 922T670.5 944T702 952zM636 891zM636 881Q636 878 637 875Q636 878 636 881zM637 875Q637 872 638 868.5T640 862Q639 865 638 868.5T637 875zM640 862Q641 859 643 856Q641 859 640 862zM643 856Q644 854 646 851Q644 853 643 856zM646 851L650 845zM650 845Q652 843 654 840Q652 843 650 845zM655 840L659 836zM659 836Q662 834 664 832Q667 830 670 829Q667 830 664.5 832T659 836zM671 828L675 826zM676 825Q682 823 688 822Q682 823 676 825zM689 822Q692 821 694 821Q692 821 689 822zM712 821H706H712zM696 821Q699 820 702 820Q699 820 696 821zM352 752Q354 752 356 751Q385 752 406 731Q434 706 426.5 666T385 612Q344 581 267.5 523.5T173 453Q201 432 264 385T360 314Q362 312 373 304L387 293L385 294Q411 283 422.5 255.5T424 202Q413 170 378.5 158.5T316 167Q299 181 280 196.5T237 230.5T200 259Q191 267 129.5 315.5T34 388Q10 402 3 431T8 487.5T46 526Q107 574 301 727L321 742Q339 752 352 752zM850 752Q874 751 901 727Q1110 562 1156 526Q1182 515 1194 487.5T1199 431T1168 388Q1142 370 1114 348.5T1053.5 301T1002 259Q989 249 965 230.5T922 196.5T886 167Q858 147 823.5 158.5T778 202Q768 228 779.5 255.5T817 294Q812 291 818 296Q820 298 829 304L842 314Q875 338 938 385T1029 453Q1011 466 934.5 523.5T817 612Q783 626 775.5 666T796 731Q817 752 846 751Q848 752 850 752zM296 719zM906 719zM292 713zM910 713zM289 707zM913 707zM287 700zM915 700zM285 693L284 690V686V682Q284 688 285 693zM917 693Q918 688 918 682V686V690zM284 673Q284 670 285 666Q285 664 286 659V659L288 653L289 652Q290 648 291 646H292L289 652L286 659L285 666zM291 646H292H291zM918 673L917 666L916 659L913 652L910 646H911Q912 648 913 652L914 653L916 659V659Q917 664 917 666Q918 670 918 673zM910 646H911H910zM295 640zM907 640zM299 634zM903 634zM304 628zM898 628zM309 623zM893 623zM328 612Q332 610 335 609Q336 609 340 608Q333 610 328 612zM874 612Q869 610 862 608Q866 609 867 609Q870 610 874 612zM349 607zM333 296zM869 296zM529 140Q532 140 535 139Q538 139 541 138Q538 139 535 139Q532 140 529 140zM542 138Q545 138 548 137Q545 138 542 138zM548 137L554 135zM555 134Q557 133 560 132Q557 133 555 134zM561 131Q563 130 566 128Q564 130 561 131zM566 128Q569 126 571 124Q569 126 566 128zM587 104Q589 101 590 98Q589 101 587 104zM590 98L592 92zM592 91L594 85zM594 85V79V85z" /> <glyph glyph-name="cog" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1173 594Q1183 532 1173 465Q1173 433 1140 433L1134 437Q1049 437 1015 356Q983 274 1049 213Q1071 193 1053 170Q1010 120 959 75Q936 55 916 81Q852 146 771.5 112T691 -11Q691 -41 663 -41Q618 -49 600 -49Q581 -49 533 -41Q504 -41 504 -7Q511 81 427 116Q339 152 282 81Q262 63 238 78Q185 130 148 173Q128 199 152 216Q215 278 181 360Q146 445 66 437Q27 437 27 467Q17 532 27 599Q27 628 61 628Q152 628 185 707Q220 789 156 851Q128 869 148 894Q209 961 242 988Q266 1007 286 980Q349 918 430 951.5T511 1074Q511 1105 537 1105Q600 1115 667 1105Q697 1105 697 1071Q691 980 775 946Q863 910 919 980Q940 999 962 985Q1015 933 1053 890Q1073 862 1049 847Q986 785 1019 703Q1047 626 1138 626Q1173 626 1173 594zM600 337Q680 337 738 393.5T796 532Q796 609 738 665.5T600 722Q523 722 466.5 665.5T410 532Q410 450 466.5 393.5T600 337z" /> <glyph glyph-name="cog-1" unicode="cog" horiz-adv-x="1200" d=" M1173 594Q1183 532 1173 465Q1173 433 1140 433L1134 437Q1049 437 1015 356Q983 274 1049 213Q1071 193 1053 170Q1010 120 959 75Q936 55 916 81Q852 146 771.5 112T691 -11Q691 -41 663 -41Q618 -49 600 -49Q581 -49 533 -41Q504 -41 504 -7Q511 81 427 116Q339 152 282 81Q262 63 238 78Q185 130 148 173Q128 199 152 216Q215 278 181 360Q146 445 66 437Q27 437 27 467Q17 532 27 599Q27 628 61 628Q152 628 185 707Q220 789 156 851Q128 869 148 894Q209 961 242 988Q266 1007 286 980Q349 918 430 951.5T511 1074Q511 1105 537 1105Q600 1115 667 1105Q697 1105 697 1071Q691 980 775 946Q863 910 919 980Q940 999 962 985Q1015 933 1053 890Q1073 862 1049 847Q986 785 1019 703Q1047 626 1138 626Q1173 626 1173 594zM600 337Q680 337 738 393.5T796 532Q796 609 738 665.5T600 722Q523 722 466.5 665.5T410 532Q410 450 466.5 393.5T600 337z" /> <glyph glyph-name="collapse-down" - unicode="" + unicode="" horiz-adv-x="1200" d=" M795 600L599 268L406 600H795zM890 -69H310Q202 -69 128.5 5T55 187V765Q55 871 128.5 945T310 1019H890Q994 1019 1069 945T1144 765V187Q1144 79 1069 5T890 -69zM310 935Q239 935 189.5 886T140 765V187Q140 113 189.5 64.5T310 16H890Q961 16 1010.5 64.5T1060 187V765Q1060 837 1010.5 886T890 935H310z" /> <glyph glyph-name="collapse-down-1" unicode="collapse-down" horiz-adv-x="1200" d=" M795 600L599 268L406 600H795zM890 -69H310Q202 -69 128.5 5T55 187V765Q55 871 128.5 945T310 1019H890Q994 1019 1069 945T1144 765V187Q1144 79 1069 5T890 -69zM310 935Q239 935 189.5 886T140 765V187Q140 113 189.5 64.5T310 16H890Q961 16 1010.5 64.5T1060 187V765Q1060 837 1010.5 886T890 935H310z" /> <glyph glyph-name="collapse-up" - unicode="" + unicode="" horiz-adv-x="1200" d=" M404 352L600 684L793 352H404zM309 1021H889Q997 1021 1070.5 947T1144 765V187Q1144 81 1070.5 7T889 -67H309Q205 -67 130 7T55 187V765Q55 873 130 947T309 1021zM889 17Q960 17 1009.5 66T1059 187V765Q1059 839 1009.5 887.5T889 936H309Q238 936 188.5 887.5T139 765V187Q139 115 188.5 66T309 17H889z" /> <glyph glyph-name="collapse-up-1" unicode="collapse-up" horiz-adv-x="1200" d=" M404 352L600 684L793 352H404zM309 1021H889Q997 1021 1070.5 947T1144 765V187Q1144 81 1070.5 7T889 -67H309Q205 -67 130 7T55 187V765Q55 873 130 947T309 1021zM889 17Q960 17 1009.5 66T1059 187V765Q1059 839 1009.5 887.5T889 936H309Q238 936 188.5 887.5T139 765V187Q139 115 188.5 66T309 17H889z" /> <glyph glyph-name="comment" - unicode="" + unicode="" horiz-adv-x="1200" d=" M105 969H1131Q1175 969 1205 938.5T1235 871V375Q1235 333 1205 302.5T1131 272H479L208 -35V272H105Q62 272 31 302.5T0 375V871Q0 913 31 941T105 969z" /> <glyph glyph-name="comment-1" unicode="comment" horiz-adv-x="1200" d=" M105 969H1131Q1175 969 1205 938.5T1235 871V375Q1235 333 1205 302.5T1131 272H479L208 -35V272H105Q62 272 31 302.5T0 375V871Q0 913 31 941T105 969z" /> <glyph glyph-name="compressed" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1483 448L1406 528Q1364 570 1406 609Q1444 653 1483 609V448zM223 582Q260 621 300.5 584.5T301 503L128 331Q86 291 44.5 332T46 412zM539 907V20H365V346L349 331Q309 291 267 331Q230 373 267 412L365 508V907H539zM1262 582L1439 412Q1479 373 1438 332T1357 331L1183 503Q1140 548 1182 584.5T1262 582zM1215 412Q1254 373 1215 331Q1176 291 1132 331L1119 346V20H946V907H1119V508zM79 582Q120 548 79 503L0 425V582Q41 621 79 582zM606 674H878V182H606V674z" /> <glyph glyph-name="compressed-1" unicode="compressed" horiz-adv-x="1200" d=" M1483 448L1406 528Q1364 570 1406 609Q1444 653 1483 609V448zM223 582Q260 621 300.5 584.5T301 503L128 331Q86 291 44.5 332T46 412zM539 907V20H365V346L349 331Q309 291 267 331Q230 373 267 412L365 508V907H539zM1262 582L1439 412Q1479 373 1438 332T1357 331L1183 503Q1140 548 1182 584.5T1262 582zM1215 412Q1254 373 1215 331Q1176 291 1132 331L1119 346V20H946V907H1119V508zM79 582Q120 548 79 503L0 425V582Q41 621 79 582zM606 674H878V182H606V674z" /> <glyph glyph-name="copy" - unicode="" + unicode="" horiz-adv-x="1200" d=" M408 86Q393 66 359 66Q329 66 308 91Q258 145 310 192L429 301H49V475H429L310 586Q258 629 306 686.5T408 691L746 387zM1001 977Q1063 977 1107 934T1151 830V10Q1151 -49 1107 -93T1001 -137H398Q337 -137 293.5 -93T250 10H294Q294 -34 324 -65.5T398 -97H1001Q1043 -97 1073 -65.5T1103 10V830Q1103 876 1073 906.5T1001 937H909V779H487V937H398Q354 937 324 906.5T294 830V740H250V830Q250 891 293.5 934T398 977H563Q572 1031 611.5 1063.5T699.5 1096T787.5 1063.5T834 977H1001zM771 977Q748 1033 699.5 1033T629 977H771z" /> <glyph glyph-name="copy-1" unicode="copy" horiz-adv-x="1200" d=" M408 86Q393 66 359 66Q329 66 308 91Q258 145 310 192L429 301H49V475H429L310 586Q258 629 306 686.5T408 691L746 387zM1001 977Q1063 977 1107 934T1151 830V10Q1151 -49 1107 -93T1001 -137H398Q337 -137 293.5 -93T250 10H294Q294 -34 324 -65.5T398 -97H1001Q1043 -97 1073 -65.5T1103 10V830Q1103 876 1073 906.5T1001 937H909V779H487V937H398Q354 937 324 906.5T294 830V740H250V830Q250 891 293.5 934T398 977H563Q572 1031 611.5 1063.5T699.5 1096T787.5 1063.5T834 977H1001zM771 977Q748 1033 699.5 1033T629 977H771z" /> <glyph glyph-name="counter" - unicode="" + unicode="" horiz-adv-x="1200" d=" M223 1080H977Q1069 1080 1134.5 1014.5T1200 857V103Q1200 11 1134.5 -54.5T977 -120H223Q131 -120 65.5 -54.5T0 103V857Q0 949 65.5 1014.5T223 1080zM570 884Q568 848 553 827Q539 807 514 793Q494 783 455 777T382 771V698H550V159H382V76H818V159H653V884H570z" /> <glyph glyph-name="counter-1" unicode="counter" horiz-adv-x="1200" d=" M223 1080H977Q1069 1080 1134.5 1014.5T1200 857V103Q1200 11 1134.5 -54.5T977 -120H223Q131 -120 65.5 -54.5T0 103V857Q0 949 65.5 1014.5T223 1080zM570 884Q568 848 553 827Q539 807 514 793Q494 783 455 777T382 771V698H550V159H382V76H818V159H653V884H570z" /> <glyph glyph-name="crs" - unicode="" + unicode="" horiz-adv-x="1200" d=" M600 1080Q763 1080 901 999.5T1119.5 781T1200 480T1119.5 179T901 -39.5T600 -120T299 -39.5T80.5 179T0 480T80.5 781T299 999.5T600 1080zM643 974V841H939Q887 890 800.5 929T643 974zM557 974Q486 968 399 929T260 841H557V974zM187 755Q158 712 134.5 644.5T106 525H557V755H187zM643 755V525H1094Q1089 577 1065 644.5T1013 755H643zM106 435Q111 383 135 315.5T187 205H557V435H106zM643 435V205H1013Q1042 248 1065.5 315.5T1094 435H643zM261 119Q313 70 399.5 31T557 -14V119H261V119zM643 119V-14Q714 -8 801 31T940 119H643z" /> <glyph glyph-name="crs-1" unicode="crs" horiz-adv-x="1200" d=" M600 1080Q763 1080 901 999.5T1119.5 781T1200 480T1119.5 179T901 -39.5T600 -120T299 -39.5T80.5 179T0 480T80.5 781T299 999.5T600 1080zM643 974V841H939Q887 890 800.5 929T643 974zM557 974Q486 968 399 929T260 841H557V974zM187 755Q158 712 134.5 644.5T106 525H557V755H187zM643 755V525H1094Q1089 577 1065 644.5T1013 755H643zM106 435Q111 383 135 315.5T187 205H557V435H106zM643 435V205H1013Q1042 248 1065.5 315.5T1094 435H643zM261 119Q313 70 399.5 31T557 -14V119H261V119zM643 119V-14Q714 -8 801 31T940 119H643z" /> <glyph glyph-name="dashboard-save" - unicode="" + unicode="" horiz-adv-x="1200" d=" M489 1079Q689 1079 832.5 935.5T976 591Q976 538 964 487H898Q911 538 911 591Q911 766 786.5 890.5T488 1015T189.5 890.5T65 591Q65 479 125 375H570Q570 147 571 111Q531 104 489 104Q348 104 231.5 178T55 375Q0 476 0 591Q0 792 144.5 935.5T489 1079zM381 951Q424 951 424 908T381 865Q365 865 352.5 877T340 908Q340 925 352.5 938T381 951zM593 951Q637 951 637 908Q637 889 624.5 877T593 865Q576 865 563.5 877T551 908Q551 925 563.5 938T593 951zM709 901L626 668L551 450Q551 445 544 434Q534 411 508 403T461 405Q437 419 428.5 445T432 493Q432 496 434.5 498.5T440 503L570 695zM215 820Q233 820 245 807.5T257 774Q257 757 245 745T215 733Q195 733 183 745T171 774Q171 820 215 820zM764 820Q782 820 794 807.5T806 778Q806 736 763.5 736T721 778T764 820zM812 640Q833 640 845 627.5T857 597Q857 556 812 556Q770 556 770 597Q770 615 783.5 627.5T812 640zM159 633Q200 633 200 591T159 549Q143 549 129.5 562T116 592T129.5 621T159 633zM635 457H1101L1107 456Q1138 426 1196 368Q1198 366 1198 360Q1200 212 1200 -88Q1200 -102 1190 -111T1166 -120H900H635Q608 -120 602 -96V-86Q600 84 600 422Q600 439 611 448T635 457zM774 421Q760 421 750.5 411.5T741 388V279Q741 265 750.5 256T774 247H1028Q1041 247 1050.5 256T1060 279V388Q1060 403 1050.5 412T1028 421H774zM942 395H1002V272H942V395zM686 189V-60H1114V189H686z" /> <glyph glyph-name="dashboard-save-1" unicode="dashboard-save" horiz-adv-x="1200" d=" M489 1079Q689 1079 832.5 935.5T976 591Q976 538 964 487H898Q911 538 911 591Q911 766 786.5 890.5T488 1015T189.5 890.5T65 591Q65 479 125 375H570Q570 147 571 111Q531 104 489 104Q348 104 231.5 178T55 375Q0 476 0 591Q0 792 144.5 935.5T489 1079zM381 951Q424 951 424 908T381 865Q365 865 352.5 877T340 908Q340 925 352.5 938T381 951zM593 951Q637 951 637 908Q637 889 624.5 877T593 865Q576 865 563.5 877T551 908Q551 925 563.5 938T593 951zM709 901L626 668L551 450Q551 445 544 434Q534 411 508 403T461 405Q437 419 428.5 445T432 493Q432 496 434.5 498.5T440 503L570 695zM215 820Q233 820 245 807.5T257 774Q257 757 245 745T215 733Q195 733 183 745T171 774Q171 820 215 820zM764 820Q782 820 794 807.5T806 778Q806 736 763.5 736T721 778T764 820zM812 640Q833 640 845 627.5T857 597Q857 556 812 556Q770 556 770 597Q770 615 783.5 627.5T812 640zM159 633Q200 633 200 591T159 549Q143 549 129.5 562T116 592T129.5 621T159 633zM635 457H1101L1107 456Q1138 426 1196 368Q1198 366 1198 360Q1200 212 1200 -88Q1200 -102 1190 -111T1166 -120H900H635Q608 -120 602 -96V-86Q600 84 600 422Q600 439 611 448T635 457zM774 421Q760 421 750.5 411.5T741 388V279Q741 265 750.5 256T774 247H1028Q1041 247 1050.5 256T1060 279V388Q1060 403 1050.5 412T1028 421H774zM942 395H1002V272H942V395zM686 189V-60H1114V189H686z" /> <glyph glyph-name="dashboard" - unicode="" + unicode="" horiz-adv-x="1200" d=" M521 876Q521 823 469 823Q449 823 433.5 838T418 876Q418 897 433.5 913T469 929Q521 929 521 876zM317 712Q317 691 302.5 676T266 661Q241 661 226.5 676T212 712Q212 768 266 768Q288 768 302.5 752.5T317 712zM197 436Q177 436 160.5 452T144 488.5T160.5 524T197 539Q247 539 247 487.5T197 436zM2 488Q2 734 179 910T601 1086T1022 910T1198 488Q1198 347 1131 223Q1060 72 917 -18.5T601.5 -109T286 -18.5T70 223Q2 347 2 488zM1046 223Q1118 350 1118 488Q1118 702 965.5 854.5T600 1007T234.5 854.5T82 488Q82 350 155 223H1046zM700 615L871 867L769 582L677 315Q677 309 669 295Q656 267 624.5 257T567 259Q538 277 527.5 308.5T531 367Q531 371 534.5 374T541 380zM783 876Q783 853 767.5 838T729 823Q708 823 692.5 838T677 876Q677 897 692.5 913T729 929Q783 929 783 876zM990 716Q990 665 937.5 665T885 716.5T938 768Q960 768 975 752.5T990 716zM1052 495Q1052 444 997 444Q945 444 945 495Q945 517 961.5 532T997 547Q1023 547 1037.5 532T1052 495z" /> <glyph glyph-name="dashboard-1" unicode="dashboard" horiz-adv-x="1200" d=" M521 876Q521 823 469 823Q449 823 433.5 838T418 876Q418 897 433.5 913T469 929Q521 929 521 876zM317 712Q317 691 302.5 676T266 661Q241 661 226.5 676T212 712Q212 768 266 768Q288 768 302.5 752.5T317 712zM197 436Q177 436 160.5 452T144 488.5T160.5 524T197 539Q247 539 247 487.5T197 436zM2 488Q2 734 179 910T601 1086T1022 910T1198 488Q1198 347 1131 223Q1060 72 917 -18.5T601.5 -109T286 -18.5T70 223Q2 347 2 488zM1046 223Q1118 350 1118 488Q1118 702 965.5 854.5T600 1007T234.5 854.5T82 488Q82 350 155 223H1046zM700 615L871 867L769 582L677 315Q677 309 669 295Q656 267 624.5 257T567 259Q538 277 527.5 308.5T531 367Q531 371 534.5 374T541 380zM783 876Q783 853 767.5 838T729 823Q708 823 692.5 838T677 876Q677 897 692.5 913T729 929Q783 929 783 876zM990 716Q990 665 937.5 665T885 716.5T938 768Q960 768 975 752.5T990 716zM1052 495Q1052 444 997 444Q945 444 945 495Q945 517 961.5 532T997 547Q1023 547 1037.5 532T1052 495z" /> <glyph glyph-name="download-alt" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1185 144V-72H15V144H1185zM1123 89H1010V-18H1123V89zM222 659Q199 687 201.5 722.5T231 784Q244 796 260.5 801.5T293.5 806T326 797.5T354 776L494 623V1063H682V623L820 776Q846 804 881 806T944 784Q959 771 967 754T975 719Q975 686 951 659L586 257z" /> <glyph glyph-name="download-alt-1" unicode="download-alt" horiz-adv-x="1200" d=" M1185 144V-72H15V144H1185zM1123 89H1010V-18H1123V89zM222 659Q199 687 201.5 722.5T231 784Q244 796 260.5 801.5T293.5 806T326 797.5T354 776L494 623V1063H682V623L820 776Q846 804 881 806T944 784Q959 771 967 754T975 719Q975 686 951 659L586 257z" /> + <glyph glyph-name="download-comment" + unicode="" + horiz-adv-x="1200" d=" M105 969C76.333333 969 51.666667 959.66667 31 941C10.333333 922.33333 0 899 0 871L0 375C0 347 10.333333 322.8333300000001 31 302.5C51.666667 282.16667 76.333333 272 105 272L208 272L208 -35L479 272L1131 272C1160.3333 272 1185 282.16667 1205 302.5C1225 322.8333300000001 1235 347 1235 375L1235 871C1235 895.6666700000001 1225 918.16667 1205 938.5C1185 958.83333 1160.3333 969 1131 969L105 969zM532 877.5078100000001L658 877.5078100000001L658 592.50781L759 702.5078100000001C785.66667 733.84114 811.66667 736.5078100000001 837 710.5078100000001C869.66667 683.84114 871.33333 654.50781 842 622.50781L601 354.50781L356 622.50781C346.66667 633.84114 342 648.17448 342 665.50781C342 682.84114 348.66667 697.84114 362 710.5078100000001C390 736.5078100000001 416.33333 733.84114 441 702.5078100000001L532 606.50781L532 877.5078100000001z" /> + <glyph glyph-name="download-comment-1" + unicode="download-comment" + horiz-adv-x="1200" d=" M105 969C76.333333 969 51.666667 959.66667 31 941C10.333333 922.33333 0 899 0 871L0 375C0 347 10.333333 322.8333300000001 31 302.5C51.666667 282.16667 76.333333 272 105 272L208 272L208 -35L479 272L1131 272C1160.3333 272 1185 282.16667 1205 302.5C1225 322.8333300000001 1235 347 1235 375L1235 871C1235 895.6666700000001 1225 918.16667 1205 938.5C1185 958.83333 1160.3333 969 1131 969L105 969zM532 877.5078100000001L658 877.5078100000001L658 592.50781L759 702.5078100000001C785.66667 733.84114 811.66667 736.5078100000001 837 710.5078100000001C869.66667 683.84114 871.33333 654.50781 842 622.50781L601 354.50781L356 622.50781C346.66667 633.84114 342 648.17448 342 665.50781C342 682.84114 348.66667 697.84114 362 710.5078100000001C390 736.5078100000001 416.33333 733.84114 441 702.5078100000001L532 606.50781L532 877.5078100000001z" /> <glyph glyph-name="download" - unicode="" + unicode="" horiz-adv-x="1200" d=" M602 174L357 442Q343 459 343 485T363 530Q405 569 442 522L533 426V697H659V412L760 522Q800 569 838 530Q887 490 843 442zM943 138Q1088 281 1088 480T944 822T602.5 965T261 822T117 480T261 138T602.5 -5T943 138zM174 54Q0 234 0 479.5T178.5 902.5T601.5 1080T1024 902.5T1202 479.5T1024 57T601.5 -120T174 54z" /> <glyph glyph-name="download-1" unicode="download" horiz-adv-x="1200" d=" M602 174L357 442Q343 459 343 485T363 530Q405 569 442 522L533 426V697H659V412L760 522Q800 569 838 530Q887 490 843 442zM943 138Q1088 281 1088 480T944 822T602.5 965T261 822T117 480T261 138T602.5 -5T943 138zM174 54Q0 234 0 479.5T178.5 902.5T601.5 1080T1024 902.5T1202 479.5T1024 57T601.5 -120T174 54z" /> <glyph glyph-name="dropper" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1148 1040V1040L1154 1034Q1204 986 1199.5 912.5T1140 797L987 645L1041 591Q1059 572 1056 545T1035 499Q1015 474 982.5 468T929 488L873 544L301 -28Q271 -64 225.5 -77.5T136 -77L93 -120L0 -27L44 16Q31 54 39 96T77 166Q80 169 664 754L612 805Q588 819 587 848.5T604 898Q622 923 652 932.5T707 925L765 867L916 1019Q956 1073 1028 1079.5T1148 1040zM716 701L609 594Q557 541 394 380T147 127Q145 121 145 116Q145 104 153.5 95.5T174 87Q179 87 184 88L490 394L491 396V395Q497 401 506 406T525 414T543 417Q556 417 572 410.5T597 394Q602 389 607 382L821 596z" /> <glyph glyph-name="dropper-1" unicode="dropper" horiz-adv-x="1200" d=" M1148 1040V1040L1154 1034Q1204 986 1199.5 912.5T1140 797L987 645L1041 591Q1059 572 1056 545T1035 499Q1015 474 982.5 468T929 488L873 544L301 -28Q271 -64 225.5 -77.5T136 -77L93 -120L0 -27L44 16Q31 54 39 96T77 166Q80 169 664 754L612 805Q588 819 587 848.5T604 898Q622 923 652 932.5T707 925L765 867L916 1019Q956 1073 1028 1079.5T1148 1040zM716 701L609 594Q557 541 394 380T147 127Q145 121 145 116Q145 104 153.5 95.5T174 87Q179 87 184 88L490 394L491 396V395Q497 401 506 406T525 414T543 417Q556 417 572 410.5T597 394Q602 389 607 382L821 596z" /> <glyph glyph-name="duplicate" - unicode="" + unicode="" horiz-adv-x="1200" d=" M259 193Q265 158 281 128.5T321.5 78T378 45T446 33H853V13Q853 -27 828 -57T764 -97Q758 -99 751.5 -99.5T739 -100H214Q169 -100 138 -72.5T101 0V12V418V820Q101 860 126.5 891T190 930Q195 931 202 931H214H259V623V217V207V201V193zM1083 872Q1091 861 1091 850V215Q1091 174 1066.5 144.5T1003 106Q997 103 990 102.5T977 102H453Q408 102 377 129.5T340 203V213V620V1022Q340 1063 365 1093.5T429 1131Q435 1133 440 1133H454H804Q811 1133 815.5 1131T825 1125zM1064 840L802 1094V1072V950Q802 928 810.5 908T834 873T869 849T911 840H1047H1064z" /> <glyph glyph-name="duplicate-1" unicode="duplicate" horiz-adv-x="1200" d=" M259 193Q265 158 281 128.5T321.5 78T378 45T446 33H853V13Q853 -27 828 -57T764 -97Q758 -99 751.5 -99.5T739 -100H214Q169 -100 138 -72.5T101 0V12V418V820Q101 860 126.5 891T190 930Q195 931 202 931H214H259V623V217V207V201V193zM1083 872Q1091 861 1091 850V215Q1091 174 1066.5 144.5T1003 106Q997 103 990 102.5T977 102H453Q408 102 377 129.5T340 203V213V620V1022Q340 1063 365 1093.5T429 1131Q435 1133 440 1133H454H804Q811 1133 815.5 1131T825 1125zM1064 840L802 1094V1072V950Q802 928 810.5 908T834 873T869 849T911 840H1047H1064z" /> <glyph glyph-name="edit" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1208 874L684 354L200 108L456 605L970 1117L1023 1061L1181 903zM646 422L656 436Q631 492 582 487Q585 552 531 564L516 554L410 346Q425 340 428.5 336T436 328T441 319zM780 -66H239Q138 -66 69 3.5T0 173V714Q0 814 69 883.5T239 953H592V874H239Q172 874 124.5 828.5T77 714V173Q77 104 124.5 58T239 12H780Q848 12 894.5 58T941 173V489H1021V173Q1021 73 951 3.5T780 -66z" /> <glyph glyph-name="edit-1" unicode="edit" horiz-adv-x="1200" d=" M1208 874L684 354L200 108L456 605L970 1117L1023 1061L1181 903zM646 422L656 436Q631 492 582 487Q585 552 531 564L516 554L410 346Q425 340 428.5 336T436 328T441 319zM780 -66H239Q138 -66 69 3.5T0 173V714Q0 814 69 883.5T239 953H592V874H239Q172 874 124.5 828.5T77 714V173Q77 104 124.5 58T239 12H780Q848 12 894.5 58T941 173V489H1021V173Q1021 73 951 3.5T780 -66z" /> <glyph glyph-name="envelope" - unicode="" + unicode="" horiz-adv-x="1200" d=" M862 438Q860 413 880 386L1142 128H589H210H79L339 381Q375 417 350 455Q336 476 308.5 479T262 465L0 209V574V700V835L570 363Q601 329 646 358L1220 826V213L961 465Q935 490 902 482Q872 474 862 438zM606 476L84 910H260H1142z" /> <glyph glyph-name="envelope-1" unicode="envelope" horiz-adv-x="1200" d=" M862 438Q860 413 880 386L1142 128H589H210H79L339 381Q375 417 350 455Q336 476 308.5 479T262 465L0 209V574V700V835L570 363Q601 329 646 358L1220 826V213L961 465Q935 490 902 482Q872 474 862 438zM606 476L84 910H260H1142z" /> <glyph glyph-name="exclamation-mark" - unicode="" + unicode="" horiz-adv-x="1200" d=" M683 -87Q667 -103 645.5 -111.5T601 -120T555.5 -111.5T517 -87Q484 -54 484 -1.5T515 86Q533 105 555.5 114.5T601 124T645.5 114.5T683 86Q716 53 716 -1Q716 -54 683 -87zM496 1022Q496 1080 561 1080H641Q702 1080 702 1022V376Q702 318 641 318H561Q496 318 496 376V1022z" /> <glyph glyph-name="exclamation-mark-1" unicode="exclamation-mark" horiz-adv-x="1200" d=" M683 -87Q667 -103 645.5 -111.5T601 -120T555.5 -111.5T517 -87Q484 -54 484 -1.5T515 86Q533 105 555.5 114.5T601 124T645.5 114.5T683 86Q716 53 716 -1Q716 -54 683 -87zM496 1022Q496 1080 561 1080H641Q702 1080 702 1022V376Q702 318 641 318H561Q496 318 496 376V1022z" /> <glyph glyph-name="exclamation-sign" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1005 898Q1174 729 1174 493T1004.5 88T599.5 -81T194.5 88T25 493T194.5 898.5T599.5 1068T1005 898zM523 338Q523 288 571 288H631Q675 288 675 338V886Q675 935 631 935H571Q523 935 523 886V338zM661 75Q685 100 685 139T661 202Q636 229 599.5 229T537 202Q514 178 514 139T539 75Q563 51 599.5 51T661 75z" /> <glyph glyph-name="exclamation-sign-1" unicode="exclamation-sign" horiz-adv-x="1200" d=" M1005 898Q1174 729 1174 493T1004.5 88T599.5 -81T194.5 88T25 493T194.5 898.5T599.5 1068T1005 898zM523 338Q523 288 571 288H631Q675 288 675 338V886Q675 935 631 935H571Q523 935 523 886V338zM661 75Q685 100 685 139T661 202Q636 229 599.5 229T537 202Q514 178 514 139T539 75Q563 51 599.5 51T661 75z" /> <glyph glyph-name="expand" - unicode="" + unicode="" horiz-adv-x="1200" d=" M475 671L807 475L475 282V671zM1144 766V186Q1144 78 1070 4.5T888 -69H310Q204 -69 130 4.5T56 186V766Q56 870 130 945T310 1020H888Q996 1020 1070 945T1144 766zM140 186Q140 115 189 65.5T310 16H888Q962 16 1010.5 65.5T1059 186V766Q1059 837 1010.5 886.5T888 936H310Q238 936 189 886.5T140 766V186z" /> <glyph glyph-name="expand-1" unicode="expand" horiz-adv-x="1200" d=" M475 671L807 475L475 282V671zM1144 766V186Q1144 78 1070 4.5T888 -69H310Q204 -69 130 4.5T56 186V766Q56 870 130 945T310 1020H888Q996 1020 1070 945T1144 766zM140 186Q140 115 189 65.5T310 16H888Q962 16 1010.5 65.5T1059 186V766Q1059 837 1010.5 886.5T888 936H310Q238 936 189 886.5T140 766V186z" /> <glyph glyph-name="export" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1185 144V-72H15V144H1185zM1123 89H1010V-18H1123V89zM1152 1007L992 520Q983 489 954 472Q940 462 922.5 457.5T888 457Q871 460 858.5 469T838.5 491T829.5 519.5T833 551L891 729L392 401L305 538L818 875L609 893Q575 897 556 922.5T543 982Q547 998 556.5 1011.5T579.5 1035T609 1050T642 1053zM42 366L220 481L311 345L134 228z" /> <glyph glyph-name="export-1" unicode="export" horiz-adv-x="1200" d=" M1185 144V-72H15V144H1185zM1123 89H1010V-18H1123V89zM1152 1007L992 520Q983 489 954 472Q940 462 922.5 457.5T888 457Q871 460 858.5 469T838.5 491T829.5 519.5T833 551L891 729L392 401L305 538L818 875L609 893Q575 897 556 922.5T543 982Q547 998 556.5 1011.5T579.5 1035T609 1050T642 1053zM42 366L220 481L311 345L134 228z" /> <glyph glyph-name="ext-empty" - unicode="" + unicode="" horiz-adv-x="1200" d=" M446 1030H916L1178 712V121Q1178 42 1122 -14T984 -70H446Q369 -70 311.5 -14T254 117H22V632H254V838Q254 918 311 974T446 1030zM446 936Q406 936 379 906.5T352 838V632H1006V117H352Q352 82 379 53T446 24H984Q1024 24 1052.5 53T1082 121V678V682H938Q901 682 877 707T852 768V936H446z" /> <glyph glyph-name="ext-empty-1" unicode="ext-empty" horiz-adv-x="1200" d=" M446 1030H916L1178 712V121Q1178 42 1122 -14T984 -70H446Q369 -70 311.5 -14T254 117H22V632H254V838Q254 918 311 974T446 1030zM446 936Q406 936 379 906.5T352 838V632H1006V117H352Q352 82 379 53T446 24H984Q1024 24 1052.5 53T1082 121V678V682H938Q901 682 877 707T852 768V936H446z" /> <glyph glyph-name="ext-html" - unicode="" + unicode="" horiz-adv-x="1200" d=" M446 1030H916L1178 712V121Q1178 42 1122 -14T984 -70H446Q369 -70 311.5 -14T254 117H22V632H254V838Q254 918 311 974T446 1030zM446 936Q406 936 379 906.5T352 838V632H1006V117H352Q352 82 379 53T446 24H984Q1024 24 1052.5 53T1082 121V678V682H938Q901 682 877 707T852 768V936H446zM96 486V263H141V360H230V263H275V486H230V398H141V486H96zM306 486V449H372V263H417V449H484V486H306zM512 486V263H554V439L598 263H642L686 439V263H728V486H660L620 334L579 486H512zM775 485V263H932V300H820V485H775z" /> <glyph glyph-name="ext-html-1" unicode="ext-html" horiz-adv-x="1200" d=" M446 1030H916L1178 712V121Q1178 42 1122 -14T984 -70H446Q369 -70 311.5 -14T254 117H22V632H254V838Q254 918 311 974T446 1030zM446 936Q406 936 379 906.5T352 838V632H1006V117H352Q352 82 379 53T446 24H984Q1024 24 1052.5 53T1082 121V678V682H938Q901 682 877 707T852 768V936H446zM96 486V263H141V360H230V263H275V486H230V398H141V486H96zM306 486V449H372V263H417V449H484V486H306zM512 486V263H554V439L598 263H642L686 439V263H728V486H660L620 334L579 486H512zM775 485V263H932V300H820V485H775z" /> <glyph glyph-name="ext-json" - unicode="" + unicode="" horiz-adv-x="1200" d=" M446 1030H916L1178 712V121Q1178 42 1122 -14T984 -70H446Q369 -70 311.5 -14T254 117H22V632H254V838Q254 918 311 974T446 1030zM446 936Q406 936 379 906.5T352 838V632H1006V117H352Q352 82 379 53T446 24H984Q1024 24 1052.5 53T1082 121V678V682H938Q901 682 877 707T852 768V936H446zM373 490Q347 490 329 482.5T301 460T291 428Q291 401 312 383Q327 370 363 361Q391 354 399 351Q411 347 415.5 341.5T420 328Q420 315 409 306T376 297Q355 297 343 307.5T327 340L283 335Q288 298 310.5 278.5T376 259Q405 259 424.5 267T454.5 292T465 328Q465 349 456 363.5T431.5 386.5T383 402.5T341 417Q334 423 334 431Q334 440 342 445Q353 453 373 453Q392 453 401.5 445.5T414 421L459 423Q458 453 436.5 471.5T373 490zM603 490Q575 490 554 482Q539 475 525.5 461.5T505 431Q494 407 494 373Q494 320 523.5 289.5T603 259T682.5 289.5T712 374Q712 429 682 459.5T603 490zM201 487V342Q201 315 195 306T174 297T151 309Q146 317 146 337L103 332Q103 296 121 277.5T172 259Q200 259 217.5 270.5T241 302Q246 317 246 345V487H201zM747 487V263H789V409L880 263H925V487H883V337L791 487H747zM603 452Q631 452 648 433T665 375T647.5 316.5T603 297T558.5 317T541 375T558 432.5T603 452z" /> <glyph glyph-name="ext-json-1" unicode="ext-json" horiz-adv-x="1200" d=" M446 1030H916L1178 712V121Q1178 42 1122 -14T984 -70H446Q369 -70 311.5 -14T254 117H22V632H254V838Q254 918 311 974T446 1030zM446 936Q406 936 379 906.5T352 838V632H1006V117H352Q352 82 379 53T446 24H984Q1024 24 1052.5 53T1082 121V678V682H938Q901 682 877 707T852 768V936H446zM373 490Q347 490 329 482.5T301 460T291 428Q291 401 312 383Q327 370 363 361Q391 354 399 351Q411 347 415.5 341.5T420 328Q420 315 409 306T376 297Q355 297 343 307.5T327 340L283 335Q288 298 310.5 278.5T376 259Q405 259 424.5 267T454.5 292T465 328Q465 349 456 363.5T431.5 386.5T383 402.5T341 417Q334 423 334 431Q334 440 342 445Q353 453 373 453Q392 453 401.5 445.5T414 421L459 423Q458 453 436.5 471.5T373 490zM603 490Q575 490 554 482Q539 475 525.5 461.5T505 431Q494 407 494 373Q494 320 523.5 289.5T603 259T682.5 289.5T712 374Q712 429 682 459.5T603 490zM201 487V342Q201 315 195 306T174 297T151 309Q146 317 146 337L103 332Q103 296 121 277.5T172 259Q200 259 217.5 270.5T241 302Q246 317 246 345V487H201zM747 487V263H789V409L880 263H925V487H883V337L791 487H747zM603 452Q631 452 648 433T665 375T647.5 316.5T603 297T558.5 317T541 375T558 432.5T603 452z" /> <glyph glyph-name="ext-pdf" - unicode="" + unicode="" horiz-adv-x="1200" d=" M446 1030H916L1178 712V121Q1178 42 1122 -14T984 -70H446Q369 -70 311.5 -14T254 117H22V632H254V838Q254 918 311 974T446 1030zM446 936Q406 936 379 906.5T352 838V632H1006V117H352Q352 82 379 53T446 24H984Q1024 24 1052.5 53T1082 121V678V682H938Q901 682 877 707T852 768V936H446zM220 486V263H265V347H294Q325 347 341 350Q353 353 364.5 361T383.5 383T391 418Q391 444 378 461T346 483Q333 486 292 486H220zM428 486V263H513Q539 263 553 267Q574 274 585 285Q601 300 609 325Q616 345 616 372Q616 404 608.5 425.5T587 461.5T554 482Q539 486 511 486H428zM655 486V263H700V358H794V396H700V449H808V486H655zM265 449H287Q311 449 319 447Q330 445 337 437T344 417Q344 407 339 399.5T325 388.5T289 385H265V449zM474 449H494Q522 449 531 446Q544 444 552 436T564.5 414T569 374T564.5 333T553 311.5T535 302Q526 300 507 300H474V449z" /> <glyph glyph-name="ext-pdf-1" unicode="ext-pdf" horiz-adv-x="1200" d=" M446 1030H916L1178 712V121Q1178 42 1122 -14T984 -70H446Q369 -70 311.5 -14T254 117H22V632H254V838Q254 918 311 974T446 1030zM446 936Q406 936 379 906.5T352 838V632H1006V117H352Q352 82 379 53T446 24H984Q1024 24 1052.5 53T1082 121V678V682H938Q901 682 877 707T852 768V936H446zM220 486V263H265V347H294Q325 347 341 350Q353 353 364.5 361T383.5 383T391 418Q391 444 378 461T346 483Q333 486 292 486H220zM428 486V263H513Q539 263 553 267Q574 274 585 285Q601 300 609 325Q616 345 616 372Q616 404 608.5 425.5T587 461.5T554 482Q539 486 511 486H428zM655 486V263H700V358H794V396H700V449H808V486H655zM265 449H287Q311 449 319 447Q330 445 337 437T344 417Q344 407 339 399.5T325 388.5T289 385H265V449zM474 449H494Q522 449 531 446Q544 444 552 436T564.5 414T569 374T564.5 333T553 311.5T535 302Q526 300 507 300H474V449z" /> <glyph glyph-name="ext-txt" - unicode="" + unicode="" horiz-adv-x="1200" d=" M446 1030H916L1178 712V121Q1178 42 1122 -14T984 -70H446Q369 -70 311.5 -14T254 117H22V632H254V838Q254 918 311 974T446 1030zM446 936Q406 936 379 906.5T352 838V632H1006V117H352Q352 82 379 53T446 24H984Q1024 24 1052.5 53T1082 121V678V682H938Q901 682 877 707T852 768V936H446zM225 486V449H292V263H337V449H403V486H225zM416 486L486 379L409 263H463L513 340L563 263H617L541 378L610 486H558L514 415L469 486H416zM625 486V449H691V263H737V449H803V486H625z" /> <glyph glyph-name="ext-txt-1" unicode="ext-txt" horiz-adv-x="1200" d=" M446 1030H916L1178 712V121Q1178 42 1122 -14T984 -70H446Q369 -70 311.5 -14T254 117H22V632H254V838Q254 918 311 974T446 1030zM446 936Q406 936 379 906.5T352 838V632H1006V117H352Q352 82 379 53T446 24H984Q1024 24 1052.5 53T1082 121V678V682H938Q901 682 877 707T852 768V936H446zM225 486V449H292V263H337V449H403V486H225zM416 486L486 379L409 263H463L513 340L563 263H617L541 378L610 486H558L514 415L469 486H416zM625 486V449H691V263H737V449H803V486H625z" /> <glyph glyph-name="ext-wmc" - unicode="" + unicode="" horiz-adv-x="1200" d=" M446 1030C394 1030 349 1011.33333 311 974C273 936.66667 254 891.3333299999999 254 838L254 632L22 632L22 117L254 117C254 67 273.16667 23.3333 311.5 -14C349.83333 -51.3333 394.66667 -70 446 -70L984 -70C1038.6667 -70 1084.6667 -51.3333 1122 -14C1159.3333 23.3333 1178 68.3333 1178 121L1178 712L916 1030L446 1030zM446 936L852 936L852 768C852.66667 744 861 723.6666700000001 877 707C893 690.3333299999999 913.33333 682 938 682L1082 682L1082 678L1082 121C1081.3333 95 1071.5 72.3333 1052.5 53C1033.5 33.6667 1010.6667 24 984 24L446 24C419.33333 24 397 33.6667 379 53C361 72.3333 352 93.6667 352 117L1006 117L1006 632L352 632L352 838C352 864 361 886.8333299999999 379 906.5C397 926.16667 419.33333 936 446 936zM822.22266 504.83008C851.41106 504.83008 875.12048 496.2037800000001 893.34961 478.95117C904.20034 468.75152 912.33834 454.10309 917.76367 435.00586L870.07422 423.6132800000001C867.25302 435.98307 861.34005 445.7487 852.33398 452.91016C843.43638 460.0716200000001 832.58505 463.65234 819.78125 463.65234C802.09465 463.65234 787.71812 457.3046900000001 776.65039 444.60938C765.69119 431.91405 760.21094 411.3526500000001 760.21094 382.92383C760.21094 352.75889 765.63566 331.2745200000001 776.48633 318.4707C787.33706 305.66688 801.44355 299.2636700000001 818.80469 299.2636700000001C831.60849 299.2636700000001 842.62264 303.33268 851.8457 311.4707C861.06884 319.6087300000001 867.68644 332.4132 871.70117 349.88281L918.41406 335.07227C911.2526 309.03059 899.31749 289.6621 882.60742 276.9668000000001C866.00589 264.37999 844.90064 258.0859400000001 819.29297 258.0859400000001C787.60897 258.0859400000001 761.5673 268.88173 741.16797 290.47461C720.7687 312.1760000000001 710.56836 341.7983900000001 710.56836 379.3418000000001C710.56836 419.05534 720.82228 449.87261 741.33008 471.79102C761.83788 493.81793 788.80252 504.83008 822.22266 504.83008zM102.16992 500.76172L151.48633 500.76172L187.45703 336.86133L231.07617 500.76172L288.36914 500.76172L330.19727 334.0957L366.81836 500.76172L415.32227 500.76172L357.37891 262.1543000000001L306.27148 262.1543000000001L258.74609 440.54102L211.38281 262.1543000000001L159.13672 262.1543000000001L102.16992 500.76172zM440.3867200000001 500.76172L512.49023 500.76172L555.7832 338.00195L598.58984 500.76172L670.85547 500.76172L670.85547 262.1543000000001L626.0957 262.1543000000001L626.0957 449.98047L578.73242 262.1543000000001L532.3457 262.1543000000001L485.14648 449.98047L485.14648 262.1543000000001L440.3867200000001 262.1543000000001L440.3867200000001 500.76172z" /> <glyph glyph-name="ext-wmc-1" unicode="ext-wmc" horiz-adv-x="1200" d=" M446 1030C394 1030 349 1011.33333 311 974C273 936.66667 254 891.3333299999999 254 838L254 632L22 632L22 117L254 117C254 67 273.16667 23.3333 311.5 -14C349.83333 -51.3333 394.66667 -70 446 -70L984 -70C1038.6667 -70 1084.6667 -51.3333 1122 -14C1159.3333 23.3333 1178 68.3333 1178 121L1178 712L916 1030L446 1030zM446 936L852 936L852 768C852.66667 744 861 723.6666700000001 877 707C893 690.3333299999999 913.33333 682 938 682L1082 682L1082 678L1082 121C1081.3333 95 1071.5 72.3333 1052.5 53C1033.5 33.6667 1010.6667 24 984 24L446 24C419.33333 24 397 33.6667 379 53C361 72.3333 352 93.6667 352 117L1006 117L1006 632L352 632L352 838C352 864 361 886.8333299999999 379 906.5C397 926.16667 419.33333 936 446 936zM822.22266 504.83008C851.41106 504.83008 875.12048 496.2037800000001 893.34961 478.95117C904.20034 468.75152 912.33834 454.10309 917.76367 435.00586L870.07422 423.6132800000001C867.25302 435.98307 861.34005 445.7487 852.33398 452.91016C843.43638 460.0716200000001 832.58505 463.65234 819.78125 463.65234C802.09465 463.65234 787.71812 457.3046900000001 776.65039 444.60938C765.69119 431.91405 760.21094 411.3526500000001 760.21094 382.92383C760.21094 352.75889 765.63566 331.2745200000001 776.48633 318.4707C787.33706 305.66688 801.44355 299.2636700000001 818.80469 299.2636700000001C831.60849 299.2636700000001 842.62264 303.33268 851.8457 311.4707C861.06884 319.6087300000001 867.68644 332.4132 871.70117 349.88281L918.41406 335.07227C911.2526 309.03059 899.31749 289.6621 882.60742 276.9668000000001C866.00589 264.37999 844.90064 258.0859400000001 819.29297 258.0859400000001C787.60897 258.0859400000001 761.5673 268.88173 741.16797 290.47461C720.7687 312.1760000000001 710.56836 341.7983900000001 710.56836 379.3418000000001C710.56836 419.05534 720.82228 449.87261 741.33008 471.79102C761.83788 493.81793 788.80252 504.83008 822.22266 504.83008zM102.16992 500.76172L151.48633 500.76172L187.45703 336.86133L231.07617 500.76172L288.36914 500.76172L330.19727 334.0957L366.81836 500.76172L415.32227 500.76172L357.37891 262.1543000000001L306.27148 262.1543000000001L258.74609 440.54102L211.38281 262.1543000000001L159.13672 262.1543000000001L102.16992 500.76172zM440.3867200000001 500.76172L512.49023 500.76172L555.7832 338.00195L598.58984 500.76172L670.85547 500.76172L670.85547 262.1543000000001L626.0957 262.1543000000001L626.0957 449.98047L578.73242 262.1543000000001L532.3457 262.1543000000001L485.14648 449.98047L485.14648 262.1543000000001L440.3867200000001 262.1543000000001L440.3867200000001 500.76172z" /> <glyph glyph-name="eye-close" - unicode="" + unicode="" horiz-adv-x="1200" d=" M553 298L416 159L163 -94L69 -1L299 231L1211 1142L1306 1051L918 662zM1114 794Q1268 669 1373 527L1285 415Q1198 311 1027.5 201.5T687 92Q581 92 457 140L596 279Q644 258 687 258Q799 258 878 336.5T957 527Q957 571 936 618zM263 258Q106 382 0 527L89 639Q176 746 346 854.5T687 963Q799 963 922 911L782 777Q736 798 687 798Q576 798 496 718.5T416 527Q416 482 437 432zM866 544V523Q866 449 813.5 397T687 345H669zM507 500V523Q507 599 560 653T687 707Q691 707 699.5 705T710 703z" /> <glyph glyph-name="eye-close-1" unicode="eye-close" horiz-adv-x="1200" d=" M553 298L416 159L163 -94L69 -1L299 231L1211 1142L1306 1051L918 662zM1114 794Q1268 669 1373 527L1285 415Q1198 311 1027.5 201.5T687 92Q581 92 457 140L596 279Q644 258 687 258Q799 258 878 336.5T957 527Q957 571 936 618zM263 258Q106 382 0 527L89 639Q176 746 346 854.5T687 963Q799 963 922 911L782 777Q736 798 687 798Q576 798 496 718.5T416 527Q416 482 437 432zM866 544V523Q866 449 813.5 397T687 345H669zM507 500V523Q507 599 560 653T687 707Q691 707 699.5 705T710 703z" /> <glyph glyph-name="eye-open" - unicode="" + unicode="" horiz-adv-x="1200" d=" M687 964Q795 964 904.5 917T1090 811.5T1239.5 677.5T1336 573.5T1373 528L1285 416Q1198 312 1027.5 202.5T687 93Q581 93 470 139.5T283.5 244.5T134.5 378.5T38 482.5T0 528L89 640Q176 744 346 854T687 964zM878 337Q957 416 957 528T878 719.5T687.5 799T496 719.5T416 528T496 337T687.5 258T878 337zM761 528Q835 528 852 596Q866 569 866 528Q866 454 813.5 401.5T687 349T560 401.5T507 528T560 655T687 708H715Q670 674 670 623Q670 583 697 555.5T761 528z" /> <glyph glyph-name="eye-open-1" unicode="eye-open" horiz-adv-x="1200" d=" M687 964Q795 964 904.5 917T1090 811.5T1239.5 677.5T1336 573.5T1373 528L1285 416Q1198 312 1027.5 202.5T687 93Q581 93 470 139.5T283.5 244.5T134.5 378.5T38 482.5T0 528L89 640Q176 744 346 854T687 964zM878 337Q957 416 957 528T878 719.5T687.5 799T496 719.5T416 528T496 337T687.5 258T878 337zM761 528Q835 528 852 596Q866 569 866 528Q866 454 813.5 401.5T687 349T560 401.5T507 528T560 655T687 708H715Q670 674 670 623Q670 583 697 555.5T761 528z" /> <glyph glyph-name="fast-backward" - unicode="" + unicode="" horiz-adv-x="1200" d=" M722 263Q785 212 730 158Q664 97 605 155L196 466L605 778Q625 798 665 798T730 774Q785 720 722 669L460 466zM1207 263Q1273 212 1209 158Q1150 97 1085 155L678 466L1085 778Q1109 798 1148.5 798T1209 774Q1273 720 1207 669L945 466zM58 875Q80 875 98 857T116 819V113Q116 90 98 73.5T58 57Q0 57 0 113V819Q0 875 58 875z" /> <glyph glyph-name="fast-backward-1" unicode="fast-backward" horiz-adv-x="1200" d=" M722 263Q785 212 730 158Q664 97 605 155L196 466L605 778Q625 798 665 798T730 774Q785 720 722 669L460 466zM1207 263Q1273 212 1209 158Q1150 97 1085 155L678 466L1085 778Q1109 798 1148.5 798T1209 774Q1273 720 1207 669L945 466zM58 875Q80 875 98 857T116 819V113Q116 90 98 73.5T58 57Q0 57 0 113V819Q0 875 58 875z" /> <glyph glyph-name="fast-forward" - unicode="" + unicode="" horiz-adv-x="1200" d=" M519 671Q456 722 511 776Q577 837 636 779L1045 468L636 156Q616 136 576 136T511 160Q456 214 519 265L781 468zM34 671Q-32 722 32 776Q91 837 156 779L563 468L156 156Q132 136 92.5 136T32 160Q-32 214 34 265L296 468zM1183 59Q1161 59 1143 77T1125 115V821Q1125 844 1143 860.5T1183 877Q1241 877 1241 821V115Q1241 59 1183 59z" /> <glyph glyph-name="fast-forward-1" unicode="fast-forward" horiz-adv-x="1200" d=" M519 671Q456 722 511 776Q577 837 636 779L1045 468L636 156Q616 136 576 136T511 160Q456 214 519 265L781 468zM34 671Q-32 722 32 776Q91 837 156 779L563 468L156 156Q132 136 92.5 136T32 160Q-32 214 34 265L296 468zM1183 59Q1161 59 1143 77T1125 115V821Q1125 844 1143 860.5T1183 877Q1241 877 1241 821V115Q1241 59 1183 59z" /> <glyph glyph-name="features-grid-download" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 1080H1200V580V-120H0V580V1080zM62 932V736H1138V932H62zM437 580V-58H1137H1138V230H1137V292H1138V580H1137H437zM62 580V292H375V580H62zM62 230V-58H375V230H62zM785 -1L540 268Q527 284 527 310Q527 337 547 355Q589 394 626 347L716 251V523H843V237L943 347Q984 394 1022 355Q1071 315 1027 268z" /> <glyph glyph-name="features-grid-download-1" unicode="features-grid-download" horiz-adv-x="1200" d=" M0 1080H1200V580V-120H0V580V1080zM62 932V736H1138V932H62zM437 580V-58H1137H1138V230H1137V292H1138V580H1137H437zM62 580V292H375V580H62zM62 230V-58H375V230H62zM785 -1L540 268Q527 284 527 310Q527 337 547 355Q589 394 626 347L716 251V523H843V237L943 347Q984 394 1022 355Q1071 315 1027 268z" /> <glyph glyph-name="features-grid-set" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 1080H1200V580V-120H0V580V1080zM62 932V736H1138V932H62zM437 580V-58H1137V-58H1138V230H1137V292H1138V580H1137V580H437zM62 580V292H375V580H62zM62 230V-58H375V230H62zM1070 292Q1075 262 1070 229Q1070 213 1054 213L1051 215Q1009 215 992 175Q976 135 1009 104Q1020 95 1011 83Q989 59 964 36Q953 27 943 39Q912 71 872 54.5T832 -6Q832 -21 818 -21Q796 -25 787 -25T754 -21Q740 -21 740 -4Q743 39 702 57Q659 74 631 39Q621 30 609 38Q583 64 564 85Q555 98 566 106Q597 136 581 177Q563 219 524 215Q505 215 505 230Q500 262 505 295Q505 309 522 309Q566 309 583 348Q600 388 568 419Q555 428 564 440Q595 473 611 487Q623 496 632 483Q664 452 703.5 468.5T743 529Q743 544 756 544Q787 549 820 544Q835 544 835 527Q832 483 874 466Q917 448 945 483Q955 492 966 485Q992 459 1011 438Q1020 424 1009 417Q978 386 994 346Q1008 308 1053 308Q1070 308 1070 292zM787 166Q827 166 855.5 193.5T884 262Q884 300 855.5 327.5T787 355Q749 355 721.5 327.5T694 262Q694 221 721.5 193.5T787 166z" /> <glyph glyph-name="features-grid-set-1" unicode="features-grid-set" horiz-adv-x="1200" d=" M0 1080H1200V580V-120H0V580V1080zM62 932V736H1138V932H62zM437 580V-58H1137V-58H1138V230H1137V292H1138V580H1137V580H437zM62 580V292H375V580H62zM62 230V-58H375V230H62zM1070 292Q1075 262 1070 229Q1070 213 1054 213L1051 215Q1009 215 992 175Q976 135 1009 104Q1020 95 1011 83Q989 59 964 36Q953 27 943 39Q912 71 872 54.5T832 -6Q832 -21 818 -21Q796 -25 787 -25T754 -21Q740 -21 740 -4Q743 39 702 57Q659 74 631 39Q621 30 609 38Q583 64 564 85Q555 98 566 106Q597 136 581 177Q563 219 524 215Q505 215 505 230Q500 262 505 295Q505 309 522 309Q566 309 583 348Q600 388 568 419Q555 428 564 440Q595 473 611 487Q623 496 632 483Q664 452 703.5 468.5T743 529Q743 544 756 544Q787 549 820 544Q835 544 835 527Q832 483 874 466Q917 448 945 483Q955 492 966 485Q992 459 1011 438Q1020 424 1009 417Q978 386 994 346Q1008 308 1053 308Q1070 308 1070 292zM787 166Q827 166 855.5 193.5T884 262Q884 300 855.5 327.5T787 355Q749 355 721.5 327.5T694 262Q694 221 721.5 193.5T787 166z" /> <glyph glyph-name="features-grid" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 1080H1200V580V-120H0V580V1080zM62 932V736H1138V932H62zM62 580V292H375V580H62zM438 580V292H762V580H438zM825 580V292H1138V580H825zM62 230V-58H375V230H62zM438 230V-58H762V230H438zM825 230V-58H1138V230H825z" /> <glyph glyph-name="features-grid-1" unicode="features-grid" horiz-adv-x="1200" d=" M0 1080H1200V580V-120H0V580V1080zM62 932V736H1138V932H62zM62 580V292H375V580H62zM438 580V292H762V580H438zM825 580V292H1138V580H825zM62 230V-58H375V230H62zM438 230V-58H762V230H438zM825 230V-58H1138V230H825z" /> <glyph glyph-name="file" - unicode="" + unicode="" horiz-adv-x="1200" d=" M984 810Q994 800 994 786V110Q994 66 967.5 34T898 -7Q892 -9 885.5 -9.5T872 -10H313Q264 -10 231.5 19T191 96V109V541V971Q191 1013 218 1046T286 1087Q293 1089 300 1089H314H687Q698 1089 709 1081Q778 1012 846.5 945T984 810zM947 777Q950 777 956 776.5T964 776L686 1048V1025V893Q686 870 695 849T719.5 812T755.5 786.5T800 777Q837 776 873.5 776.5T947 777z" /> <glyph glyph-name="file-1" unicode="file" horiz-adv-x="1200" d=" M984 810Q994 800 994 786V110Q994 66 967.5 34T898 -7Q892 -9 885.5 -9.5T872 -10H313Q264 -10 231.5 19T191 96V109V541V971Q191 1013 218 1046T286 1087Q293 1089 300 1089H314H687Q698 1089 709 1081Q778 1012 846.5 945T984 810zM947 777Q950 777 956 776.5T964 776L686 1048V1025V893Q686 870 695 849T719.5 812T755.5 786.5T800 777Q837 776 873.5 776.5T947 777z" /> <glyph glyph-name="filter-layer" - unicode="" + unicode="" horiz-adv-x="1200" d=" M805.131 1080H1178.133Q1187.3849500000001 1080 1193.6916 1073.2714799999999Q1199.9992200000002 1066.5434500000001 1200.0001900000002 1058.13278Q1200.0001900000002 1037.52678 1178.1329900000003 1037.52728H805.1309900000003Q784.5249900000003 1037.52728 784.5254900000003 1058.13278Q784.5254900000003 1066.5439099999999 790.8321300000003 1073.2714799999999Q797.1397500000004 1079.99951 805.1310300000004 1080zM805.131 996.316H1178.133L1033.895 787.738V663.263L950.6313 579.9993000000001V787.7373zM404 778L939 510L535 88L0 358zM876 360L971 307L557 -120L7 160L84 230L538 4z" /> <glyph glyph-name="filter-layer-1" unicode="filter-layer" horiz-adv-x="1200" d=" M805.131 1080H1178.133Q1187.3849500000001 1080 1193.6916 1073.2714799999999Q1199.9992200000002 1066.5434500000001 1200.0001900000002 1058.13278Q1200.0001900000002 1037.52678 1178.1329900000003 1037.52728H805.1309900000003Q784.5249900000003 1037.52728 784.5254900000003 1058.13278Q784.5254900000003 1066.5439099999999 790.8321300000003 1073.2714799999999Q797.1397500000004 1079.99951 805.1310300000004 1080zM805.131 996.316H1178.133L1033.895 787.738V663.263L950.6313 579.9993000000001V787.7373zM404 778L939 510L535 88L0 358zM876 360L971 307L557 -120L7 160L84 230L538 4z" /> <glyph glyph-name="filter" - unicode="" + unicode="" horiz-adv-x="1200" d=" M155 1037H1042Q1064 1037 1079 1021T1094 985Q1094 936 1042 936H155Q106 936 106 985Q106 1005 121 1021T155 1037zM699 342V46L501 -152V342L155 838H1042z" /> <glyph glyph-name="filter-1" unicode="filter" horiz-adv-x="1200" d=" M155 1037H1042Q1064 1037 1079 1021T1094 985Q1094 936 1042 936H155Q106 936 106 985Q106 1005 121 1021T155 1037zM699 342V46L501 -152V342L155 838H1042z" /> <glyph glyph-name="fit-contain" - unicode="" + unicode="" horiz-adv-x="1200" d=" M34.999994 1008.999994V721C34.999994 708.3333299999999 39.499994 697.5 48.499994 688.5C57.499994 679.5 68.333394 675 80.999994 675C93.666694 675 104.49999 679.5 113.49999 688.5C114.30249 689.3025700000001 115.05609 690.1252999999999 115.78709 690.95703V922.134757H344.05859C348.71949 924.451107 353.03629 927.731387 356.9999900000001 931.999996C365.66659 941.333326 369.9999900000001 952.3333265 369.9999900000001 964.9999935C369.9999900000001 976.999994 365.66659 987.333324 356.9999900000001 995.999994C348.33329 1004.666663 337.9999900000001 1008.999994 325.9999900000001 1008.999994zM877 1008.999994C864.33333 1008.999994 853.33333 1004.666663 844 995.999994C834.66667 987.333324 830 976.999994 830 964.9999935C830 952.3333265 834.66667 941.333326 844 931.999996C848.26847 927.731527 852.88981 924.451097 857.85547 922.134757H1083.7871V694.36718C1085.3262 692.3334500000001 1087.0559 690.37465 1089 688.5C1098.3333 679.5 1109 675 1121 675C1133.6667 675 1144.1667 679.5 1152.5 688.5C1160.8333 697.5 1165 708.3333299999999 1165 721V1008.999994zM203.99999 711V249H996V711zM80.999994 285C68.333394 285 57.499994 280.5 48.499994 271.5C39.499994 262.49997 34.999994 251.3334 34.999994 238V-49H325.9999900000001C337.9999900000001 -49 348.33329 -44.8333 356.9999900000001 -36.49999C365.66659 -28.16669 369.9999900000001 -17.33329 369.9999900000001 -3.99999C369.9999900000001 8.00001 365.66659 18.50001 356.9999900000001 27.50001C352.96279 31.6924100000001 348.55919 34.8953099999999 343.79879 37.13481H115.78709V269.0351500000001C115.05619 269.87196 114.30229 270.6976200000001 113.49999 271.5C104.49999 280.5 93.666694 285 80.999994 285zM1121 285C1109 285 1098.3333 280.5 1089 271.5C1087.0558 269.62522 1085.3263 267.6507000000001 1083.7871 265.58789V37.13481H858.13281C853.06184 34.8953099999999 848.34767 31.6924100000001 844 27.50001C834.66667 18.50001 830 8.00001 830 -3.99999C830 -17.33329 834.66667 -28.16669 844 -36.49999C853.33333 -44.8333 864.33333 -49 877 -49H1165V238C1165 251.3334 1160.8333 262.49997 1152.5 271.5C1144.1667 280.5 1133.6667 285 1121 285z" /> <glyph glyph-name="fit-contain-1" unicode="fit-contain" horiz-adv-x="1200" d=" M34.999994 1008.999994V721C34.999994 708.3333299999999 39.499994 697.5 48.499994 688.5C57.499994 679.5 68.333394 675 80.999994 675C93.666694 675 104.49999 679.5 113.49999 688.5C114.30249 689.3025700000001 115.05609 690.1252999999999 115.78709 690.95703V922.134757H344.05859C348.71949 924.451107 353.03629 927.731387 356.9999900000001 931.999996C365.66659 941.333326 369.9999900000001 952.3333265 369.9999900000001 964.9999935C369.9999900000001 976.999994 365.66659 987.333324 356.9999900000001 995.999994C348.33329 1004.666663 337.9999900000001 1008.999994 325.9999900000001 1008.999994zM877 1008.999994C864.33333 1008.999994 853.33333 1004.666663 844 995.999994C834.66667 987.333324 830 976.999994 830 964.9999935C830 952.3333265 834.66667 941.333326 844 931.999996C848.26847 927.731527 852.88981 924.451097 857.85547 922.134757H1083.7871V694.36718C1085.3262 692.3334500000001 1087.0559 690.37465 1089 688.5C1098.3333 679.5 1109 675 1121 675C1133.6667 675 1144.1667 679.5 1152.5 688.5C1160.8333 697.5 1165 708.3333299999999 1165 721V1008.999994zM203.99999 711V249H996V711zM80.999994 285C68.333394 285 57.499994 280.5 48.499994 271.5C39.499994 262.49997 34.999994 251.3334 34.999994 238V-49H325.9999900000001C337.9999900000001 -49 348.33329 -44.8333 356.9999900000001 -36.49999C365.66659 -28.16669 369.9999900000001 -17.33329 369.9999900000001 -3.99999C369.9999900000001 8.00001 365.66659 18.50001 356.9999900000001 27.50001C352.96279 31.6924100000001 348.55919 34.8953099999999 343.79879 37.13481H115.78709V269.0351500000001C115.05619 269.87196 114.30229 270.6976200000001 113.49999 271.5C104.49999 280.5 93.666694 285 80.999994 285zM1121 285C1109 285 1098.3333 280.5 1089 271.5C1087.0558 269.62522 1085.3263 267.6507000000001 1083.7871 265.58789V37.13481H858.13281C853.06184 34.8953099999999 848.34767 31.6924100000001 844 27.50001C834.66667 18.50001 830 8.00001 830 -3.99999C830 -17.33329 834.66667 -28.16669 844 -36.49999C853.33333 -44.8333 864.33333 -49 877 -49H1165V238C1165 251.3334 1160.8333 262.49997 1152.5 271.5C1144.1667 280.5 1133.6667 285 1121 285z" /> <glyph glyph-name="fit-cover" - unicode="" + unicode="" horiz-adv-x="1200" d=" M35 1009V721C35 708.3333299999999 39.5 697.5 48.5 688.5C57.5 679.5 68.3333 675 81 675C93.6667 675 104.5 679.5 113.5 688.5C114.3026 689.3025700000001 115.0561 690.1252999999999 115.7871 690.95703V922.13477H344.0586C348.7195 924.45112 353.0363 927.73139 357 932C365.6667 941.33333 370 952.33333 370 965C370 977 365.6667 987.33333 357 996C348.3333 1004.66667 338 1009 326 1009zM877 1009C864.3333 1009 853.3333 1004.66667 844 996C834.6667 987.33333 830 977 830 965C830 952.33333 834.6667 941.33333 844 932C848.2685 927.73153 852.8898 924.45111 857.8555 922.13477H1083.7871V694.3671899999999C1085.3262 692.3334600000001 1087.0559 690.37465 1089 688.5C1098.3333 679.5 1109 675 1121 675C1133.6667 675 1144.1667 679.5 1152.5 688.5C1160.8333 697.5 1165 708.3333299999999 1165 721V1009zM192.5 853V107H1007.5V853zM81 285C68.3333 285 57.5 280.5 48.5 271.5C39.5 262.5 35 251.3333300000001 35 238V-49H326C338 -49 348.3333 -44.8333 357 -36.5C365.6667 -28.1667 370 -17.3333 370 -4C370 8 365.6667 18.5 357 27.5C352.9629 31.6923999999999 348.5593 34.8953000000001 343.7988000000001 37.1348H115.7871V269.03516C115.0563 269.8719700000001 114.3024 270.6976200000001 113.5 271.5C104.5 280.5 93.6667 285 81 285zM1121 285C1109 285 1098.3333 280.5 1089 271.5C1087.0558 269.62522 1085.3263 267.6507000000001 1083.7871 265.58789V37.1348H858.1328C853.0618 34.8953000000001 848.3477 31.6923999999999 844 27.5C834.6667 18.5 830 8 830 -4C830 -17.3333 834.6667 -28.1667 844 -36.5C853.3333 -44.8333 864.3333 -49 877 -49H1165V238C1165 251.3333300000001 1160.8333 262.5 1152.5 271.5C1144.1667 280.5 1133.6667 285 1121 285z" /> <glyph glyph-name="fit-cover-1" unicode="fit-cover" horiz-adv-x="1200" d=" M35 1009V721C35 708.3333299999999 39.5 697.5 48.5 688.5C57.5 679.5 68.3333 675 81 675C93.6667 675 104.5 679.5 113.5 688.5C114.3026 689.3025700000001 115.0561 690.1252999999999 115.7871 690.95703V922.13477H344.0586C348.7195 924.45112 353.0363 927.73139 357 932C365.6667 941.33333 370 952.33333 370 965C370 977 365.6667 987.33333 357 996C348.3333 1004.66667 338 1009 326 1009zM877 1009C864.3333 1009 853.3333 1004.66667 844 996C834.6667 987.33333 830 977 830 965C830 952.33333 834.6667 941.33333 844 932C848.2685 927.73153 852.8898 924.45111 857.8555 922.13477H1083.7871V694.3671899999999C1085.3262 692.3334600000001 1087.0559 690.37465 1089 688.5C1098.3333 679.5 1109 675 1121 675C1133.6667 675 1144.1667 679.5 1152.5 688.5C1160.8333 697.5 1165 708.3333299999999 1165 721V1009zM192.5 853V107H1007.5V853zM81 285C68.3333 285 57.5 280.5 48.5 271.5C39.5 262.5 35 251.3333300000001 35 238V-49H326C338 -49 348.3333 -44.8333 357 -36.5C365.6667 -28.1667 370 -17.3333 370 -4C370 8 365.6667 18.5 357 27.5C352.9629 31.6923999999999 348.5593 34.8953000000001 343.7988000000001 37.1348H115.7871V269.03516C115.0563 269.8719700000001 114.3024 270.6976200000001 113.5 271.5C104.5 280.5 93.6667 285 81 285zM1121 285C1109 285 1098.3333 280.5 1089 271.5C1087.0558 269.62522 1085.3263 267.6507000000001 1083.7871 265.58789V37.1348H858.1328C853.0618 34.8953000000001 848.3477 31.6923999999999 844 27.5C834.6667 18.5 830 8 830 -4C830 -17.3333 834.6667 -28.1667 844 -36.5C853.3333 -44.8333 864.3333 -49 877 -49H1165V238C1165 251.3333300000001 1160.8333 262.5 1152.5 271.5C1144.1667 280.5 1133.6667 285 1121 285z" /> <glyph glyph-name="flag" - unicode="" + unicode="" horiz-adv-x="1200" d=" M125 1030H175Q185 1030 192.5 1022.5T200 1005V-70H100V1005Q100 1015 107.5 1022.5T125 1030zM1075 982Q1079 982 1084 980Q1100 974 1100 957V536Q1100 530 1097 524Q1064 465 1030.5 425T965 367T908.5 342.5T856 336Q830 336 798.5 342.5T746 356T686 377Q645 392 623 399.5T565.5 414.5T500 422Q415 422 340 365Q333 360 325 360Q319 360 314 363Q300 370 300 385V823Q322 878 382 921.5T501 968Q524 970 544 968.5T587 961.5T619.5 953T657.5 940T690 929Q731 915 753.5 908T810.5 894T874 887Q977 887 1057 974Q1064 982 1075 982z" /> <glyph glyph-name="flag-1" unicode="flag" horiz-adv-x="1200" d=" M125 1030H175Q185 1030 192.5 1022.5T200 1005V-70H100V1005Q100 1015 107.5 1022.5T125 1030zM1075 982Q1079 982 1084 980Q1100 974 1100 957V536Q1100 530 1097 524Q1064 465 1030.5 425T965 367T908.5 342.5T856 336Q830 336 798.5 342.5T746 356T686 377Q645 392 623 399.5T565.5 414.5T500 422Q415 422 340 365Q333 360 325 360Q319 360 314 363Q300 370 300 385V823Q322 878 382 921.5T501 968Q524 970 544 968.5T587 961.5T619.5 953T657.5 940T690 929Q731 915 753.5 908T810.5 894T874 887Q977 887 1057 974Q1064 982 1075 982z" /> <glyph glyph-name="flash" - unicode="" + unicode="" horiz-adv-x="1200" d=" M794 1112L803 1103Q811 1093 808 1076Q805 1065 729 850.5T651 629L951 630Q975 630 983.5 612.5T978 577Q977 577 844.5 422T577.5 109.5T439 -53Q427 -68 413 -68H404L395 -60Q386 -49 391 -28Q393 -19 433 95.5T512 320L551 430H249Q226 430 218 449Q208 470 224 490Q299 576 433.5 727.5T661.5 984.5T760 1096Q769 1112 785 1112H794z" /> <glyph glyph-name="flash-1" unicode="flash" horiz-adv-x="1200" d=" M794 1112L803 1103Q811 1093 808 1076Q805 1065 729 850.5T651 629L951 630Q975 630 983.5 612.5T978 577Q977 577 844.5 422T577.5 109.5T439 -53Q427 -68 413 -68H404L395 -60Q386 -49 391 -28Q393 -19 433 95.5T512 320L551 430H249Q226 430 218 449Q208 470 224 490Q299 576 433.5 727.5T661.5 984.5T760 1096Q769 1112 785 1112H794z" /> <glyph glyph-name="floppy-disk" - unicode="" + unicode="" horiz-adv-x="1200" d=" M600 -97H70Q15 -97 5 -50V-28Q0 310 0 988Q0 1021 22 1039T70 1057H1002L1014 1055Q1077 996 1193 879Q1196 876 1196 864Q1200 568 1200 -32Q1200 -61 1179.5 -79T1131 -97H600zM920 919Q920 948 901 966.5T855 985H349Q320 985 301 966.5T282 919V701Q282 673 301 655T349 637H855Q882 637 901 655T920 701V919zM1029 521H172V22H1029V521zM803 933V687H683V933H803z" /> <glyph glyph-name="floppy-disk-1" unicode="floppy-disk" horiz-adv-x="1200" d=" M600 -97H70Q15 -97 5 -50V-28Q0 310 0 988Q0 1021 22 1039T70 1057H1002L1014 1055Q1077 996 1193 879Q1196 876 1196 864Q1200 568 1200 -32Q1200 -61 1179.5 -79T1131 -97H600zM920 919Q920 948 901 966.5T855 985H349Q320 985 301 966.5T282 919V701Q282 673 301 655T349 637H855Q882 637 901 655T920 701V919zM1029 521H172V22H1029V521zM803 933V687H683V933H803z" /> <glyph glyph-name="floppy-open" - unicode="" + unicode="" horiz-adv-x="1200" d=" M600 -46H101Q49 -46 40 -2V19Q35 337 35 976Q35 1007 55.5 1024T101 1041H979L990 1039Q1049 983 1158 873Q1161 870 1161 859Q1165 580 1165 15Q1165 -12 1145.5 -29T1100 -46H600zM901 911Q901 938 883.5 955.5T840 973H364Q336 973 318.5 955.5T301 911V706Q301 679 318.5 662T364 645H840Q866 645 883.5 662T901 706V911zM1004 536H197V66H1004V536zM791 924V692H678V924H791zM442 253Q411 279 439 306L600 488L764 306Q774 295 774 278.5T760 253Q731 223 706 253L647 320V114H555V320L497 253Q470 223 442 253z" /> <glyph glyph-name="floppy-open-1" unicode="floppy-open" horiz-adv-x="1200" d=" M600 -46H101Q49 -46 40 -2V19Q35 337 35 976Q35 1007 55.5 1024T101 1041H979L990 1039Q1049 983 1158 873Q1161 870 1161 859Q1165 580 1165 15Q1165 -12 1145.5 -29T1100 -46H600zM901 911Q901 938 883.5 955.5T840 973H364Q336 973 318.5 955.5T301 911V706Q301 679 318.5 662T364 645H840Q866 645 883.5 662T901 706V911zM1004 536H197V66H1004V536zM791 924V692H678V924H791zM442 253Q411 279 439 306L600 488L764 306Q774 295 774 278.5T760 253Q731 223 706 253L647 320V114H555V320L497 253Q470 223 442 253z" /> <glyph glyph-name="floppy-remove" - unicode="" + unicode="" horiz-adv-x="1200" d=" M600 -45H101Q49 -45 40 -1V20Q35 338 35 977Q35 1008 55.5 1025T101 1042H979L990 1040Q1049 984 1158 874Q1161 871 1161 860Q1165 581 1165 16Q1165 -11 1145.5 -28T1100 -45H600zM901 912Q901 939 883.5 956.5T840 974H364Q336 974 318.5 956.5T301 912V707Q301 680 318.5 663T364 646H840Q866 646 883.5 663T901 707V912zM1004 537H197V67H1004V537zM791 925V693H678V925H791zM777 198Q809 173 781 142Q753 112 725 140L600 251L476 140Q466 129 450 129Q432 129 423 142Q395 170 425 198L541 307L425 409Q395 439 423 465Q448 498 476 467L600 358L725 467Q734 479 750 479Q770 479 781 465Q806 439 777 409L659 307z" /> <glyph glyph-name="floppy-remove-1" unicode="floppy-remove" horiz-adv-x="1200" d=" M600 -45H101Q49 -45 40 -1V20Q35 338 35 977Q35 1008 55.5 1025T101 1042H979L990 1040Q1049 984 1158 874Q1161 871 1161 860Q1165 581 1165 16Q1165 -11 1145.5 -28T1100 -45H600zM901 912Q901 939 883.5 956.5T840 974H364Q336 974 318.5 956.5T301 912V707Q301 680 318.5 663T364 646H840Q866 646 883.5 663T901 707V912zM1004 537H197V67H1004V537zM791 925V693H678V925H791zM777 198Q809 173 781 142Q753 112 725 140L600 251L476 140Q466 129 450 129Q432 129 423 142Q395 170 425 198L541 307L425 409Q395 439 423 465Q448 498 476 467L600 358L725 467Q734 479 750 479Q770 479 781 465Q806 439 777 409L659 307z" /> <glyph glyph-name="floppy-save" - unicode="" + unicode="" horiz-adv-x="1200" d=" M600 -43H101Q49 -43 40 1V22Q35 340 35 979Q35 1010 55.5 1027T101 1044H979L990 1042Q1049 986 1158 876Q1161 873 1161 862Q1165 583 1165 18Q1165 -9 1145.5 -26T1100 -43H600zM901 914Q901 941 883.5 958.5T840 976H364Q336 976 318.5 958.5T301 914V709Q301 682 318.5 665T364 648H840Q866 648 883.5 665T901 709V914zM1004 539H197V69H1004V539zM791 927V695H678V927H791zM760 347Q791 325 764 292L600 114L439 292Q428 306 428 318Q428 337 442 347Q470 376 497 343L555 282V483H647V282L706 343Q731 376 760 347z" /> <glyph glyph-name="floppy-save-1" unicode="floppy-save" horiz-adv-x="1200" d=" M600 -43H101Q49 -43 40 1V22Q35 340 35 979Q35 1010 55.5 1027T101 1044H979L990 1042Q1049 986 1158 876Q1161 873 1161 862Q1165 583 1165 18Q1165 -9 1145.5 -26T1100 -43H600zM901 914Q901 941 883.5 958.5T840 976H364Q336 976 318.5 958.5T301 914V709Q301 682 318.5 665T364 648H840Q866 648 883.5 665T901 709V914zM1004 539H197V69H1004V539zM791 927V695H678V927H791zM760 347Q791 325 764 292L600 114L439 292Q428 306 428 318Q428 337 442 347Q470 376 497 343L555 282V483H647V282L706 343Q731 376 760 347z" /> <glyph glyph-name="floppy-saved" - unicode="" + unicode="" horiz-adv-x="1200" d=" M575 135L418 285Q382 322 418 350Q450 383 487 354L560 281L676 456Q706 490 744.5 464.5T754 400zM600 -44H101Q49 -44 40 0V21Q35 339 35 978Q35 1009 55.5 1026T101 1043H979L990 1041Q1049 985 1158 875Q1161 872 1161 861Q1165 582 1165 17Q1165 -10 1145.5 -27T1100 -44H600zM901 913Q901 940 883.5 957.5T840 975H364Q336 975 318.5 957.5T301 913V708Q301 681 318.5 664T364 647H840Q866 647 883.5 664T901 708V913zM1004 538H197V68H1004V538zM791 926V694H678V926H791z" /> <glyph glyph-name="floppy-saved-1" unicode="floppy-saved" horiz-adv-x="1200" d=" M575 135L418 285Q382 322 418 350Q450 383 487 354L560 281L676 456Q706 490 744.5 464.5T754 400zM600 -44H101Q49 -44 40 0V21Q35 339 35 978Q35 1009 55.5 1026T101 1043H979L990 1041Q1049 985 1158 875Q1161 872 1161 861Q1165 582 1165 17Q1165 -10 1145.5 -27T1100 -44H600zM901 913Q901 940 883.5 957.5T840 975H364Q336 975 318.5 957.5T301 913V708Q301 681 318.5 664T364 647H840Q866 647 883.5 664T901 708V913zM1004 538H197V68H1004V538zM791 926V694H678V926H791z" /> <glyph glyph-name="folder-close" - unicode="" + unicode="" horiz-adv-x="1200" d=" M7 122V927Q7 946 18.5 959.5T53 975H62H375Q417 975 428 942Q432 934 431.5 926T433 910Q434 894 440 883Q445 871 457 865.5T483 860Q485 856 495 856H1135Q1151 856 1163 852.5T1183 834Q1186 829 1188.5 822.5T1191 808Q1192 796 1191.5 783T1191 757V30H7V122z" /> <glyph glyph-name="folder-close-1" unicode="folder-close" horiz-adv-x="1200" d=" M7 122V927Q7 946 18.5 959.5T53 975H62H375Q417 975 428 942Q432 934 431.5 926T433 910Q434 894 440 883Q445 871 457 865.5T483 860Q485 856 495 856H1135Q1151 856 1163 852.5T1183 834Q1186 829 1188.5 822.5T1191 808Q1192 796 1191.5 783T1191 757V30H7V122z" /> <glyph glyph-name="folder-open" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1381 618L1131 32L1129 28H69L318 616L319 618H1203H1381zM286 750Q249 750 221.5 727T189 669L0 216V926Q0 944 12 957.5T45 974H53H367Q408 974 421 939Q423 932 423 924T424 908Q426 900 427 894T432 882Q446 859 474 859Q478 856 481 855.5T486 855H1126Q1142 855 1154 851T1175 832Q1178 827 1180.5 821T1183 807Q1185 793 1184 780.5T1183 756V750H286z" /> <glyph glyph-name="folder-open-1" unicode="folder-open" horiz-adv-x="1200" d=" M1381 618L1131 32L1129 28H69L318 616L319 618H1203H1381zM286 750Q249 750 221.5 727T189 669L0 216V926Q0 944 12 957.5T45 974H53H367Q408 974 421 939Q423 932 423 924T424 908Q426 900 427 894T432 882Q446 859 474 859Q478 856 481 855.5T486 855H1126Q1142 855 1154 851T1175 832Q1178 827 1180.5 821T1183 807Q1185 793 1184 780.5T1183 756V750H286z" /> <glyph glyph-name="font-add" - unicode="" + unicode="" horiz-adv-x="1200" d=" M950 1080C938.66667 1080 928.83333 1076 920.5 1068C912.16667 1060 908 1050.66667 908 1040L908 870L741 870C729.66667 870 720 866.3333299999999 712 859C704 851.6666700000001 700 842.1666700000001 700 830.5C700 818.8333299999999 704 809 712 801C720 793 729.66667 789 741 789L908 789L908 620C908 608.66667 912.16667 599.16667 920.5 591.5C928.83333 583.83333 938.66667 580 950 580C961.33333 580 971 583.83333 979 591.5C987 599.16667 991 608.66667 991 620L991 789L1160 789C1170.6667 789 1180 793 1188 801C1196 809 1200 818.8333299999999 1200 830.5C1200 842.1666700000001 1196 851.6666700000001 1188 859C1180 866.3333299999999 1170.6667 870 1160 870L991 870L991 1040C991 1050.66667 987 1060 979 1068C971 1076 961.33333 1080 950 1080zM0 721.02734L0 535.19336L98.425781 535.19336L106.50586 631.41602L293.80859 631.41602L293.80859 -31.123L198.32031 -48.0175999999999L198.32031 -120L501.67969 -120L501.67969 -48.0175999999999L407.66016 -31.123L407.66016 631.41602L594.22852 631.41602L603.04297 535.19336L700 535.19336L700 721.02734L0 721.02734z" /> <glyph glyph-name="font-add-1" unicode="font-add" horiz-adv-x="1200" d=" M950 1080C938.66667 1080 928.83333 1076 920.5 1068C912.16667 1060 908 1050.66667 908 1040L908 870L741 870C729.66667 870 720 866.3333299999999 712 859C704 851.6666700000001 700 842.1666700000001 700 830.5C700 818.8333299999999 704 809 712 801C720 793 729.66667 789 741 789L908 789L908 620C908 608.66667 912.16667 599.16667 920.5 591.5C928.83333 583.83333 938.66667 580 950 580C961.33333 580 971 583.83333 979 591.5C987 599.16667 991 608.66667 991 620L991 789L1160 789C1170.6667 789 1180 793 1188 801C1196 809 1200 818.8333299999999 1200 830.5C1200 842.1666700000001 1196 851.6666700000001 1188 859C1180 866.3333299999999 1170.6667 870 1160 870L991 870L991 1040C991 1050.66667 987 1060 979 1068C971 1076 961.33333 1080 950 1080zM0 721.02734L0 535.19336L98.425781 535.19336L106.50586 631.41602L293.80859 631.41602L293.80859 -31.123L198.32031 -48.0175999999999L198.32031 -120L501.67969 -120L501.67969 -48.0175999999999L407.66016 -31.123L407.66016 631.41602L594.22852 631.41602L603.04297 535.19336L700 535.19336L700 721.02734L0 721.02734z" /> <glyph glyph-name="font" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1077 1078V825H945L933 956H679V54L807 31V-67H394V31L524 54V956H269L258 825H124V1078H1077z" /> <glyph glyph-name="font-1" unicode="font" horiz-adv-x="1200" d=" M1077 1078V825H945L933 956H679V54L807 31V-67H394V31L524 54V956H269L258 825H124V1078H1077z" /> <glyph glyph-name="forward" - unicode="" + unicode="" horiz-adv-x="1200" d=" M615 671Q552 722 607 776Q673 837 732 779L1141 468L732 156Q712 136 672 136T607 160Q552 214 615 265L877 468zM130 671Q64 722 128 776Q187 837 252 779L659 468L252 156Q228 136 188.5 136T128 160Q64 214 130 265L392 468z" /> <glyph glyph-name="forward-1" unicode="forward" horiz-adv-x="1200" d=" M615 671Q552 722 607 776Q673 837 732 779L1141 468L732 156Q712 136 672 136T607 160Q552 214 615 265L877 468zM130 671Q64 722 128 776Q187 837 252 779L659 468L252 156Q228 136 188.5 136T128 160Q64 214 130 265L392 468z" /> <glyph glyph-name="geometry-collection" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1018.75 1080C968.91666 1080 926.33334 1062.25 891 1026.75C855.66667 991.25 838 948.83333 838 899.5C838 795.8333299999999 898.16666 656 1018.5 480C1139.5 656 1200 795.8333299999999 1200 899.5C1200 948.83333 1182.25 991.25 1146.75 1026.75C1111.25 1062.25 1068.5833 1080 1018.75 1080zM343.8554700000001 1016.44141C312.8554700000001 1016.44141 286.35546 1005.44141 264.3554700000001 983.44141C242.35547 961.44141 231.35547 934.94141 231.35547 903.94141C231.35547 872.44141 242.60548 845.69141 265.1054700000001 823.69141L265.8554700000001 822.94141C268.3554700000001 820.9413999999999 270.6054700000001 818.94141 272.6054700000001 816.94141C274.1054700000001 815.94141 275.3554700000001 814.94141 276.3554700000001 813.94141C278.3554700000001 812.44141 280.3554700000001 811.19141 282.3554700000001 810.19141C283.3554700000001 809.19141 284.3554700000001 808.44141 285.3554700000001 807.94141C287.8554700000001 806.44141 290.1054700000001 805.19141 292.1054700000001 804.19141C293.10548 803.69141 293.85548 803.1913999999999 294.3554700000001 802.69141C297.3554700000001 801.6913999999999 300.1054700000001 800.69141 302.6054700000001 799.69141C304.10548 798.69141 305.6054700000001 797.94141 307.1054700000001 797.44141L309.3554700000001 797.44141C320.35548 793.44141 331.85548 791.44141 343.8554700000001 791.44141C356.3554700000001 791.44141 368.60548 793.44141 380.6054700000001 797.44141C384.10548 798.94141 387.3554700000001 800.4413999999999 390.3554700000001 801.94141L916.85547 275.44141C915.35546 271.94141 913.85547 268.69141 912.35547 265.69141C908.35547 253.69141 906.35547 241.44141 906.35547 228.94141C906.35547 216.44141 908.60547 204.19141 913.10547 192.1914000000001C913.60547 189.6914000000001 914.35547 187.1914000000001 915.35547 184.6914000000001C915.85547 183.6914000000001 916.35546 182.4414000000001 916.85547 180.9414000000001C917.85546 178.9414000000001 919.10547 176.9414000000001 920.60547 174.9413999999999C921.10548 173.4413999999999 921.85548 172.1913999999999 922.85547 171.1913999999999L925.85547 165.1913999999999C926.85547 164.1913999999999 927.85547 162.9413999999999 928.85547 161.4413999999999C930.35548 159.9413999999999 931.60549 158.4413999999999 932.60547 156.9413999999999C934.10547 155.4413999999999 935.35547 153.9413999999999 936.35547 152.4413999999999C958.35547 128.4413999999999 985.85549 116.4413999999999 1018.8555 116.4413999999999C1049.8555 116.4413999999999 1076.3555 127.4413999999999 1098.3555 149.4413999999999C1120.3555 171.4413999999999 1131.3555 197.9414000000001 1131.3555 228.94141C1131.3555 259.94141 1120.3555 286.44141 1098.3555 308.44141C1076.3555 330.44141 1049.8555 341.44141 1018.8555 341.44141C999.35549 341.44141 980.85547 336.69141 963.35547 327.19141L441.3554700000001 848.44141C451.35547 865.94141 456.35547 884.44141 456.35547 903.94141C456.35547 934.94141 445.3554700000001 961.44141 423.3554700000001 983.44141C401.35548 1005.44141 374.85548 1016.44141 343.8554700000001 1016.44141zM343.8554700000001 960.19141C359.3554700000001 960.19141 372.6054700000001 954.69141 383.6054700000001 943.69141C394.60548 932.6914 400.1054700000001 919.4414 400.1054700000001 903.94141C400.1054700000001 888.44141 394.60548 875.19141 383.6054700000001 864.19141C372.6054700000001 853.19141 359.3554700000001 847.69141 343.8554700000001 847.69141C328.35548 847.69141 315.10548 853.19141 304.1054700000001 864.19141C293.10548 875.19141 287.6054700000001 888.44141 287.6054700000001 903.94141C287.6054700000001 919.4414 293.10548 932.6914 304.1054700000001 943.69141C315.10548 954.69141 328.35548 960.19141 343.8554700000001 960.19141zM1019.5 942C1037.5 942 1052.9167 935.5 1065.75 922.5C1078.5833 909.5 1085 893.9166700000001 1085 875.75C1085 857.58334 1078.3333 842.5 1065 830.5C1052.6667 817.16666 1037.5 810.5 1019.5 810.5C1001.5 810.5 986.08334 816.8333299999999 973.25 829.5C960.41667 842.1666700000001 954 857.58334 954 875.75C954 893.9166700000001 960.41667 909.5 973.25 922.5C986.08334 935.5 1001.5 942 1019.5 942zM112.5 780C81.500002 780 54.999999 769 33 747C11 725 0 698.5 0 667.5C0 645 7.6249998 623.37499 22.875 602.625C38.124999 581.87499 56.5 567.99999 78 561L78 99.75C56.5 92.75 38.124999 78.75 22.875 57.75C7.6249998 36.75 0 15 0 -7.5C0 -38.5 11 -65 33 -87C54.999999 -109 81.500002 -120 112.5 -120C135 -120 156.62501 -112.375 177.375 -97.125C198.12501 -81.875 212.00001 -63.5 219 -42L680.25 -42C685.24999 -56.5 693.24999 -69.625 704.25 -81.375C715.25 -93.125 728.12501 -102.5 742.875 -109.5C757.62501 -116.5 772.5 -120 787.5 -120C818.49999 -120 845 -109 867 -87C889.00001 -65 900 -38.5 900 -7.5C900 23.5 889.00001 50 867 72C845 94 818.49999 105 787.5 105C768 105 749.5 100.25 732 90.75L210 612C220.00001 629.5 225 648 225 667.5C225 698.5 214.00001 725 192 747C170.00001 769 143.5 780 112.5 780zM112.5 723.75C127.99999 723.75 141.24999 718.25 152.25 707.25C163.25 696.25 168.75 683 168.75 667.5C168.75 657.5 166.25 648.125 161.25 639.375C156.24999 630.62501 149.37499 623.75001 140.625 618.75C131.875 613.75 122.5 611.25 112.5 611.25C97 611.25 83.749998 616.75 72.75 627.75C61.75 638.75001 56.25 652.00001 56.25 667.5C56.25 683 61.75 696.25 72.75 707.25C83.749998 718.25 97 723.75 112.5 723.75zM159 565.5L685.5 39C683.50001 35 682.00001 31 681 27L219.75 27C214.74999 42 205.125 56.625 190.875 70.875C176.625 85.125 162 94.5 147 99L147 560.25C151.00001 561.75 155 563.49999 159 565.5zM1018.8555 285.19141C1026.3555 285.19141 1033.6054 283.69141 1040.6055 280.69141C1047.6054 277.69141 1053.6054 273.69141 1058.6055 268.69141C1063.6054 263.69141 1067.6055 257.6914000000001 1070.6055 250.69141C1073.6055 243.6914000000001 1075.1055 236.44141 1075.1055 228.94141C1075.1055 213.44141 1069.6054 200.19141 1058.6055 189.1914000000001C1047.6054 178.1914000000001 1034.3555 172.6913999999999 1018.8555 172.6913999999999C1003.3556 172.6913999999999 990.10554 178.1914000000001 979.10547 189.1914000000001C968.10547 200.19141 962.60547 213.44141 962.60547 228.94141C962.60547 244.44141 968.10547 257.69141 979.10547 268.69141C990.10554 279.69141 1003.3556 285.19141 1018.8555 285.19141zM112.5 48.75C127.99999 48.75 141.24999 43.25 152.25 32.25C163.25 21.25 168.75 8 168.75 -7.5C168.75 -17.5 166.25 -26.875 161.25 -35.625C156.24999 -44.375 149.37499 -51.25 140.625 -56.25C131.875 -61.25 122.5 -63.75 112.5 -63.75C97 -63.75 83.749998 -58.25 72.75 -47.25C61.75 -36.25 56.25 -23 56.25 -7.5C56.25 8 61.75 21.25 72.75 32.25C83.749998 43.25 97 48.75 112.5 48.75zM787.5 48.75C797.49999 48.75 806.87499 46.25 815.625 41.25C824.37499 36.25 831.25 29.375 836.25 20.625C841.25001 11.875 843.75 2.5 843.75 -7.5C843.75 -23 838.25001 -36.25 827.25 -47.25C816.25 -58.25 802.99999 -63.75 787.5 -63.75C771.99999 -63.75 758.74999 -58.25 747.75 -47.25C736.75 -36.25 731.25 -23 731.25 -7.5C731.25 8 736.75 21.25 747.75 32.25C758.74999 43.25 771.99999 48.75 787.5 48.75z" /> <glyph glyph-name="geometry-collection-1" unicode="geometry-collection" horiz-adv-x="1200" d=" M1018.75 1080C968.91666 1080 926.33334 1062.25 891 1026.75C855.66667 991.25 838 948.83333 838 899.5C838 795.8333299999999 898.16666 656 1018.5 480C1139.5 656 1200 795.8333299999999 1200 899.5C1200 948.83333 1182.25 991.25 1146.75 1026.75C1111.25 1062.25 1068.5833 1080 1018.75 1080zM343.8554700000001 1016.44141C312.8554700000001 1016.44141 286.35546 1005.44141 264.3554700000001 983.44141C242.35547 961.44141 231.35547 934.94141 231.35547 903.94141C231.35547 872.44141 242.60548 845.69141 265.1054700000001 823.69141L265.8554700000001 822.94141C268.3554700000001 820.9413999999999 270.6054700000001 818.94141 272.6054700000001 816.94141C274.1054700000001 815.94141 275.3554700000001 814.94141 276.3554700000001 813.94141C278.3554700000001 812.44141 280.3554700000001 811.19141 282.3554700000001 810.19141C283.3554700000001 809.19141 284.3554700000001 808.44141 285.3554700000001 807.94141C287.8554700000001 806.44141 290.1054700000001 805.19141 292.1054700000001 804.19141C293.10548 803.69141 293.85548 803.1913999999999 294.3554700000001 802.69141C297.3554700000001 801.6913999999999 300.1054700000001 800.69141 302.6054700000001 799.69141C304.10548 798.69141 305.6054700000001 797.94141 307.1054700000001 797.44141L309.3554700000001 797.44141C320.35548 793.44141 331.85548 791.44141 343.8554700000001 791.44141C356.3554700000001 791.44141 368.60548 793.44141 380.6054700000001 797.44141C384.10548 798.94141 387.3554700000001 800.4413999999999 390.3554700000001 801.94141L916.85547 275.44141C915.35546 271.94141 913.85547 268.69141 912.35547 265.69141C908.35547 253.69141 906.35547 241.44141 906.35547 228.94141C906.35547 216.44141 908.60547 204.19141 913.10547 192.1914000000001C913.60547 189.6914000000001 914.35547 187.1914000000001 915.35547 184.6914000000001C915.85547 183.6914000000001 916.35546 182.4414000000001 916.85547 180.9414000000001C917.85546 178.9414000000001 919.10547 176.9414000000001 920.60547 174.9413999999999C921.10548 173.4413999999999 921.85548 172.1913999999999 922.85547 171.1913999999999L925.85547 165.1913999999999C926.85547 164.1913999999999 927.85547 162.9413999999999 928.85547 161.4413999999999C930.35548 159.9413999999999 931.60549 158.4413999999999 932.60547 156.9413999999999C934.10547 155.4413999999999 935.35547 153.9413999999999 936.35547 152.4413999999999C958.35547 128.4413999999999 985.85549 116.4413999999999 1018.8555 116.4413999999999C1049.8555 116.4413999999999 1076.3555 127.4413999999999 1098.3555 149.4413999999999C1120.3555 171.4413999999999 1131.3555 197.9414000000001 1131.3555 228.94141C1131.3555 259.94141 1120.3555 286.44141 1098.3555 308.44141C1076.3555 330.44141 1049.8555 341.44141 1018.8555 341.44141C999.35549 341.44141 980.85547 336.69141 963.35547 327.19141L441.3554700000001 848.44141C451.35547 865.94141 456.35547 884.44141 456.35547 903.94141C456.35547 934.94141 445.3554700000001 961.44141 423.3554700000001 983.44141C401.35548 1005.44141 374.85548 1016.44141 343.8554700000001 1016.44141zM343.8554700000001 960.19141C359.3554700000001 960.19141 372.6054700000001 954.69141 383.6054700000001 943.69141C394.60548 932.6914 400.1054700000001 919.4414 400.1054700000001 903.94141C400.1054700000001 888.44141 394.60548 875.19141 383.6054700000001 864.19141C372.6054700000001 853.19141 359.3554700000001 847.69141 343.8554700000001 847.69141C328.35548 847.69141 315.10548 853.19141 304.1054700000001 864.19141C293.10548 875.19141 287.6054700000001 888.44141 287.6054700000001 903.94141C287.6054700000001 919.4414 293.10548 932.6914 304.1054700000001 943.69141C315.10548 954.69141 328.35548 960.19141 343.8554700000001 960.19141zM1019.5 942C1037.5 942 1052.9167 935.5 1065.75 922.5C1078.5833 909.5 1085 893.9166700000001 1085 875.75C1085 857.58334 1078.3333 842.5 1065 830.5C1052.6667 817.16666 1037.5 810.5 1019.5 810.5C1001.5 810.5 986.08334 816.8333299999999 973.25 829.5C960.41667 842.1666700000001 954 857.58334 954 875.75C954 893.9166700000001 960.41667 909.5 973.25 922.5C986.08334 935.5 1001.5 942 1019.5 942zM112.5 780C81.500002 780 54.999999 769 33 747C11 725 0 698.5 0 667.5C0 645 7.6249998 623.37499 22.875 602.625C38.124999 581.87499 56.5 567.99999 78 561L78 99.75C56.5 92.75 38.124999 78.75 22.875 57.75C7.6249998 36.75 0 15 0 -7.5C0 -38.5 11 -65 33 -87C54.999999 -109 81.500002 -120 112.5 -120C135 -120 156.62501 -112.375 177.375 -97.125C198.12501 -81.875 212.00001 -63.5 219 -42L680.25 -42C685.24999 -56.5 693.24999 -69.625 704.25 -81.375C715.25 -93.125 728.12501 -102.5 742.875 -109.5C757.62501 -116.5 772.5 -120 787.5 -120C818.49999 -120 845 -109 867 -87C889.00001 -65 900 -38.5 900 -7.5C900 23.5 889.00001 50 867 72C845 94 818.49999 105 787.5 105C768 105 749.5 100.25 732 90.75L210 612C220.00001 629.5 225 648 225 667.5C225 698.5 214.00001 725 192 747C170.00001 769 143.5 780 112.5 780zM112.5 723.75C127.99999 723.75 141.24999 718.25 152.25 707.25C163.25 696.25 168.75 683 168.75 667.5C168.75 657.5 166.25 648.125 161.25 639.375C156.24999 630.62501 149.37499 623.75001 140.625 618.75C131.875 613.75 122.5 611.25 112.5 611.25C97 611.25 83.749998 616.75 72.75 627.75C61.75 638.75001 56.25 652.00001 56.25 667.5C56.25 683 61.75 696.25 72.75 707.25C83.749998 718.25 97 723.75 112.5 723.75zM159 565.5L685.5 39C683.50001 35 682.00001 31 681 27L219.75 27C214.74999 42 205.125 56.625 190.875 70.875C176.625 85.125 162 94.5 147 99L147 560.25C151.00001 561.75 155 563.49999 159 565.5zM1018.8555 285.19141C1026.3555 285.19141 1033.6054 283.69141 1040.6055 280.69141C1047.6054 277.69141 1053.6054 273.69141 1058.6055 268.69141C1063.6054 263.69141 1067.6055 257.6914000000001 1070.6055 250.69141C1073.6055 243.6914000000001 1075.1055 236.44141 1075.1055 228.94141C1075.1055 213.44141 1069.6054 200.19141 1058.6055 189.1914000000001C1047.6054 178.1914000000001 1034.3555 172.6913999999999 1018.8555 172.6913999999999C1003.3556 172.6913999999999 990.10554 178.1914000000001 979.10547 189.1914000000001C968.10547 200.19141 962.60547 213.44141 962.60547 228.94141C962.60547 244.44141 968.10547 257.69141 979.10547 268.69141C990.10554 279.69141 1003.3556 285.19141 1018.8555 285.19141zM112.5 48.75C127.99999 48.75 141.24999 43.25 152.25 32.25C163.25 21.25 168.75 8 168.75 -7.5C168.75 -17.5 166.25 -26.875 161.25 -35.625C156.24999 -44.375 149.37499 -51.25 140.625 -56.25C131.875 -61.25 122.5 -63.75 112.5 -63.75C97 -63.75 83.749998 -58.25 72.75 -47.25C61.75 -36.25 56.25 -23 56.25 -7.5C56.25 8 61.75 21.25 72.75 32.25C83.749998 43.25 97 48.75 112.5 48.75zM787.5 48.75C797.49999 48.75 806.87499 46.25 815.625 41.25C824.37499 36.25 831.25 29.375 836.25 20.625C841.25001 11.875 843.75 2.5 843.75 -7.5C843.75 -23 838.25001 -36.25 827.25 -47.25C816.25 -58.25 802.99999 -63.75 787.5 -63.75C771.99999 -63.75 758.74999 -58.25 747.75 -47.25C736.75 -36.25 731.25 -23 731.25 -7.5C731.25 8 736.75 21.25 747.75 32.25C758.74999 43.25 771.99999 48.75 787.5 48.75z" /> <glyph glyph-name="geoserver" - unicode="" + unicode="" horiz-adv-x="1200" d=" M600 1080H611Q613 1080 614 1079.5L615 1079H622V1079H624.5H626L627 1078H633Q634 1078 638 1077H639Q642 1076 644 1076Q647 1075 650 1075Q652 1074 654 1074H655Q658 1073 660 1072H661L665 1071L672 1069L673 1068.5L674 1068Q686 1065 697 1060H698Q740 1041 772 1009L1129 652Q1200 581 1200 480T1129 308L772 -49Q767 -54 760 -60L759 -61L747 -71H746Q740 -76 733 -81Q727 -85 720 -89Q719 -89 718.5 -89.5L718 -90Q711 -94 704 -97V-97L690 -103L688 -104Q681 -106 675 -108Q674 -109 673 -109Q654 -115 635 -117Q623 -119 612 -120H600V-120H586Q585 -119 583 -119H582Q577 -119 572 -118H569H568L558 -116L548 -114H546Q542 -113 537 -112Q536 -112 535 -111Q531 -110 526 -109L525 -108H524Q519 -106 514 -105V-104L504 -100H503Q499 -98 494 -96Q493 -96 492 -95Q488 -93 483 -90Q452 -73 428 -49L225 153L170 209L71 308Q0 379 0 480Q0 565 53 632L53.5 632.5L54 633Q55 634 58 638Q62 642 62.5 643L63 644L71 652L363 944L428 1009Q469 1051 526 1068V1068L527 1069Q544 1074 562 1077H563Q571 1078 580 1079H581H583Q592 1080 599 1080H600zM538 1010Q499 996 469 967L436 934Q461 924 461 905Q461 888 449 873T423 848T397.5 820T386 779Q386 762 403 749T438.5 729.5T471 715T478.5 694T438 661Q417 648 405 634.5T390.5 609.5T390 585.5T397.5 562T408 539.5T417 518.5T418.5 498.5T407 479Q389 459 378 469T362.5 499.5T348.5 536.5T324 547Q286 530 269 506T279 464Q281 463 297.5 455T323 442L350 427L378 409L401.5 389.5L419 367.5L425 345L419 321L394 297Q377 284 354.5 269T317.5 244T287 222.5T261 202L469 -7Q517 -54 584 -60Q654 -40 703 -30Q718 -20 730 -7L966 228Q962 228 947.5 225.5T926 222.5T907.5 222T887 225Q853 234 875 279Q898 328 957 363Q975 374 994 380Q1058 402 1096 360Q1139 409 1141 475Q1131 473 1107 479Q1078 486 1080 501Q1080 509 1089 510Q1093 510 1102.5 508T1122.5 502.5T1140 495Q1139 507 1137 518Q1104 510 1085 531Q1031 589 978 589Q953 588 954 576Q954 572 960 568Q978 556 972 530T940 497Q920 491 899.5 502.5T867 535.5T855 582Q855 604 850.5 622T840 651.5T825 673T809 688T793.5 698.5T782 706Q768 718 751.5 704T738 681Q741 670 729 655.5T699.5 632.5T663.5 621T635 628Q618 645 621.5 654.5T634 671.5T653 683.5T659.5 695.5T635 713Q619 720 668 746Q677 751 696 760Q742 784 751 792Q758 798 756 807T748.5 823T738 843.5T735 871Q736 879 747.5 894T775 922L730 967L729 969L728 970Q711 953 690 941.5T651 927T620 928Q608 935 608 948.5T613.5 975T611 996.5T575 1001Q550 998 538 1010zM663 808Q671 807 676 805Q690 799 694 785Q696 774 684 772Q656 768 638 790Q631 799 640 803.5T663 808zM656 603Q677 603 696.5 599T731.5 588T758 570.5T772 547Q777 529 799.5 523T847 515T880 503T873 464T836.5 395.5T812 329Q810 311 813 286T817 244T805 194.5T762 120Q714 52 667 90Q632 118 625 176Q621 211 633 233Q659 282 624.5 326.5T533 377Q492 381 489 430Q485 489 533 545Q549 564 568 578Q602 602 656 603zM89 581Q59 535 59 480Q59 403 113 349L150 313Q138 340 147 380.5T183 449Q205 471 207.5 500T195.5 548.5T157 568Q116 568 89 581z" /> <glyph glyph-name="geoserver-1" unicode="geoserver" horiz-adv-x="1200" d=" M600 1080H611Q613 1080 614 1079.5L615 1079H622V1079H624.5H626L627 1078H633Q634 1078 638 1077H639Q642 1076 644 1076Q647 1075 650 1075Q652 1074 654 1074H655Q658 1073 660 1072H661L665 1071L672 1069L673 1068.5L674 1068Q686 1065 697 1060H698Q740 1041 772 1009L1129 652Q1200 581 1200 480T1129 308L772 -49Q767 -54 760 -60L759 -61L747 -71H746Q740 -76 733 -81Q727 -85 720 -89Q719 -89 718.5 -89.5L718 -90Q711 -94 704 -97V-97L690 -103L688 -104Q681 -106 675 -108Q674 -109 673 -109Q654 -115 635 -117Q623 -119 612 -120H600V-120H586Q585 -119 583 -119H582Q577 -119 572 -118H569H568L558 -116L548 -114H546Q542 -113 537 -112Q536 -112 535 -111Q531 -110 526 -109L525 -108H524Q519 -106 514 -105V-104L504 -100H503Q499 -98 494 -96Q493 -96 492 -95Q488 -93 483 -90Q452 -73 428 -49L225 153L170 209L71 308Q0 379 0 480Q0 565 53 632L53.5 632.5L54 633Q55 634 58 638Q62 642 62.5 643L63 644L71 652L363 944L428 1009Q469 1051 526 1068V1068L527 1069Q544 1074 562 1077H563Q571 1078 580 1079H581H583Q592 1080 599 1080H600zM538 1010Q499 996 469 967L436 934Q461 924 461 905Q461 888 449 873T423 848T397.5 820T386 779Q386 762 403 749T438.5 729.5T471 715T478.5 694T438 661Q417 648 405 634.5T390.5 609.5T390 585.5T397.5 562T408 539.5T417 518.5T418.5 498.5T407 479Q389 459 378 469T362.5 499.5T348.5 536.5T324 547Q286 530 269 506T279 464Q281 463 297.5 455T323 442L350 427L378 409L401.5 389.5L419 367.5L425 345L419 321L394 297Q377 284 354.5 269T317.5 244T287 222.5T261 202L469 -7Q517 -54 584 -60Q654 -40 703 -30Q718 -20 730 -7L966 228Q962 228 947.5 225.5T926 222.5T907.5 222T887 225Q853 234 875 279Q898 328 957 363Q975 374 994 380Q1058 402 1096 360Q1139 409 1141 475Q1131 473 1107 479Q1078 486 1080 501Q1080 509 1089 510Q1093 510 1102.5 508T1122.5 502.5T1140 495Q1139 507 1137 518Q1104 510 1085 531Q1031 589 978 589Q953 588 954 576Q954 572 960 568Q978 556 972 530T940 497Q920 491 899.5 502.5T867 535.5T855 582Q855 604 850.5 622T840 651.5T825 673T809 688T793.5 698.5T782 706Q768 718 751.5 704T738 681Q741 670 729 655.5T699.5 632.5T663.5 621T635 628Q618 645 621.5 654.5T634 671.5T653 683.5T659.5 695.5T635 713Q619 720 668 746Q677 751 696 760Q742 784 751 792Q758 798 756 807T748.5 823T738 843.5T735 871Q736 879 747.5 894T775 922L730 967L729 969L728 970Q711 953 690 941.5T651 927T620 928Q608 935 608 948.5T613.5 975T611 996.5T575 1001Q550 998 538 1010zM663 808Q671 807 676 805Q690 799 694 785Q696 774 684 772Q656 768 638 790Q631 799 640 803.5T663 808zM656 603Q677 603 696.5 599T731.5 588T758 570.5T772 547Q777 529 799.5 523T847 515T880 503T873 464T836.5 395.5T812 329Q810 311 813 286T817 244T805 194.5T762 120Q714 52 667 90Q632 118 625 176Q621 211 633 233Q659 282 624.5 326.5T533 377Q492 381 489 430Q485 489 533 545Q549 564 568 578Q602 602 656 603zM89 581Q59 535 59 480Q59 403 113 349L150 313Q138 340 147 380.5T183 449Q205 471 207.5 500T195.5 548.5T157 568Q116 568 89 581z" /> <glyph glyph-name="geostory" - unicode="" + unicode="" horiz-adv-x="1200" d=" M336.64453 1080C282.92556 1080 248.44913 1070.79337 209.57812 1045.28906C172.55713 1012.50512 155.01683 979.97302 153.0957 933.22266C152.33412 939.05082 151.93359 944.59815 151.93359 949.83398V891.5292999999999V11.4042999999999L159.37109 -23.3065999999999C161.85042 -41.4884999999999 178.58639 -62.1486 209.57812 -85.2891C240.56987 -108.4295999999999 282.92552 -120 336.64453 -120H1048.0664V761.36328V818.38867V819.66992H1018.8301V1022.97461H1048.0664V1080H1018.8301H984.51367zM984.51367 1022.97461V819.66992H336.64453C319.13932 819.66992 302.84965 820.90602 287.75781 823.36328C269.3884 827.83528 251.82138 835.1891499999999 236.18945 846.2421899999999C213.00296 858.50029 198.52503 913.40345 210.81836 951.91016C235.09177 1008.55593 260.97022 1019.16948 325.94141 1022.96484zM216.39648 777.26367C235.83042 768.92028 256.2851800000001 762.98261 277.14453 759.51172C512.53608 750.7352900000001 748.12324 756.8809200000001 983.60352 755.42773V-55.5469C777.96451 -55.7565999999999 572.32588 -54.9643000000001 366.6875 -55.7559000000001C327.06191 -57.3216 284.18223 -56.6005 249.77539 -34.6679999999999C230.37273 -25.1241 216.97925 -4.8652 216.39648 16.8359zM333.92578 666.17969V604.72266H890.58984V666.17969zM333.92578 555.45703V494H759.10352V555.45703zM600 430.08008C570.45629 430.08008 542.05815 424.22147 514.80664 412.50586C487.80981 400.79025 464.44332 385.06247 444.70508 365.32422C424.96682 345.58597 409.23904 322.1554200000001 397.52344 295.03125C385.80784 267.90708 379.95117 239.573 379.95117 210.0293C379.95117 180.4856 385.80784 152.1515 397.52344 125.0273C409.23904 97.9032 424.96682 74.4726000000001 444.70508 54.7344000000001C464.44332 34.9961000000001 487.87387 19.2683 514.99805 7.5527C542.12222 -4.1629 570.45629 -10.0195000000001 600 -10.0195000000001C629.5437 -10.0195000000001 657.87778 -4.1629 685.00195 7.5527C712.12613 19.2683 735.55668 34.9961000000001 755.29492 54.7344000000001C775.03317 74.4726000000001 790.76096 97.9032 802.47656 125.0273C814.19217 152.1515 820.04883 180.4856 820.04883 210.0293C820.04883 239.573 814.19217 267.90708 802.47656 295.03125C790.76096 322.1554200000001 775.03317 345.58597 755.29492 365.32422C735.55668 385.06247 712.12613 400.79025 685.00195 412.50586C657.87778 424.22147 629.5437 430.08008 600 430.08008zM610.31445 401.42773C615.15351 400.40899 619.86485 400.40899 624.44922 401.42773C627.76015 398.62617 632.98205 396.07929 640.11328 393.78711C647.24452 391.49492 653.61172 389.58476 659.21484 388.05664C664.81796 386.52851 669.46524 383.47109 673.1582 378.88672C676.85117 374.3023500000001 678.0625 368.44569 676.78906 361.31445L672.20312 359.4043000000001C669.40157 358.38555 664.49999 358.06719 657.49609 358.44922C650.4922 358.83125 643.04178 360.6773500000001 635.14648 363.9882800000001C635.91054 363.7335900000001 636.48321 363.16094 636.86523 362.2695300000001C637.24727 361.37812 637.37539 360.16679 637.24805 358.6386700000001C637.12071 357.11055 636.93047 355.775 636.67578 354.62891C636.42109 353.48281 636.03867 352.0171800000001 635.5293 350.23438C635.01992 348.45156 634.76562 347.43242 634.76562 347.17773C637.56718 345.6496100000001 643.10548 342.72226 651.38281 338.39258C659.66014 334.0628900000001 665.90118 330.62304 670.10352 328.0761700000001C674.30585 325.5293000000001 679.08125 321.7730400000001 684.42969 316.80664C689.77811 311.84025 693.72461 306.4281200000001 696.27148 300.57031C693.9793 297.7687600000001 691.36835 295.79453 688.43945 294.6484400000001C685.51055 293.50234 682.96367 292.9296900000001 680.79883 292.9296900000001C678.63399 292.9296900000001 675.51445 293.12187 671.43945 293.50391C667.36446 293.8859300000001 664.30898 294.0761700000001 662.27148 294.0761700000001C658.19649 289.49181 656.92305 284.90663 658.45117 280.32227C652.84806 277.77539 648.51718 274.9121 645.46094 271.72852C642.4047 268.54493 640.43242 265.6796900000001 639.54102 263.13281C638.64961 260.5859500000001 637.63047 256.6375000000001 636.48438 251.28906C635.33829 245.9406400000001 634.00078 241.4835900000001 632.47266 237.91797C631.45391 234.60704 629.47968 231.48749 626.55078 228.55859C623.62187 225.62969 621.32929 222.76445 619.67383 219.96289C618.01836 217.16133 617.57383 213.46718 618.33789 208.88281C619.10195 204.80782 619.16602 200.7332 618.5293 196.6582C617.89258 192.5832 616.87344 188.1902 615.47266 183.4785000000001C614.07188 178.7668 613.1168 174.8824 612.60742 171.8262L610.69727 172.9727C609.16914 173.9914000000001 607.19492 175.3289 604.77539 176.9844000000001C602.35586 178.6398 599.80898 180.55 597.13477 182.7148C594.46055 184.8797 591.72344 187.4906 588.92188 190.5469000000001C586.12031 193.6031000000001 583.82773 196.6586 582.04492 199.7148C580.5168 202.26171 578.03398 203.98164 574.5957 204.87305C571.15743 205.76445 566.89062 206.27305 561.79688 206.40039C556.70313 206.52774 553.3914 206.71797 551.86328 206.97266C547.78829 205.44454 544.98711 202.64336 543.45898 198.5684C540.65743 190.9278000000001 541.67657 183.5414 546.51562 176.4102C551.35468 169.0242000000001 556.70274 168.5156 562.56055 174.8828000000001C567.14491 179.9766 571.09336 182.6516 574.4043 182.9062C577.71522 183.1609 580.06992 181.6953 581.4707 178.5117C582.87148 175.3281 583.76445 171.7620999999999 584.14648 167.8145C584.52851 163.8668 584.59062 159.9844000000001 584.33594 156.1641C585.35468 155.6547000000001 588.47618 154.8258000000001 593.69727 153.6796999999999C598.91835 152.5336 602.29219 150.3051000000001 603.82031 146.9940999999999C603.82031 146.7394999999999 603.75625 143.4918 603.62891 137.252C603.50156 131.0120999999999 603.94804 127.7664 604.9668 127.5117C608.7871 121.6539 617.19065 123.1815999999999 630.17969 132.0957000000001C634.25468 134.8973000000001 639.09415 136.9976999999999 644.69727 138.3984000000001C650.30039 139.7991999999999 655.64845 140.6280999999999 660.74219 140.8828000000001C665.83593 141.1375000000001 671.31212 141.3277000000001 677.16992 141.4550999999999C683.02772 141.5824 688.24962 141.6465000000001 692.83398 141.6465000000001C697.16366 138.8449000000001 703.72111 136.4241999999999 712.50781 134.3867C721.29452 132.3492000000001 727.59767 130.4391000000001 731.41797 128.6561999999999C734.47422 126.8734 739.05938 125.9184 745.17188 125.791C751.28436 125.6637000000001 755.99571 124.5824 759.30664 122.5449000000001C758.54258 114.3949 755.86757 106.3719000000001 751.2832 98.4766C746.69884 90.5813000000001 742.30586 84.3422000000001 738.10352 79.7578000000001C733.90118 75.1733999999999 727.98046 69.1867 720.33984 61.8008C690.54145 32.7665 662.39761 18.5043000000001 635.91016 19.0137C634.63672 22.0699 634 24.2363 634 25.5098C634 26.7832000000001 634.44648 28.5652 635.33789 30.8574000000001C636.2293 33.1496 636.67578 35.1878999999999 636.67578 36.9707000000001C631.83673 37.9893999999999 627.1875 40.2801 622.73047 43.8457000000001C618.27344 47.4113 614.77148 50.9132999999999 612.22461 54.3516C609.67774 57.7898 606.74843 62.1828 603.4375 67.5311999999999C602.67344 71.8608999999999 603.88477 76.7004 607.06836 82.0488C610.25195 87.3973000000001 613.1172 92.491 615.66406 97.3300999999999C618.21094 102.1691000000001 618.5914 106.5 616.80859 110.3203000000001C609.42267 109.3016 602.10038 110.7012 594.8418 114.5215000000001C587.58322 118.3417999999999 579.94256 123.1813 571.91992 129.0391C563.89728 134.8969 557.21171 138.9715000000001 551.86328 141.2637C549.06172 142.2824000000001 544.66874 143.8101999999999 538.68359 145.8477C532.69845 147.8851 527.54062 149.7953 523.21094 151.5781C518.88126 153.3608999999999 514.68046 155.2710999999999 510.60547 157.3086000000001C508.82266 158.3272999999999 506.33789 160.1113 503.1543 162.6582000000001C499.97071 165.2050999999999 496.97929 167.1152 494.17773 168.3887C491.37618 169.6621 488.44687 170.2988 485.39062 170.2988C485.64531 176.4113 483.60898 183.9879 479.2793 193.0293C474.94962 202.07069 472.7832 207.73712 472.7832 210.0293C474.31132 217.16054 473.29414 228.23908 469.72852 243.26562C466.1629 258.29216 465.52617 270.1355600000001 467.81836 278.7949200000001C469.09179 284.3980400000001 472.84806 294.45744 479.08789 308.97461C485.32772 323.49177 488.82968 335.08087 489.59375 343.74023C489.84844 345.52305 488.76523 347.87969 486.3457 350.80859C483.92617 353.73749 483.09921 356.6027400000001 483.86328 359.4043000000001C484.62734 363.2246 489.02033 367.61758 497.04297 372.58398C505.06562 377.55038 511.62306 380.92422 516.7168 382.7070300000001C520.5371 383.98046 526.33166 384.2347600000001 534.09961 383.4707C541.86757 382.70664 547.66212 382.70664 551.48242 383.4707C554.02929 383.9800800000001 558.99493 384.80898 566.38086 385.95508C573.76679 387.10117 579.24297 388.12032 582.80859 389.01172C586.37421 389.9031300000001 590.89532 391.4308600000001 596.37109 393.5957C601.84687 395.76054 606.49415 398.37149 610.31445 401.42773zM604.9668 360.54883C602.9293 359.53008 600.82695 357.93828 598.66211 355.7734400000001C596.49727 353.6086 594.77929 351.76249 593.50586 350.23438C592.23242 348.70625 590.44843 347.94336 588.15625 347.94336C585.86406 347.94336 583.4453 349.2168000000001 580.89844 351.7636700000001C580.13437 349.98086 578.09608 346.7331900000001 574.78516 342.02148C571.47422 337.30977 569.43789 333.55351 568.67383 330.75195C572.74882 327.9504 577.46017 325.84805 582.80859 324.44727C588.15702 323.04649 594.84259 321.77305 602.86523 320.62695C610.88787 319.48086 615.91758 318.78008 617.95508 318.52539C617.95508 319.28945 616.80976 322.21875 614.51758 327.3125C612.2254 332.4062400000001 610.06094 338.13673 608.02344 344.50391C605.98594 350.87108 604.9668 356.21915 604.9668 360.54883z" /> <glyph glyph-name="geostory-1" unicode="geostory" horiz-adv-x="1200" d=" M336.64453 1080C282.92556 1080 248.44913 1070.79337 209.57812 1045.28906C172.55713 1012.50512 155.01683 979.97302 153.0957 933.22266C152.33412 939.05082 151.93359 944.59815 151.93359 949.83398V891.5292999999999V11.4042999999999L159.37109 -23.3065999999999C161.85042 -41.4884999999999 178.58639 -62.1486 209.57812 -85.2891C240.56987 -108.4295999999999 282.92552 -120 336.64453 -120H1048.0664V761.36328V818.38867V819.66992H1018.8301V1022.97461H1048.0664V1080H1018.8301H984.51367zM984.51367 1022.97461V819.66992H336.64453C319.13932 819.66992 302.84965 820.90602 287.75781 823.36328C269.3884 827.83528 251.82138 835.1891499999999 236.18945 846.2421899999999C213.00296 858.50029 198.52503 913.40345 210.81836 951.91016C235.09177 1008.55593 260.97022 1019.16948 325.94141 1022.96484zM216.39648 777.26367C235.83042 768.92028 256.2851800000001 762.98261 277.14453 759.51172C512.53608 750.7352900000001 748.12324 756.8809200000001 983.60352 755.42773V-55.5469C777.96451 -55.7565999999999 572.32588 -54.9643000000001 366.6875 -55.7559000000001C327.06191 -57.3216 284.18223 -56.6005 249.77539 -34.6679999999999C230.37273 -25.1241 216.97925 -4.8652 216.39648 16.8359zM333.92578 666.17969V604.72266H890.58984V666.17969zM333.92578 555.45703V494H759.10352V555.45703zM600 430.08008C570.45629 430.08008 542.05815 424.22147 514.80664 412.50586C487.80981 400.79025 464.44332 385.06247 444.70508 365.32422C424.96682 345.58597 409.23904 322.1554200000001 397.52344 295.03125C385.80784 267.90708 379.95117 239.573 379.95117 210.0293C379.95117 180.4856 385.80784 152.1515 397.52344 125.0273C409.23904 97.9032 424.96682 74.4726000000001 444.70508 54.7344000000001C464.44332 34.9961000000001 487.87387 19.2683 514.99805 7.5527C542.12222 -4.1629 570.45629 -10.0195000000001 600 -10.0195000000001C629.5437 -10.0195000000001 657.87778 -4.1629 685.00195 7.5527C712.12613 19.2683 735.55668 34.9961000000001 755.29492 54.7344000000001C775.03317 74.4726000000001 790.76096 97.9032 802.47656 125.0273C814.19217 152.1515 820.04883 180.4856 820.04883 210.0293C820.04883 239.573 814.19217 267.90708 802.47656 295.03125C790.76096 322.1554200000001 775.03317 345.58597 755.29492 365.32422C735.55668 385.06247 712.12613 400.79025 685.00195 412.50586C657.87778 424.22147 629.5437 430.08008 600 430.08008zM610.31445 401.42773C615.15351 400.40899 619.86485 400.40899 624.44922 401.42773C627.76015 398.62617 632.98205 396.07929 640.11328 393.78711C647.24452 391.49492 653.61172 389.58476 659.21484 388.05664C664.81796 386.52851 669.46524 383.47109 673.1582 378.88672C676.85117 374.3023500000001 678.0625 368.44569 676.78906 361.31445L672.20312 359.4043000000001C669.40157 358.38555 664.49999 358.06719 657.49609 358.44922C650.4922 358.83125 643.04178 360.6773500000001 635.14648 363.9882800000001C635.91054 363.7335900000001 636.48321 363.16094 636.86523 362.2695300000001C637.24727 361.37812 637.37539 360.16679 637.24805 358.6386700000001C637.12071 357.11055 636.93047 355.775 636.67578 354.62891C636.42109 353.48281 636.03867 352.0171800000001 635.5293 350.23438C635.01992 348.45156 634.76562 347.43242 634.76562 347.17773C637.56718 345.6496100000001 643.10548 342.72226 651.38281 338.39258C659.66014 334.0628900000001 665.90118 330.62304 670.10352 328.0761700000001C674.30585 325.5293000000001 679.08125 321.7730400000001 684.42969 316.80664C689.77811 311.84025 693.72461 306.4281200000001 696.27148 300.57031C693.9793 297.7687600000001 691.36835 295.79453 688.43945 294.6484400000001C685.51055 293.50234 682.96367 292.9296900000001 680.79883 292.9296900000001C678.63399 292.9296900000001 675.51445 293.12187 671.43945 293.50391C667.36446 293.8859300000001 664.30898 294.0761700000001 662.27148 294.0761700000001C658.19649 289.49181 656.92305 284.90663 658.45117 280.32227C652.84806 277.77539 648.51718 274.9121 645.46094 271.72852C642.4047 268.54493 640.43242 265.6796900000001 639.54102 263.13281C638.64961 260.5859500000001 637.63047 256.6375000000001 636.48438 251.28906C635.33829 245.9406400000001 634.00078 241.4835900000001 632.47266 237.91797C631.45391 234.60704 629.47968 231.48749 626.55078 228.55859C623.62187 225.62969 621.32929 222.76445 619.67383 219.96289C618.01836 217.16133 617.57383 213.46718 618.33789 208.88281C619.10195 204.80782 619.16602 200.7332 618.5293 196.6582C617.89258 192.5832 616.87344 188.1902 615.47266 183.4785000000001C614.07188 178.7668 613.1168 174.8824 612.60742 171.8262L610.69727 172.9727C609.16914 173.9914000000001 607.19492 175.3289 604.77539 176.9844000000001C602.35586 178.6398 599.80898 180.55 597.13477 182.7148C594.46055 184.8797 591.72344 187.4906 588.92188 190.5469000000001C586.12031 193.6031000000001 583.82773 196.6586 582.04492 199.7148C580.5168 202.26171 578.03398 203.98164 574.5957 204.87305C571.15743 205.76445 566.89062 206.27305 561.79688 206.40039C556.70313 206.52774 553.3914 206.71797 551.86328 206.97266C547.78829 205.44454 544.98711 202.64336 543.45898 198.5684C540.65743 190.9278000000001 541.67657 183.5414 546.51562 176.4102C551.35468 169.0242000000001 556.70274 168.5156 562.56055 174.8828000000001C567.14491 179.9766 571.09336 182.6516 574.4043 182.9062C577.71522 183.1609 580.06992 181.6953 581.4707 178.5117C582.87148 175.3281 583.76445 171.7620999999999 584.14648 167.8145C584.52851 163.8668 584.59062 159.9844000000001 584.33594 156.1641C585.35468 155.6547000000001 588.47618 154.8258000000001 593.69727 153.6796999999999C598.91835 152.5336 602.29219 150.3051000000001 603.82031 146.9940999999999C603.82031 146.7394999999999 603.75625 143.4918 603.62891 137.252C603.50156 131.0120999999999 603.94804 127.7664 604.9668 127.5117C608.7871 121.6539 617.19065 123.1815999999999 630.17969 132.0957000000001C634.25468 134.8973000000001 639.09415 136.9976999999999 644.69727 138.3984000000001C650.30039 139.7991999999999 655.64845 140.6280999999999 660.74219 140.8828000000001C665.83593 141.1375000000001 671.31212 141.3277000000001 677.16992 141.4550999999999C683.02772 141.5824 688.24962 141.6465000000001 692.83398 141.6465000000001C697.16366 138.8449000000001 703.72111 136.4241999999999 712.50781 134.3867C721.29452 132.3492000000001 727.59767 130.4391000000001 731.41797 128.6561999999999C734.47422 126.8734 739.05938 125.9184 745.17188 125.791C751.28436 125.6637000000001 755.99571 124.5824 759.30664 122.5449000000001C758.54258 114.3949 755.86757 106.3719000000001 751.2832 98.4766C746.69884 90.5813000000001 742.30586 84.3422000000001 738.10352 79.7578000000001C733.90118 75.1733999999999 727.98046 69.1867 720.33984 61.8008C690.54145 32.7665 662.39761 18.5043000000001 635.91016 19.0137C634.63672 22.0699 634 24.2363 634 25.5098C634 26.7832000000001 634.44648 28.5652 635.33789 30.8574000000001C636.2293 33.1496 636.67578 35.1878999999999 636.67578 36.9707000000001C631.83673 37.9893999999999 627.1875 40.2801 622.73047 43.8457000000001C618.27344 47.4113 614.77148 50.9132999999999 612.22461 54.3516C609.67774 57.7898 606.74843 62.1828 603.4375 67.5311999999999C602.67344 71.8608999999999 603.88477 76.7004 607.06836 82.0488C610.25195 87.3973000000001 613.1172 92.491 615.66406 97.3300999999999C618.21094 102.1691000000001 618.5914 106.5 616.80859 110.3203000000001C609.42267 109.3016 602.10038 110.7012 594.8418 114.5215000000001C587.58322 118.3417999999999 579.94256 123.1813 571.91992 129.0391C563.89728 134.8969 557.21171 138.9715000000001 551.86328 141.2637C549.06172 142.2824000000001 544.66874 143.8101999999999 538.68359 145.8477C532.69845 147.8851 527.54062 149.7953 523.21094 151.5781C518.88126 153.3608999999999 514.68046 155.2710999999999 510.60547 157.3086000000001C508.82266 158.3272999999999 506.33789 160.1113 503.1543 162.6582000000001C499.97071 165.2050999999999 496.97929 167.1152 494.17773 168.3887C491.37618 169.6621 488.44687 170.2988 485.39062 170.2988C485.64531 176.4113 483.60898 183.9879 479.2793 193.0293C474.94962 202.07069 472.7832 207.73712 472.7832 210.0293C474.31132 217.16054 473.29414 228.23908 469.72852 243.26562C466.1629 258.29216 465.52617 270.1355600000001 467.81836 278.7949200000001C469.09179 284.3980400000001 472.84806 294.45744 479.08789 308.97461C485.32772 323.49177 488.82968 335.08087 489.59375 343.74023C489.84844 345.52305 488.76523 347.87969 486.3457 350.80859C483.92617 353.73749 483.09921 356.6027400000001 483.86328 359.4043000000001C484.62734 363.2246 489.02033 367.61758 497.04297 372.58398C505.06562 377.55038 511.62306 380.92422 516.7168 382.7070300000001C520.5371 383.98046 526.33166 384.2347600000001 534.09961 383.4707C541.86757 382.70664 547.66212 382.70664 551.48242 383.4707C554.02929 383.9800800000001 558.99493 384.80898 566.38086 385.95508C573.76679 387.10117 579.24297 388.12032 582.80859 389.01172C586.37421 389.9031300000001 590.89532 391.4308600000001 596.37109 393.5957C601.84687 395.76054 606.49415 398.37149 610.31445 401.42773zM604.9668 360.54883C602.9293 359.53008 600.82695 357.93828 598.66211 355.7734400000001C596.49727 353.6086 594.77929 351.76249 593.50586 350.23438C592.23242 348.70625 590.44843 347.94336 588.15625 347.94336C585.86406 347.94336 583.4453 349.2168000000001 580.89844 351.7636700000001C580.13437 349.98086 578.09608 346.7331900000001 574.78516 342.02148C571.47422 337.30977 569.43789 333.55351 568.67383 330.75195C572.74882 327.9504 577.46017 325.84805 582.80859 324.44727C588.15702 323.04649 594.84259 321.77305 602.86523 320.62695C610.88787 319.48086 615.91758 318.78008 617.95508 318.52539C617.95508 319.28945 616.80976 322.21875 614.51758 327.3125C612.2254 332.4062400000001 610.06094 338.13673 608.02344 344.50391C605.98594 350.87108 604.9668 356.21915 604.9668 360.54883z" /> <glyph glyph-name="globe" - unicode="" + unicode="" horiz-adv-x="1200" d=" M377 1060Q484 1106 600 1106T822.5 1060T1006.5 936.5T1130 752.5T1176 530T1130 307.5T1006.5 123.5T822.5 0T600 -46T377.5 0T193.5 123.5T70 307.5T24 530T70 752.5T193.5 936.5T377 1060zM627 1031Q612 1019 590.5 1010.5T555 998.5T512 990.5T473 984Q458 981 427.5 984T382 982Q362 975 330.5 955.5T296 921Q293 910 302.5 898.5T311 880Q308 846 283.5 789T254 710Q245 676 259 617T267 530Q267 521 284 485.5T300 426Q312 426 323 421T346.5 406T366 392Q382 384 399 377T439.5 362T474 350Q495 341 526.5 318T586.5 280T644 269Q651 254 641 235T618.5 195T609 157Q622 136 632 122.5T659.5 95T696 77Q696 70 692.5 61T689 47T694 30Q798 28 915 142Q945 171 961.5 189T996 238T1017 301Q1004 309 980 309.5T944 317Q929 324 894.5 332T843 351Q825 351 802 350.5T759 349T717 342.5T679 326Q628 291 613 314Q609 315 609.5 339.5T610 365Q604 378 583.5 382.5T559 389Q560 404 558.5 419.5T551.5 447.5T533 459T502 438Q479 413 460 442Q441 470 452 500Q458 516 474 522Q480 521 500 520.5T533.5 516.5T553 503Q560 491 571 479T592.5 458.5T612.5 443.5T628 433L633 430Q635 442 640.5 460.5T648.5 495T648 527Q645 545 651.5 556T669.5 578.5T685 603Q691 617 695.5 638T703.5 669T719 691.5T753 714Q747 732 763 750Q771 750 787 748.5T811.5 747T831.5 751.5T852 767Q842 790 821 809.5T783.5 839T734.5 866T691 889Q691 890 693 897T696 908.5T697.5 919T696.5 928.5T692 933Q723 920 750.5 918.5T789 921L801 926Q806 954 791.5 972T755 996T705 1011T664 1031Q646 1027 627 1031zM613 924Q613 907 621 882T638 837T647 814Q639 815 607.5 819.5T555 829.5T518 846Q521 857 534 875.5T550 901Q560 891 569 891T583 897T596.5 911.5T613 924z" /> <glyph glyph-name="globe-1" unicode="globe" horiz-adv-x="1200" d=" M377 1060Q484 1106 600 1106T822.5 1060T1006.5 936.5T1130 752.5T1176 530T1130 307.5T1006.5 123.5T822.5 0T600 -46T377.5 0T193.5 123.5T70 307.5T24 530T70 752.5T193.5 936.5T377 1060zM627 1031Q612 1019 590.5 1010.5T555 998.5T512 990.5T473 984Q458 981 427.5 984T382 982Q362 975 330.5 955.5T296 921Q293 910 302.5 898.5T311 880Q308 846 283.5 789T254 710Q245 676 259 617T267 530Q267 521 284 485.5T300 426Q312 426 323 421T346.5 406T366 392Q382 384 399 377T439.5 362T474 350Q495 341 526.5 318T586.5 280T644 269Q651 254 641 235T618.5 195T609 157Q622 136 632 122.5T659.5 95T696 77Q696 70 692.5 61T689 47T694 30Q798 28 915 142Q945 171 961.5 189T996 238T1017 301Q1004 309 980 309.5T944 317Q929 324 894.5 332T843 351Q825 351 802 350.5T759 349T717 342.5T679 326Q628 291 613 314Q609 315 609.5 339.5T610 365Q604 378 583.5 382.5T559 389Q560 404 558.5 419.5T551.5 447.5T533 459T502 438Q479 413 460 442Q441 470 452 500Q458 516 474 522Q480 521 500 520.5T533.5 516.5T553 503Q560 491 571 479T592.5 458.5T612.5 443.5T628 433L633 430Q635 442 640.5 460.5T648.5 495T648 527Q645 545 651.5 556T669.5 578.5T685 603Q691 617 695.5 638T703.5 669T719 691.5T753 714Q747 732 763 750Q771 750 787 748.5T811.5 747T831.5 751.5T852 767Q842 790 821 809.5T783.5 839T734.5 866T691 889Q691 890 693 897T696 908.5T697.5 919T696.5 928.5T692 933Q723 920 750.5 918.5T789 921L801 926Q806 954 791.5 972T755 996T705 1011T664 1031Q646 1027 627 1031zM613 924Q613 907 621 882T638 837T647 814Q639 815 607.5 819.5T555 829.5T518 846Q521 857 534 875.5T550 901Q560 891 569 891T583 897T596.5 911.5T613 924z" /> <glyph glyph-name="grab-handle" - unicode="" + unicode="" horiz-adv-x="1200" d=" M348 1080L348 912L516 912L516 1080L348 1080zM684 1080L684 912L852 912L852 1080L684 1080zM348 564L348 396L516 396L516 564L348 564zM684 564L684 396L852 396L852 564L684 564zM348 48L348 -120L516 -120L516 48L348 48zM684 48L684 -120L852 -120L852 48L684 48z" /> <glyph glyph-name="grab-handle-1" unicode="grab-handle" horiz-adv-x="1200" d=" M348 1080L348 912L516 912L516 1080L348 1080zM684 1080L684 912L852 912L852 1080L684 1080zM348 564L348 396L516 396L516 564L348 564zM684 564L684 396L852 396L852 564L684 564zM348 48L348 -120L516 -120L516 48L348 48zM684 48L684 -120L852 -120L852 48L684 48z" /> <glyph glyph-name="gray-scale" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1200 1080V-120H0V1080H1200zM111 969V-9L1088 969H111z" /> <glyph glyph-name="gray-scale-1" unicode="gray-scale" horiz-adv-x="1200" d=" M1200 1080V-120H0V1080H1200zM111 969V-9L1088 969H111z" /> <glyph glyph-name="grid-custom" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 1080L0 1018L0 795L0 733L0 511L0 449L0 227L0 165L0 -58L0 -120L853 -120L915 -120L1200 -120L1200 -58L1200 1018L1200 1080L1138 1080L915 1080L853 1080L0 1080zM62 1018L285 1018L569 1018L631 1018L1138 1018L1138 795L631 795L569 795L285 795L285 511L285 449L285 165L285 -58L62 -58L62 449L62 511L62 1018zM347 733L569 733L711.5 733L773.5 733L1138 733L1138 511L773.5 511L711.5 511L569 511L569 368.5L569 306.5L569 165L569 -58L347 -58L347 306.5L347 368.5L347 449L347 733zM631 449L853 449L915 449L1138 449L1138 227L1138 165L1138 -58L915 -58L853 -58L631 -58L631 165L631 227L631 449z" /> <glyph glyph-name="grid-custom-1" unicode="grid-custom" horiz-adv-x="1200" d=" M0 1080L0 1018L0 795L0 733L0 511L0 449L0 227L0 165L0 -58L0 -120L853 -120L915 -120L1200 -120L1200 -58L1200 1018L1200 1080L1138 1080L915 1080L853 1080L0 1080zM62 1018L285 1018L569 1018L631 1018L1138 1018L1138 795L631 795L569 795L285 795L285 511L285 449L285 165L285 -58L62 -58L62 449L62 511L62 1018zM347 733L569 733L711.5 733L773.5 733L1138 733L1138 511L773.5 511L711.5 511L569 511L569 368.5L569 306.5L569 165L569 -58L347 -58L347 306.5L347 368.5L347 449L347 733zM631 449L853 449L915 449L1138 449L1138 227L1138 165L1138 -58L915 -58L853 -58L631 -58L631 165L631 227L631 449z" /> <glyph glyph-name="grid-regular" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 1080L0 1018L0 795L0 733L0 511L0 449L0 227L0 165L0 -58L0 -120L853 -120L915 -120L1200 -120L1200 -58L1200 1018L1200 1080L1138 1080L915 1080L853 1080L0 1080zM62 1018L285 1018L285 795L62 795L62 1018zM347 1018L569 1018L569 795L347 795L347 1018zM631 1018L853 1018L853 795L631 795L631 1018zM915 1018L1138 1018L1138 795L915 795L915 1018zM62 733L285 733L285 511L62 511L62 733zM347 733L569 733L569 511L347 511L347 733zM631 733L853 733L853 511L631 511L631 733zM915 733L1138 733L1138 511L915 511L915 733zM62 449L285 449L285 227L62 227L62 449zM347 449L569 449L569 227L347 227L347 449zM631 449L853 449L853 227L631 227L631 449zM915 449L1138 449L1138 227L915 227L915 449zM62 165L285 165L285 -58L62 -58L62 165zM347 165L569 165L569 -58L347 -58L347 165zM631 165L853 165L853 -58L631 -58L631 165zM915 165L1138 165L1138 -58L915 -58L915 165z" /> <glyph glyph-name="grid-regular-1" unicode="grid-regular" horiz-adv-x="1200" d=" M0 1080L0 1018L0 795L0 733L0 511L0 449L0 227L0 165L0 -58L0 -120L853 -120L915 -120L1200 -120L1200 -58L1200 1018L1200 1080L1138 1080L915 1080L853 1080L0 1080zM62 1018L285 1018L285 795L62 795L62 1018zM347 1018L569 1018L569 795L347 795L347 1018zM631 1018L853 1018L853 795L631 795L631 1018zM915 1018L1138 1018L1138 795L915 795L915 1018zM62 733L285 733L285 511L62 511L62 733zM347 733L569 733L569 511L347 511L347 733zM631 733L853 733L853 511L631 511L631 733zM915 733L1138 733L1138 511L915 511L915 733zM62 449L285 449L285 227L62 227L62 449zM347 449L569 449L569 227L347 227L347 449zM631 449L853 449L853 227L631 227L631 449zM915 449L1138 449L1138 227L915 227L915 449zM62 165L285 165L285 -58L62 -58L62 165zM347 165L569 165L569 -58L347 -58L347 165zM631 165L853 165L853 -58L631 -58L631 165zM915 165L1138 165L1138 -58L915 -58L915 165z" /> <glyph glyph-name="hand-down" - unicode="" + unicode="" horiz-adv-x="1200" d=" M697 1145V956H126V1145H697zM741 201Q741 -142 726 -149Q701 -179 669 -164T624.5 -141.5T607 -125Q539 103 519 116L183 256Q126 275 126 340V767Q126 808 154.5 835T221 862H697Q736 862 761 831L1074 521L1026 470Q997 449 975 449H959L741 499V201z" /> <glyph glyph-name="hand-down-1" unicode="hand-down" horiz-adv-x="1200" d=" M697 1145V956H126V1145H697zM741 201Q741 -142 726 -149Q701 -179 669 -164T624.5 -141.5T607 -125Q539 103 519 116L183 256Q126 275 126 340V767Q126 808 154.5 835T221 862H697Q736 862 761 831L1074 521L1026 470Q997 449 975 449H959L741 499V201z" /> <glyph glyph-name="hand-left" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1314 113H1125V684H1314V113zM668 728L618 946V962Q618 984 639 1013L690 1061L1000 748Q1031 723 1031 684V208Q1031 170 1004 141.5T936 113H509Q444 113 425 170L285 506Q272 526 44 594Q35 599 27.5 611.5T5 656T20 713Q27 728 370 728H668z" /> <glyph glyph-name="hand-left-1" unicode="hand-left" horiz-adv-x="1200" d=" M1314 113H1125V684H1314V113zM668 728L618 946V962Q618 984 639 1013L690 1061L1000 748Q1031 723 1031 684V208Q1031 170 1004 141.5T936 113H509Q444 113 425 170L285 506Q272 526 44 594Q35 599 27.5 611.5T5 656T20 713Q27 728 370 728H668z" /> <glyph glyph-name="hand-right" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 684H189V113H0V684zM944 728Q1287 728 1294 713Q1324 688 1309 656T1286.5 611.5T1270 594Q1042 526 1029 506L889 170Q870 113 805 113H378Q337 113 310 141.5T283 208V684Q283 723 314 748L624 1061L675 1013Q696 984 696 962V946L646 728H944z" /> <glyph glyph-name="hand-right-1" unicode="hand-right" horiz-adv-x="1200" d=" M0 684H189V113H0V684zM944 728Q1287 728 1294 713Q1324 688 1309 656T1286.5 611.5T1270 594Q1042 526 1029 506L889 170Q870 113 805 113H378Q337 113 310 141.5T283 208V684Q283 723 314 748L624 1061L675 1013Q696 984 696 962V946L646 728H944z" /> <glyph glyph-name="hand-up" - unicode="" + unicode="" horiz-adv-x="1200" d=" M473 -72V117H1044V-72H473zM429 872Q429 1215 444 1222Q469 1252 501 1237T545.5 1214.5T563 1198Q631 970 651 957L987 817Q1044 798 1044 733V306Q1044 265 1015.5 238T949 211H473Q434 211 409 242L96 552L144 603Q173 624 195 624H211L429 574V872z" /> <glyph glyph-name="hand-up-1" unicode="hand-up" horiz-adv-x="1200" d=" M473 -72V117H1044V-72H473zM429 872Q429 1215 444 1222Q469 1252 501 1237T545.5 1214.5T563 1198Q631 970 651 957L987 817Q1044 798 1044 733V306Q1044 265 1015.5 238T949 211H473Q434 211 409 242L96 552L144 603Q173 624 195 624H211L429 574V872z" /> <glyph glyph-name="hdd" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1184 211V-70H15V211H1184zM1099 140H955V0H1099V140zM1184 366H15L140 945H1063z" /> <glyph glyph-name="hdd-1" unicode="hdd" horiz-adv-x="1200" d=" M1184 211V-70H15V211H1184zM1099 140H955V0H1099V140zM1184 366H15L140 945H1063z" /> <glyph glyph-name="heart" - unicode="" + unicode="" horiz-adv-x="1200" d=" M600 10Q262 253 128 521Q72 638 116.5 767T283 944Q343 969 392.5 963T476 942.5T542.5 899T584.5 858T600 841L637 884Q678 928 749.5 951.5T915 942Q1039 896 1083 767T1070 521Q943 256 600 10z" /> <glyph glyph-name="heart-1" unicode="heart" horiz-adv-x="1200" d=" M600 10Q262 253 128 521Q72 638 116.5 767T283 944Q343 969 392.5 963T476 942.5T542.5 899T584.5 858T600 841L637 884Q678 928 749.5 951.5T915 942Q1039 896 1083 767T1070 521Q943 256 600 10z" /> <glyph glyph-name="height-auto" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 1080L0 792C0 779.3334 4.4999997 768.5 13.5 759.5C22.5 750.5 33.3334 746 46 746C58.6667 746 69.5 750.5 78.5 759.5C79.3025 760.3026 80.056109 761.12523 80.787109 761.95703L80.787109 993.13477L309.05859 993.13477C313.71949 995.45107 318.0363 998.7314 322 1003C330.6666 1012.3334 335 1023.3334 335 1036C335 1048 330.6666 1058.3333 322 1067C313.3333 1075.6667 303 1080 291 1080L0 1080zM945.54688 1080L944.5293 898.83008L944.5293 803.15625L953.68945 757.35352L933.8418 803.6640600000001L850.89062 900.86523L800 806.20898L999.49023 594.50391L1200 806.20898L1149.1094 900.86523L1066.666 803.15625L1045.293 757.35352L1054.4531 803.15625L1054.4531 898.83008L1054.9609 1079.4902299999999L945.54688 1080zM158.19336 608L158.19336 352L612.14648 352L612.14648 608L158.19336 608zM1000.5098 365.49609L800 153.791L850.89062 59.1348L933.33398 156.8438000000001L954.70703 202.64648L945.54688 156.8438000000001L945.54688 61.1699000000001L945.03906 -119.4901999999999L1054.4531 -120L1055.4707 61.1699000000001L1055.4707 156.8438000000001L1046.3105 202.64648L1066.1582 156.3359000000001L1149.1094 59.1348L1200 153.791L1000.5098 365.49609zM46 214C33.3334 214 22.5 209.5 13.5 200.5C4.4999997 191.5 0 180.3334 0 167L0 -120L291 -120C303 -120 313.3333 -115.8333 322 -107.5C330.6666 -99.1668 335 -88.3334 335 -75C335 -63 330.6666 -52.5 322 -43.5C317.9628 -39.3076000000001 313.55923 -36.1047000000001 308.79883 -33.8652L80.787109 -33.8652L80.787109 198.0352C80.056209 198.872 79.3023 199.6977000000001 78.5 200.5C69.5 209.5 58.6667 214 46 214z" /> <glyph glyph-name="height-auto-1" unicode="height-auto" horiz-adv-x="1200" d=" M0 1080L0 792C0 779.3334 4.4999997 768.5 13.5 759.5C22.5 750.5 33.3334 746 46 746C58.6667 746 69.5 750.5 78.5 759.5C79.3025 760.3026 80.056109 761.12523 80.787109 761.95703L80.787109 993.13477L309.05859 993.13477C313.71949 995.45107 318.0363 998.7314 322 1003C330.6666 1012.3334 335 1023.3334 335 1036C335 1048 330.6666 1058.3333 322 1067C313.3333 1075.6667 303 1080 291 1080L0 1080zM945.54688 1080L944.5293 898.83008L944.5293 803.15625L953.68945 757.35352L933.8418 803.6640600000001L850.89062 900.86523L800 806.20898L999.49023 594.50391L1200 806.20898L1149.1094 900.86523L1066.666 803.15625L1045.293 757.35352L1054.4531 803.15625L1054.4531 898.83008L1054.9609 1079.4902299999999L945.54688 1080zM158.19336 608L158.19336 352L612.14648 352L612.14648 608L158.19336 608zM1000.5098 365.49609L800 153.791L850.89062 59.1348L933.33398 156.8438000000001L954.70703 202.64648L945.54688 156.8438000000001L945.54688 61.1699000000001L945.03906 -119.4901999999999L1054.4531 -120L1055.4707 61.1699000000001L1055.4707 156.8438000000001L1046.3105 202.64648L1066.1582 156.3359000000001L1149.1094 59.1348L1200 153.791L1000.5098 365.49609zM46 214C33.3334 214 22.5 209.5 13.5 200.5C4.4999997 191.5 0 180.3334 0 167L0 -120L291 -120C303 -120 313.3333 -115.8333 322 -107.5C330.6666 -99.1668 335 -88.3334 335 -75C335 -63 330.6666 -52.5 322 -43.5C317.9628 -39.3076000000001 313.55923 -36.1047000000001 308.79883 -33.8652L80.787109 -33.8652L80.787109 198.0352C80.056209 198.872 79.3023 199.6977000000001 78.5 200.5C69.5 209.5 58.6667 214 46 214z" /> <glyph glyph-name="height-from-terrain" - unicode="" + unicode="" horiz-adv-x="1200" d=" M600 1080A158.89831 158.89831 0 0 1 441.10169 921.101694A158.89831 158.89831 0 0 1 600 762.20338A158.89831 158.89831 0 0 1 758.89831 921.101694A158.89831 158.89831 0 0 1 600 1080zM600 1018.953806A97.852635 97.852635 0 0 0 697.85211 921.101694A97.852635 97.852635 0 0 0 600 823.24958A97.852635 97.852635 0 0 0 502.14789 921.101694A97.852635 97.852635 0 0 0 600 1018.953806z M585.16949 676.3089299999999H614.830506V193.2203999999999H585.16949V676.3089299999999z M-0.0000062500003 -120L368.64406 218.64408L640.67796 27.9661000000001L920.33897 99.1525999999999L1200 -120z" /> <glyph glyph-name="height-from-terrain-1" unicode="height-from-terrain" horiz-adv-x="1200" d=" M600 1080A158.89831 158.89831 0 0 1 441.10169 921.101694A158.89831 158.89831 0 0 1 600 762.20338A158.89831 158.89831 0 0 1 758.89831 921.101694A158.89831 158.89831 0 0 1 600 1080zM600 1018.953806A97.852635 97.852635 0 0 0 697.85211 921.101694A97.852635 97.852635 0 0 0 600 823.24958A97.852635 97.852635 0 0 0 502.14789 921.101694A97.852635 97.852635 0 0 0 600 1018.953806z M585.16949 676.3089299999999H614.830506V193.2203999999999H585.16949V676.3089299999999z M-0.0000062500003 -120L368.64406 218.64408L640.67796 27.9661000000001L920.33897 99.1525999999999L1200 -120z" /> <glyph glyph-name="height-view" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0.00001375 1080V792C0.00001375 779.3334 4.5000137 768.5 13.500014 759.5C22.500014 750.5 33.333414 746 46.000014 746C58.666714 746 69.500014 750.5 78.500014 759.5C79.302514 760.3026 80.056114 761.12523 80.787114 761.95703V993.13477H309.05851C313.71941 995.45107 318.03631 998.7314 322.00001 1003C330.66661 1012.3334 335.00001 1023.3334 335.00001 1036C335.00001 1048 330.66661 1058.3333 322.00001 1067C313.33331 1075.6667 303.00001 1080 291.00001 1080zM1000.5098 1080L800.00001 868.29492L850.89061 773.63867L933.33395 871.34766L954.707 917.15039L945.54685 871.34766V775.67383L945.03903 595.01367L1054.4531 594.50391L1055.4707 775.67383V871.34766L1046.3105 917.15039L1066.1582 870.83984L1149.1094 773.63867L1200 868.29492zM158.19331 901.58203V48.5039000000002H612.14641V901.58203zM946.05661 364.47852L946.56442 183.8164000000001V88.1426000000001L954.707 42.3418000000002L934.85935 88.6523L851.40031 185.3438L801.01751 92.2129L1001.0176 -120L1200 91.1952999999999L1149.6191 186.3613L1067.1758 88.6523L1047.3281 42.3418000000002L1055.4707 88.1426000000001V183.8164000000001L1054.9609 364.47852zM46.000014 214C33.333414 214 22.500014 209.5 13.500014 200.5C4.5000137 191.5 0.00001375 180.3334 0.00001375 167V-120H291.00001C303.00001 -120 313.33331 -115.8333 322.00001 -107.5C330.66661 -99.1668 335.00001 -88.3334 335.00001 -75C335.00001 -63 330.66661 -52.5 322.00001 -43.5C317.96281 -39.3076000000001 313.55921 -36.1046999999999 308.79881 -33.8652H80.787114V198.0352C80.056214 198.872 79.302314 199.6977000000001 78.500014 200.5C69.500014 209.5 58.666714 214 46.000014 214z" /> <glyph glyph-name="height-view-1" unicode="height-view" horiz-adv-x="1200" d=" M0.00001375 1080V792C0.00001375 779.3334 4.5000137 768.5 13.500014 759.5C22.500014 750.5 33.333414 746 46.000014 746C58.666714 746 69.500014 750.5 78.500014 759.5C79.302514 760.3026 80.056114 761.12523 80.787114 761.95703V993.13477H309.05851C313.71941 995.45107 318.03631 998.7314 322.00001 1003C330.66661 1012.3334 335.00001 1023.3334 335.00001 1036C335.00001 1048 330.66661 1058.3333 322.00001 1067C313.33331 1075.6667 303.00001 1080 291.00001 1080zM1000.5098 1080L800.00001 868.29492L850.89061 773.63867L933.33395 871.34766L954.707 917.15039L945.54685 871.34766V775.67383L945.03903 595.01367L1054.4531 594.50391L1055.4707 775.67383V871.34766L1046.3105 917.15039L1066.1582 870.83984L1149.1094 773.63867L1200 868.29492zM158.19331 901.58203V48.5039000000002H612.14641V901.58203zM946.05661 364.47852L946.56442 183.8164000000001V88.1426000000001L954.707 42.3418000000002L934.85935 88.6523L851.40031 185.3438L801.01751 92.2129L1001.0176 -120L1200 91.1952999999999L1149.6191 186.3613L1067.1758 88.6523L1047.3281 42.3418000000002L1055.4707 88.1426000000001V183.8164000000001L1054.9609 364.47852zM46.000014 214C33.333414 214 22.500014 209.5 13.500014 200.5C4.5000137 191.5 0.00001375 180.3334 0.00001375 167V-120H291.00001C303.00001 -120 313.33331 -115.8333 322.00001 -107.5C330.66661 -99.1668 335.00001 -88.3334 335.00001 -75C335.00001 -63 330.66661 -52.5 322.00001 -43.5C317.96281 -39.3076000000001 313.55921 -36.1046999999999 308.79881 -33.8652H80.787114V198.0352C80.056214 198.872 79.302314 199.6977000000001 78.500014 200.5C69.500014 209.5 58.666714 214 46.000014 214z" /> <glyph glyph-name="hide-marker" - unicode="" + unicode="" horiz-adv-x="1200" d=" M599.47852 1079.7402299999999C522.18802 1079.7402299999999 444.98399 1063.76105 367.86719 1031.8027299999999C216.41255 969.97034 110.11811 863.32572 48.980469 711.87109C-16.325655 557.63748 -16.325655 403.0572600000001 48.980469 248.12891C110.11811 96.6742999999999 216.41255 -9.9703 367.86719 -71.8027C522.10079 -135.7193999999999 676.68297 -135.7193999999999 831.61133 -71.8027C980.9817 -9.9703 1087.6243 96.6742999999999 1151.541 248.12891C1216.1523 403.0572600000001 1216.1523 557.63748 1151.541 711.87109C1087.6243 863.32572 980.9817 969.97034 831.61133 1031.8027299999999C754.14715 1063.76105 676.76901 1079.7402299999999 599.47852 1079.7402299999999zM593.40039 942.21094C595.33562 942.21212 597.27563 942.2014 599.21875 942.17969C676.33556 942.17969 762.13563 914.39023 856.62109 858.8105499999999L757.54102 759.4042999999999C755.63923 761.43788 753.7053 763.45876 751.70898 765.45508C709.55057 807.61349 658.87924 828.69336 599.69531 828.69336C540.51139 828.69336 489.94206 807.61349 447.98633 765.45508C406.0306 723.29666 385.05273 672.82738 385.05273 614.04883C385.05273 560.10381 398.85889 497.8286000000001 426.46094 427.22852L225.09766 225.2011700000001C167.43374 318.9918800000001 138.60156 404.09942 138.60156 480.52148C137.21207 604.88102 182.54381 713.26089 274.59766 805.66211C365.21315 896.61956 471.48086 942.13614 593.40039 942.21094zM983.75977 727.50391C1035.171 634.40794 1060.877 552.08032 1060.877 480.52148C1062.9612 355.4672000000001 1017.9757 246.7390900000001 925.92188 154.3379C833.86802 61.9367 724.96778 16.4308000000001 599.21875 17.8203000000001C524.88093 17.8203000000001 442.89958 44.9152999999999 353.27734 99.1054999999999L510.81055 256.11914C536.50255 211.80562 566.13005 165.117 599.69531 116.0527C721.06619 292.96625 791.10513 438.99339 809.82227 554.14062L983.75977 727.50391zM600 671.18555A87.711861 87.711861 0 0 0 687.71094 583.47461A87.711861 87.711861 0 0 0 600 495.76367A87.711861 87.711861 0 0 0 512.28906 583.47461A87.711861 87.711861 0 0 0 600 671.18555z" /> <glyph glyph-name="hide-marker-1" unicode="hide-marker" horiz-adv-x="1200" d=" M599.47852 1079.7402299999999C522.18802 1079.7402299999999 444.98399 1063.76105 367.86719 1031.8027299999999C216.41255 969.97034 110.11811 863.32572 48.980469 711.87109C-16.325655 557.63748 -16.325655 403.0572600000001 48.980469 248.12891C110.11811 96.6742999999999 216.41255 -9.9703 367.86719 -71.8027C522.10079 -135.7193999999999 676.68297 -135.7193999999999 831.61133 -71.8027C980.9817 -9.9703 1087.6243 96.6742999999999 1151.541 248.12891C1216.1523 403.0572600000001 1216.1523 557.63748 1151.541 711.87109C1087.6243 863.32572 980.9817 969.97034 831.61133 1031.8027299999999C754.14715 1063.76105 676.76901 1079.7402299999999 599.47852 1079.7402299999999zM593.40039 942.21094C595.33562 942.21212 597.27563 942.2014 599.21875 942.17969C676.33556 942.17969 762.13563 914.39023 856.62109 858.8105499999999L757.54102 759.4042999999999C755.63923 761.43788 753.7053 763.45876 751.70898 765.45508C709.55057 807.61349 658.87924 828.69336 599.69531 828.69336C540.51139 828.69336 489.94206 807.61349 447.98633 765.45508C406.0306 723.29666 385.05273 672.82738 385.05273 614.04883C385.05273 560.10381 398.85889 497.8286000000001 426.46094 427.22852L225.09766 225.2011700000001C167.43374 318.9918800000001 138.60156 404.09942 138.60156 480.52148C137.21207 604.88102 182.54381 713.26089 274.59766 805.66211C365.21315 896.61956 471.48086 942.13614 593.40039 942.21094zM983.75977 727.50391C1035.171 634.40794 1060.877 552.08032 1060.877 480.52148C1062.9612 355.4672000000001 1017.9757 246.7390900000001 925.92188 154.3379C833.86802 61.9367 724.96778 16.4308000000001 599.21875 17.8203000000001C524.88093 17.8203000000001 442.89958 44.9152999999999 353.27734 99.1054999999999L510.81055 256.11914C536.50255 211.80562 566.13005 165.117 599.69531 116.0527C721.06619 292.96625 791.10513 438.99339 809.82227 554.14062L983.75977 727.50391zM600 671.18555A87.711861 87.711861 0 0 0 687.71094 583.47461A87.711861 87.711861 0 0 0 600 495.76367A87.711861 87.711861 0 0 0 512.28906 583.47461A87.711861 87.711861 0 0 0 600 671.18555z" /> <glyph glyph-name="home" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1116 -66H760V490H439V-66H84V681L599 1136L1116 681V-66z" /> <glyph glyph-name="home-1" unicode="home" horiz-adv-x="1200" d=" M1116 -66H760V490H439V-66H84V681L599 1136L1116 681V-66z" /> <glyph glyph-name="hourglass" - unicode="" + unicode="" horiz-adv-x="1200" d=" M993 1045Q984 907 917.5 759T751 537Q851 457 917.5 306T993 19H1093V-69H106V19H209Q217 155 283.5 306T448 537Q350 611 283.5 759T209 1045H106V1128H1093V1045H993zM483 799L600 590L718 799H483zM600 450L381 111H821z" /> <glyph glyph-name="hourglass-1" unicode="hourglass" horiz-adv-x="1200" d=" M993 1045Q984 907 917.5 759T751 537Q851 457 917.5 306T993 19H1093V-69H106V19H209Q217 155 283.5 306T448 537Q350 611 283.5 759T209 1045H106V1128H1093V1045H993zM483 799L600 590L718 799H483zM600 450L381 111H821z" /> <glyph glyph-name="import" - unicode="" + unicode="" horiz-adv-x="1200" d=" M15 144V-72H1185V144H15zM1123 -18H1010V89H1123V-18zM1002 788Q991 820 960 838T897 850Q864 842 848 813.5T842 753L911 555L395 887L305 752L807 429L621 410Q587 406 568.5 380T557 321Q561 304 572.5 289.5T598 267Q625 247 657 252L1167 303zM131 1057L308 941L221 803L42 917z" /> <glyph glyph-name="import-1" unicode="import" horiz-adv-x="1200" d=" M15 144V-72H1185V144H15zM1123 -18H1010V89H1123V-18zM1002 788Q991 820 960 838T897 850Q864 842 848 813.5T842 753L911 555L395 887L305 752L807 429L621 410Q587 406 568.5 380T557 321Q561 304 572.5 289.5T598 267Q625 247 657 252L1167 303zM131 1057L308 941L221 803L42 917z" /> <glyph glyph-name="inbox" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1182 388V61H17V388L139 965H1060zM869 476H1074L986 877H212L125 476H328V469V307Q328 273 350.5 252T405 231H794Q828 231 848.5 252T869 307V469V476z" /> <glyph glyph-name="inbox-1" unicode="inbox" horiz-adv-x="1200" d=" M1182 388V61H17V388L139 965H1060zM869 476H1074L986 877H212L125 476H328V469V307Q328 273 350.5 252T405 231H794Q828 231 848.5 252T869 307V469V476z" /> <glyph glyph-name="info-sign" - unicode="" + unicode="" horiz-adv-x="1200" d=" M601 1072Q837 1072 1004 902.5T1171 497T1004 92T601 -77Q364 -77 196.5 92T29 497T196.5 902.5T601 1072zM685 894Q639 894 611 862.5T583 800Q576 724 660 724Q702 724 731.5 751.5T761 818Q761 894 685 894zM522 119Q635 119 769 254L745 285Q682 239 652 239Q635 239 649 288L702 497Q734 624 675 624Q635 624 557 585T411 488L430 455Q504 497 529 497Q539 497 529 455L479 254Q448 119 522 119z" /> <glyph glyph-name="info-sign-1" unicode="info-sign" horiz-adv-x="1200" d=" M601 1072Q837 1072 1004 902.5T1171 497T1004 92T601 -77Q364 -77 196.5 92T29 497T196.5 902.5T601 1072zM685 894Q639 894 611 862.5T583 800Q576 724 660 724Q702 724 731.5 751.5T761 818Q761 894 685 894zM522 119Q635 119 769 254L745 285Q682 239 652 239Q635 239 649 288L702 497Q734 624 675 624Q635 624 557 585T411 488L430 455Q504 497 529 497Q539 497 529 455L479 254Q448 119 522 119z" /> <glyph glyph-name="italic" - unicode="" + unicode="" horiz-adv-x="1200" d=" M506 1002V1104H930V1002L798 979L575 51L706 28V-74H283V28L414 51L638 979z" /> <glyph glyph-name="italic-1" unicode="italic" horiz-adv-x="1200" d=" M506 1002V1104H930V1002L798 979L575 51L706 28V-74H283V28L414 51L638 979z" /> <glyph glyph-name="layer-info" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1135.2988 1080C1120.0776 1078.01115 1107.4861 1071.4201600000001 1097.5293 1060.21875C1085.4229 1046.59913 1079.3691 1033.08703 1079.3691 1019.68359C1076.3426 986.82354 1092.9875 970.39453 1129.3066 970.39453C1147.4661 970.39453 1162.9248 976.34031 1175.6797 988.23047C1188.4345 1000.12062 1194.8105 1014.49699 1194.8105 1031.3593799999999C1194.8105 1060.4826600000001 1181.8955 1076.68817 1156.084 1080L1135.2988 1080zM1139.0352 905.53906C1121.7404 905.53906 1096.2307 897.1085 1062.5059 880.24609C1028.7811 863.38369 997.21951 842.41333 967.81836 817.3359399999999L980.14062 795.93359C1012.136 814.0930900000001 1033.5385 823.17187 1044.3477 823.17188C1048.6714 823.17188 1048.6714 814.0930900000001 1044.3477 795.93359L1011.9199 665.57422C998.51656 607.2044 1007.8114 578.01953 1039.8066 578.01953C1088.6644 578.01953 1142.0625 607.2044 1200 665.57422L1184.4355 685.67969C1157.1963 665.79069 1137.0902 655.8457 1124.1191 655.8457C1116.7688 655.8457 1116.1205 666.4389 1122.1738 687.625L1156.5469 823.17188C1170.3827 878.08275 1164.545 905.53906 1139.0352 905.53906zM404 778L0 358L535 88L939 510L404 778zM876 360L538 4L84 230L7 160L557 -120L971 307L876 360z" /> <glyph glyph-name="layer-info-1" unicode="layer-info" horiz-adv-x="1200" d=" M1135.2988 1080C1120.0776 1078.01115 1107.4861 1071.4201600000001 1097.5293 1060.21875C1085.4229 1046.59913 1079.3691 1033.08703 1079.3691 1019.68359C1076.3426 986.82354 1092.9875 970.39453 1129.3066 970.39453C1147.4661 970.39453 1162.9248 976.34031 1175.6797 988.23047C1188.4345 1000.12062 1194.8105 1014.49699 1194.8105 1031.3593799999999C1194.8105 1060.4826600000001 1181.8955 1076.68817 1156.084 1080L1135.2988 1080zM1139.0352 905.53906C1121.7404 905.53906 1096.2307 897.1085 1062.5059 880.24609C1028.7811 863.38369 997.21951 842.41333 967.81836 817.3359399999999L980.14062 795.93359C1012.136 814.0930900000001 1033.5385 823.17187 1044.3477 823.17188C1048.6714 823.17188 1048.6714 814.0930900000001 1044.3477 795.93359L1011.9199 665.57422C998.51656 607.2044 1007.8114 578.01953 1039.8066 578.01953C1088.6644 578.01953 1142.0625 607.2044 1200 665.57422L1184.4355 685.67969C1157.1963 665.79069 1137.0902 655.8457 1124.1191 655.8457C1116.7688 655.8457 1116.1205 666.4389 1122.1738 687.625L1156.5469 823.17188C1170.3827 878.08275 1164.545 905.53906 1139.0352 905.53906zM404 778L0 358L535 88L939 510L404 778zM876 360L538 4L84 230L7 160L557 -120L971 307L876 360z" /> <glyph glyph-name="leaf" - unicode="" + unicode="" horiz-adv-x="1200" d=" M836 955Q860 960 889 969.5T949 990.5T1011.5 1015.5T1072 1042Q1141 1073 1213 1108Q1203 1033 1189 967.5T1156 829Q1127 723 1086 624T985 433Q942 364 888.5 306.5T766 204Q711 166 650 143.5T522 112Q430 99 340 110.5T162 149Q160 149 156 151H153Q127 103 117.5 51T107 -55H3Q3 4 12.5 61T48 172Q53 184 56 190Q60 192 61 194Q61 195 66.5 204T85 228.5T120.5 264.5T176 309Q219 335 275 361.5T392 412.5T516.5 460T640 503Q780 550 929 592Q802 598 659 574Q598 564 527 546T378.5 500T218 432T51 338Q51 386 61.5 442T102 551Q137 620 189 673.5T307 769Q364 806 424.5 832T551 878Q622 898 692.5 918.5T836 955z" /> <glyph glyph-name="leaf-1" unicode="leaf" horiz-adv-x="1200" d=" M836 955Q860 960 889 969.5T949 990.5T1011.5 1015.5T1072 1042Q1141 1073 1213 1108Q1203 1033 1189 967.5T1156 829Q1127 723 1086 624T985 433Q942 364 888.5 306.5T766 204Q711 166 650 143.5T522 112Q430 99 340 110.5T162 149Q160 149 156 151H153Q127 103 117.5 51T107 -55H3Q3 4 12.5 61T48 172Q53 184 56 190Q60 192 61 194Q61 195 66.5 204T85 228.5T120.5 264.5T176 309Q219 335 275 361.5T392 412.5T516.5 460T640 503Q780 550 929 592Q802 598 659 574Q598 564 527 546T378.5 500T218 432T51 338Q51 386 61.5 442T102 551Q137 620 189 673.5T307 769Q364 806 424.5 832T551 878Q622 898 692.5 918.5T836 955z" /> <glyph glyph-name="level-up" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1212 896V813H955V1033L887 943Q857 906 830 940Q805 966 828 1007L999 1227L1166 1007Q1180 989 1180 976Q1180 952 1164 940Q1137 906 1110 943L1039 1033V896H1212zM1376 518L1126 -66V-69H68L316 516L317 518H1197H1376zM285 649Q249 649 221 626.5T187 570L0 117V824Q0 844 11.5 857.5T45 873H53H366Q404 873 420 837Q422 829 422 823V807L426 793L432 780Q439 769 448 763.5T472 758Q477 754 479.5 753.5T484 753H1122Q1138 753 1149.5 749.5T1171 731Q1173 726 1177 720.5T1181 705Q1183 692 1182 680.5T1181 655V649H285z" /> <glyph glyph-name="level-up-1" unicode="level-up" horiz-adv-x="1200" d=" M1212 896V813H955V1033L887 943Q857 906 830 940Q805 966 828 1007L999 1227L1166 1007Q1180 989 1180 976Q1180 952 1164 940Q1137 906 1110 943L1039 1033V896H1212zM1376 518L1126 -66V-69H68L316 516L317 518H1197H1376zM285 649Q249 649 221 626.5T187 570L0 117V824Q0 844 11.5 857.5T45 873H53H366Q404 873 420 837Q422 829 422 823V807L426 793L432 780Q439 769 448 763.5T472 758Q477 754 479.5 753.5T484 753H1122Q1138 753 1149.5 749.5T1171 731Q1173 726 1177 720.5T1181 705Q1183 692 1182 680.5T1181 655V649H285z" /> <glyph glyph-name="line-dash" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L381 756L315 690L212 794Q206 791 199 788Q175 780 150 780Q126 780 104 788Q102 788 100 789T95 791Q89 793 84 796Q83 796 81 797L71 803Q70 804 68 805Q64 807 60 811Q58 812 56 814Q0 859 0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855T203 877T225 930T203 983T150 1005zM452 685L522 615L457 549L386 620zM593 544L664 473L598 407L527 478zM735 402L805 332L740 266L669 337zM876 261L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 939 -71Q936 -68 934 -64L929 -59Q927 -56 925 -52.5T921 -46T918 -40Q916 -36 914 -33L912 -27Q910 -23 908 -18Q900 5 900 30Q900 54 908 76V79Q911 85 914 92L810 195zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105z" /> <glyph glyph-name="line-dash-1" unicode="line-dash" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L381 756L315 690L212 794Q206 791 199 788Q175 780 150 780Q126 780 104 788Q102 788 100 789T95 791Q89 793 84 796Q83 796 81 797L71 803Q70 804 68 805Q64 807 60 811Q58 812 56 814Q0 859 0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855T203 877T225 930T203 983T150 1005zM452 685L522 615L457 549L386 620zM593 544L664 473L598 407L527 478zM735 402L805 332L740 266L669 337zM876 261L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 939 -71Q936 -68 934 -64L929 -59Q927 -56 925 -52.5T921 -46T918 -40Q916 -36 914 -33L912 -27Q910 -23 908 -18Q900 5 900 30Q900 54 908 76V79Q911 85 914 92L810 195zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105z" /> <glyph glyph-name="line-minus" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L212 794Q206 791 199 788Q175 780 150 780Q126 780 104 788H101Q98 789 95 791Q90 793 84 795Q83 796 81 797Q77 799 72 802Q70 803 68 805Q64 807 60 810Q58 812 55 814Q51 818 46 822L45 823Q0 867 0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855T203 877T225 930T203 983T150 1005zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM1159 789H741Q725 789 712.5 801T700 830T712.5 859T741 871H1159Q1177 871 1188.5 859T1200 830T1188.5 801T1159 789z" /> <glyph glyph-name="line-minus-1" unicode="line-minus" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L212 794Q206 791 199 788Q175 780 150 780Q126 780 104 788H101Q98 789 95 791Q90 793 84 795Q83 796 81 797Q77 799 72 802Q70 803 68 805Q64 807 60 810Q58 812 55 814Q51 818 46 822L45 823Q0 867 0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855T203 877T225 930T203 983T150 1005zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM1159 789H741Q725 789 712.5 801T700 830T712.5 859T741 871H1159Q1177 871 1188.5 859T1200 830T1188.5 801T1159 789z" /> <glyph glyph-name="line-plus" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L212 794Q206 791 199 788Q175 780 150 780Q126 780 104 788H101Q98 789 95 791Q90 793 84 795Q83 796 81 797Q77 799 72 802Q70 803 68 805Q64 807 60 810Q58 812 55 814Q51 818 46 822L45 823Q0 867 0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855T203 877T225 930T203 983T150 1005zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM741 789Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080T979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741z" /> <glyph glyph-name="line-plus-1" unicode="line-plus" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L212 794Q206 791 199 788Q175 780 150 780Q126 780 104 788H101Q98 789 95 791Q90 793 84 795Q83 796 81 797Q77 799 72 802Q70 803 68 805Q64 807 60 810Q58 812 55 814Q51 818 46 822L45 823Q0 867 0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855T203 877T225 930T203 983T150 1005zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM741 789Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080T979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741z" /> <glyph glyph-name="line-remove" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L212 794Q206 791 199 788Q175 780 150 780Q126 780 104 788H101Q98 789 95 791Q90 793 84 795Q83 796 81 797Q77 799 72 802Q70 803 68 805Q64 807 60 810Q58 812 55 814Q51 818 46 822L45 823Q0 867 0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855T203 877T225 930T203 983T150 1005zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM773 949Q761 961 761.5 978T774 1007T802.5 1019T831 1007L949 888L1069 1008Q1081 1020 1098 1019.5T1127 1007T1139 978T1127 949L1008 830L1127 710Q1138 699 1138.5 682.5T1127 653.5T1098 641.5T1070 653L950 772L831 653Q819 640 802 640.5T773 653.5T760.5 682.5T772 712L892 831z" /> <glyph glyph-name="line-remove-1" unicode="line-remove" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L212 794Q206 791 199 788Q175 780 150 780Q126 780 104 788H101Q98 789 95 791Q90 793 84 795Q83 796 81 797Q77 799 72 802Q70 803 68 805Q64 807 60 810Q58 812 55 814Q51 818 46 822L45 823Q0 867 0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855T203 877T225 930T203 983T150 1005zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM773 949Q761 961 761.5 978T774 1007T802.5 1019T831 1007L949 888L1069 1008Q1081 1020 1098 1019.5T1127 1007T1139 978T1127 949L1008 830L1127 710Q1138 699 1138.5 682.5T1127 653.5T1098 641.5T1070 653L950 772L831 653Q819 640 802 640.5T773 653.5T760.5 682.5T772 712L892 831z" /> <glyph glyph-name="line-trash" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L212 794Q206 791 199 788Q175 780 150 780Q126 780 104 788H101Q98 789 95 791Q90 793 84 795Q83 796 81 797Q77 799 72 802Q70 803 68 805Q64 807 60 810Q58 812 55 814Q51 818 46 822L45 823Q0 867 0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855T203 877T225 930T203 983T150 1005zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM1176 994Q1200 994 1200 969.5T1176 945H723Q700 945 700 969.5T723 994H790V1019Q790 1044 804.5 1062T838 1080H1061Q1082 1080 1096 1062T1110 1019V994H1176zM814 994H1086V1019Q1086 1055 1061 1055H838Q814 1055 814 1019V994zM1164 882L1102 418H796L735 882H1164zM863 452Q881 456 881 475L843 831Q838 853 820 850Q802 850 802 829L841 470Q841 452 860 452H863zM970 831Q970 850 949.5 850T929 831V472Q929 452 949.5 452T970 472V831zM1097 829Q1097 850 1080 850Q1061 853 1058 831L1019 475Q1019 456 1037 452H1038Q1059 452 1059 470z" /> <glyph glyph-name="line-trash-1" unicode="line-trash" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L212 794Q206 791 199 788Q175 780 150 780Q126 780 104 788H101Q98 789 95 791Q90 793 84 795Q83 796 81 797Q77 799 72 802Q70 803 68 805Q64 807 60 810Q58 812 55 814Q51 818 46 822L45 823Q0 867 0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855T203 877T225 930T203 983T150 1005zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM1176 994Q1200 994 1200 969.5T1176 945H723Q700 945 700 969.5T723 994H790V1019Q790 1044 804.5 1062T838 1080H1061Q1082 1080 1096 1062T1110 1019V994H1176zM814 994H1086V1019Q1086 1055 1061 1055H838Q814 1055 814 1019V994zM1164 882L1102 418H796L735 882H1164zM863 452Q881 456 881 475L843 831Q838 853 820 850Q802 850 802 829L841 470Q841 452 860 452H863zM970 831Q970 850 949.5 850T929 831V472Q929 452 949.5 452T970 472V831zM1097 829Q1097 850 1080 850Q1061 853 1058 831L1019 475Q1019 456 1037 452H1038Q1059 452 1059 470z" /> <glyph glyph-name="line" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L212 794Q206 791 199 788Q175 780 150 780Q126 780 104 788H101Q98 789 95 791Q90 793 84 795Q83 796 81 797Q77 799 72 802Q70 803 68 805Q64 807 60 810Q58 812 55 814Q51 818 46 822L45 823Q0 867 0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855T203 877T225 930T203 983T150 1005zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105z" /> <glyph glyph-name="line-1" unicode="line" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L212 794Q206 791 199 788Q175 780 150 780Q126 780 104 788H101Q98 789 95 791Q90 793 84 795Q83 796 81 797Q77 799 72 802Q70 803 68 805Q64 807 60 810Q58 812 55 814Q51 818 46 822L45 823Q0 867 0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855T203 877T225 930T203 983T150 1005zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105z" /> <glyph glyph-name="link" - unicode="" + unicode="" horiz-adv-x="1200" d=" M277 264V453H422V264Q422 193 474 142.5T598.5 92T724.5 142.5T778 264V453H922V264Q922 134 826 38T598 -58T371.5 38T277 264zM922 558H778V747Q778 817 724.5 868.5T598.5 920T474 868.5T422 747V558H277V747Q277 878 371.5 973.5T598 1069T826 973.5T922 747V558zM526 330V677Q526 709 547.5 730T598.5 751T649.5 730T671 677V330Q671 302 649.5 280.5T598.5 259T547.5 280.5T526 330z" /> <glyph glyph-name="link-1" unicode="link" horiz-adv-x="1200" d=" M277 264V453H422V264Q422 193 474 142.5T598.5 92T724.5 142.5T778 264V453H922V264Q922 134 826 38T598 -58T371.5 38T277 264zM922 558H778V747Q778 817 724.5 868.5T598.5 920T474 868.5T422 747V558H277V747Q277 878 371.5 973.5T598 1069T826 973.5T922 747V558zM526 330V677Q526 709 547.5 730T598.5 751T649.5 730T671 677V330Q671 302 649.5 280.5T598.5 259T547.5 280.5T526 330z" /> <glyph glyph-name="list-alt" - unicode="" + unicode="" horiz-adv-x="1200" d=" M383 712Q383 692 368 676T331 660Q283 660 283 712Q283 763 331 763Q383 763 383 712zM331 415Q283 415 283 466.5T331 518Q353 518 368 503T383 467T368 430.5T331 415zM383 222Q383 173 331 173Q283 173 283 222Q283 273 331 273Q353 273 368 257.5T383 222zM1062 1128V-79H138V1128H1062zM985 -4V925H213V-4H985zM462 751H899V672H462V751zM462 505H899V429H462V505zM462 264H899V184H462V264z" /> <glyph glyph-name="list-alt-1" unicode="list-alt" horiz-adv-x="1200" d=" M383 712Q383 692 368 676T331 660Q283 660 283 712Q283 763 331 763Q383 763 383 712zM331 415Q283 415 283 466.5T331 518Q353 518 368 503T383 467T368 430.5T331 415zM383 222Q383 173 331 173Q283 173 283 222Q283 273 331 273Q353 273 368 257.5T383 222zM1062 1128V-79H138V1128H1062zM985 -4V925H213V-4H985zM462 751H899V672H462V751zM462 505H899V429H462V505zM462 264H899V184H462V264z" /> <glyph glyph-name="list" - unicode="" + unicode="" horiz-adv-x="1200" d=" M42 972H156V860H42V972zM331 972H1157V860H331V972zM42 674H156V560H42V674zM331 674H1157V560H331V674zM42 374H156V260H42V374zM331 374H1157V260H331V374zM42 73H156V-39H42V73zM331 73H1157V-39H331V73z" /> <glyph glyph-name="list-1" unicode="list" horiz-adv-x="1200" d=" M42 972H156V860H42V972zM331 972H1157V860H331V972zM42 674H156V560H42V674zM331 674H1157V560H331V674zM42 374H156V260H42V374zM331 374H1157V260H331V374zM42 73H156V-39H42V73zM331 73H1157V-39H331V73z" /> <glyph glyph-name="lock" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1007 781Q1037 781 1063 770T1108.5 739.5T1139.5 694T1151 639V69Q1151 39 1139.5 13T1108.5 -32.5T1063 -63T1007 -74H195Q166 -74 140 -63T94.5 -32.5T64 13T53 69V639Q53 668 64 694T94.5 739.5T140 770T195 781H242V927Q242 961 253.5 991.5T284.5 1044.5T331 1080T388 1093H815Q845 1093 872 1080T918.5 1044.5T949.5 991.5T961 927V781H1007zM638 393Q655 403 665.5 420T676 458Q676 490 654.5 512T602 534Q570 534 548 512T526 458Q526 437 536.5 420T564 393L527 134H676zM812 927Q812 939 808 943H395Q393 941 391.5 937T390 927V781H812V927z" /> <glyph glyph-name="lock-1" unicode="lock" horiz-adv-x="1200" d=" M1007 781Q1037 781 1063 770T1108.5 739.5T1139.5 694T1151 639V69Q1151 39 1139.5 13T1108.5 -32.5T1063 -63T1007 -74H195Q166 -74 140 -63T94.5 -32.5T64 13T53 69V639Q53 668 64 694T94.5 739.5T140 770T195 781H242V927Q242 961 253.5 991.5T284.5 1044.5T331 1080T388 1093H815Q845 1093 872 1080T918.5 1044.5T949.5 991.5T961 927V781H1007zM638 393Q655 403 665.5 420T676 458Q676 490 654.5 512T602 534Q570 534 548 512T526 458Q526 437 536.5 420T564 393L527 134H676zM812 927Q812 939 808 943H395Q393 941 391.5 937T390 927V781H812V927z" /> <glyph glyph-name="log-in" - unicode="" + unicode="" horiz-adv-x="1200" d=" M36 484H480L402 551Q372 582 401 614T458 618L659 438L458 258Q447 247 430 247Q417 247 402 262Q372 295 402 322L480 392H36V484zM379 950H924Q1025 950 1094.5 880.5T1164 710V167Q1164 66 1094.5 -4T924 -74H379Q280 -74 209.5 -4T139 167H218Q218 97 264.5 51.5T379 6H924Q993 6 1039.5 51.5T1086 167V710Q1086 779 1039.5 825T924 871H379Q311 871 264.5 825T218 710H139Q139 811 209.5 880.5T379 950z" /> <glyph glyph-name="log-in-1" unicode="log-in" horiz-adv-x="1200" d=" M36 484H480L402 551Q372 582 401 614T458 618L659 438L458 258Q447 247 430 247Q417 247 402 262Q372 295 402 322L480 392H36V484zM379 950H924Q1025 950 1094.5 880.5T1164 710V167Q1164 66 1094.5 -4T924 -74H379Q280 -74 209.5 -4T139 167H218Q218 97 264.5 51.5T379 6H924Q993 6 1039.5 51.5T1086 167V710Q1086 779 1039.5 825T924 871H379Q311 871 264.5 825T218 710H139Q139 811 209.5 880.5T379 950z" /> <glyph glyph-name="log-out" - unicode="" + unicode="" horiz-adv-x="1200" d=" M536 487H978L904 555Q871 580 898 618Q925 650 961 622L1159 442L961 262Q950 249 931.5 249T898 264Q871 302 904 325L978 396H536V487zM826 -73H281Q181 -73 111 -2.5T41 169V715Q41 816 111 885.5T281 955H826Q929 955 998.5 885.5T1068 715H988Q988 784 942 830T826 876H281Q213 876 166.5 830T120 715V169Q120 99 166.5 53T281 7H826Q896 7 942 53T988 169H1068Q1068 68 998.5 -2.5T826 -73z" /> <glyph glyph-name="log-out-1" unicode="log-out" horiz-adv-x="1200" d=" M536 487H978L904 555Q871 580 898 618Q925 650 961 622L1159 442L961 262Q950 249 931.5 249T898 264Q871 302 904 325L978 396H536V487zM826 -73H281Q181 -73 111 -2.5T41 169V715Q41 816 111 885.5T281 955H826Q929 955 998.5 885.5T1068 715H988Q988 784 942 830T826 876H281Q213 876 166.5 830T120 715V169Q120 99 166.5 53T281 7H826Q896 7 942 53T988 169H1068Q1068 68 998.5 -2.5T826 -73z" /> <glyph glyph-name="loop" - unicode="" + unicode="" horiz-adv-x="1200" d=" M768.80208 1079.99261C754.23398 1080.25463 739.96406 1073.53904 725.98986 1059.844301C704.94634 1029.331161 707.31373 1001.975185 733.09206 977.775198L833.31052 885.446651H133.10686V357.51677H251.47467V767.8665599999999H833.31052L733.09206 675.53801C707.31373 651.3380199999999 704.94634 623.97993 725.98986 593.46679C743.35076 580.8407 757.68602 574.5276 768.9969 574.5276C780.30778 574.5276 793.32851 579.2623699999999 808.05898 588.73199L1066.8931 828.6290799999999L808.05898 1063.00154C794.74238 1074.09876 781.65631 1079.76141 768.80208 1079.99261zM948.5232 602.48323V192.13555H366.68949L466.90795 284.4641000000001C492.68628 308.66409 495.05366 336.02006 474.01014 366.5332C456.64924 379.1592900000001 442.31398 385.47239 431.00311 385.47239C419.69223 385.47239 406.6715 380.73763 391.94103 371.2680000000001L133.10686 131.3708900000002L391.94103 -102.9993999999999C420.34978 -126.6733999999999 447.70577 -125.6224999999999 474.01014 -99.8443C495.05366 -69.3312000000001 492.68628 -41.9751999999999 466.90795 -17.77522L366.68949 74.5533799999998H1066.8931V602.48323z" /> <glyph glyph-name="loop-1" unicode="loop" horiz-adv-x="1200" d=" M768.80208 1079.99261C754.23398 1080.25463 739.96406 1073.53904 725.98986 1059.844301C704.94634 1029.331161 707.31373 1001.975185 733.09206 977.775198L833.31052 885.446651H133.10686V357.51677H251.47467V767.8665599999999H833.31052L733.09206 675.53801C707.31373 651.3380199999999 704.94634 623.97993 725.98986 593.46679C743.35076 580.8407 757.68602 574.5276 768.9969 574.5276C780.30778 574.5276 793.32851 579.2623699999999 808.05898 588.73199L1066.8931 828.6290799999999L808.05898 1063.00154C794.74238 1074.09876 781.65631 1079.76141 768.80208 1079.99261zM948.5232 602.48323V192.13555H366.68949L466.90795 284.4641000000001C492.68628 308.66409 495.05366 336.02006 474.01014 366.5332C456.64924 379.1592900000001 442.31398 385.47239 431.00311 385.47239C419.69223 385.47239 406.6715 380.73763 391.94103 371.2680000000001L133.10686 131.3708900000002L391.94103 -102.9993999999999C420.34978 -126.6733999999999 447.70577 -125.6224999999999 474.01014 -99.8443C495.05366 -69.3312000000001 492.68628 -41.9751999999999 466.90795 -17.77522L366.68949 74.5533799999998H1066.8931V602.48323z" /> <glyph glyph-name="magnet" - unicode="" + unicode="" horiz-adv-x="1200" d=" M597 -71Q383 -71 230 89T77 479V488L120 830L306 805L263 474Q266 324 364 222T597 120Q738 120 835.5 222T937 474L890 805L1075 830L1123 479Q1123 249 970.5 89T597 -71zM1059 928L876 898L848 1106L1030 1129zM166 1129L347 1106L318 898L135 928z" /> <glyph glyph-name="magnet-1" unicode="magnet" horiz-adv-x="1200" d=" M597 -71Q383 -71 230 89T77 479V488L120 830L306 805L263 474Q266 324 364 222T597 120Q738 120 835.5 222T937 474L890 805L1075 830L1123 479Q1123 249 970.5 89T597 -71zM1059 928L876 898L848 1106L1030 1129zM166 1129L347 1106L318 898L135 928z" /> <glyph glyph-name="map-context" - unicode="" + unicode="" horiz-adv-x="1201" d=" M75 887L75 70L171 46L353 -2L353 815L232 847L75 887zM619.51758 860.23828L442 815L442 139L442 -2L752 77L752 742.52539C709.60017 749.33037 670.43346 773.81513 645.57812 808.79688C634.59846 824.67025 626.33462 842.2133 619.51758 860.23828zM1120.2402 824.66211C1122.1598 822.7457400000001 1124.0804 820.83043 1126 818.9140600000001L1126 822L1123 824L1120.2402 824.66211zM835 703.27539L835 79L838 77L967 46L1126 3L1126 563.88867C1100.7158 538.35771 1075.4331 512.82535 1050.1484 487.29492C978.43263 559.28873 906.71619 631.28195 835 703.27539z M765.8307 897.6406440000001L837.7140999999999 972.911124L753.0347999999999 1052.321464Q765.8306999999999 1072.2681400000001 822.0953999999999 1054.955934Q878.3600999999999 1037.643734 891.1560999999999 1004.524724Q909.2209999999998 954.8462035 881.5591 895.382524Q853.8972 835.91885 789.1646 830.6499100000001Q762.4436 828.01544 742.4969 839.68237Q722.5502 851.3492900000001 712.7651 870.919624Q702.9798999999999 890.489944 697.3345999999999 910.624804Q691.6892999999999 930.759654 690.5602999999999 944.684694Q689.4311999999999 958.6097335 690.9365999999999 959.73878353zM1126 691.7758799999999L1049.9768 614.99999L852.7682 812.96135L843.7357 816.34852Q877.6074 833.66073 897.9304 865.274334Q909.221 882.586544 915.9954 908.931214L926.9096 890.4899439999999z" /> <glyph glyph-name="map-context-1" unicode="map-context" horiz-adv-x="1201" d=" M75 887L75 70L171 46L353 -2L353 815L232 847L75 887zM619.51758 860.23828L442 815L442 139L442 -2L752 77L752 742.52539C709.60017 749.33037 670.43346 773.81513 645.57812 808.79688C634.59846 824.67025 626.33462 842.2133 619.51758 860.23828zM1120.2402 824.66211C1122.1598 822.7457400000001 1124.0804 820.83043 1126 818.9140600000001L1126 822L1123 824L1120.2402 824.66211zM835 703.27539L835 79L838 77L967 46L1126 3L1126 563.88867C1100.7158 538.35771 1075.4331 512.82535 1050.1484 487.29492C978.43263 559.28873 906.71619 631.28195 835 703.27539z M765.8307 897.6406440000001L837.7140999999999 972.911124L753.0347999999999 1052.321464Q765.8306999999999 1072.2681400000001 822.0953999999999 1054.955934Q878.3600999999999 1037.643734 891.1560999999999 1004.524724Q909.2209999999998 954.8462035 881.5591 895.382524Q853.8972 835.91885 789.1646 830.6499100000001Q762.4436 828.01544 742.4969 839.68237Q722.5502 851.3492900000001 712.7651 870.919624Q702.9798999999999 890.489944 697.3345999999999 910.624804Q691.6892999999999 930.759654 690.5602999999999 944.684694Q689.4311999999999 958.6097335 690.9365999999999 959.73878353zM1126 691.7758799999999L1049.9768 614.99999L852.7682 812.96135L843.7357 816.34852Q877.6074 833.66073 897.9304 865.274334Q909.221 882.586544 915.9954 908.931214L926.9096 890.4899439999999z" /> <glyph glyph-name="map-edit" - unicode="" + unicode="" horiz-adv-x="1200" d=" M901.29492 1080C890.07836 1080 879.03355 1079.13774 868.16211 1077.41211C859.18886 1077.41211 854.70312 1072.06215 854.70312 1061.36328C854.70312 1030.64714 840.72466 1009.50896 812.76953 997.94727C784.8144 986.38557 759.96554 991.30342 738.22266 1012.70117C731.32016 1022.01955 723.72832 1023.39917 715.44531 1016.8418C704.05619 1007.52342 687.83388 991.30307 666.78125 968.17969C659.87875 959.55156 661.26033 952.13022 670.92383 945.91797C693.01184 924.52021 698.01493 899.6713500000001 685.93555 871.37109C674.54641 844.1062099999999 653.14857 830.47461 621.74219 830.47461C610.00793 830.47461 604.14062 825.46956 604.14062 815.4609399999999C600.68937 792.3375599999999 600.68937 769.56009 604.14062 747.1269500000001C604.14062 736.7732 610.87215 731.5957000000001 624.33203 731.5957000000001C651.94204 734.3567 671.78585 721.07001 683.86523 691.73438C695.59949 663.43412 690.59445 638.58526 668.85156 617.1875C660.56856 611.32037 659.87875 603.89903 666.78125 594.92578C679.55088 580.0854 695.08142 563.6926 713.37305 545.74609C721.65605 540.56921 729.24984 541.08657 736.15234 547.29883C755.82448 571.80271 780.84579 577.84247 811.2168 565.41797C840.2073 553.33859 853.494 532.11319 851.07812 501.7421900000001C851.07813 490.00793 856.08317 484.14062 866.0918 484.14062C882.6578 481.37962 894.21996 480 900.77734 480C906.98959 480 917.85999 481.37962 933.39062 484.14062C943.05412 484.14062 947.88672 489.31812 947.88672 499.67188C947.88672 530.38801 961.77797 551.6134 989.56055 563.34766C1017.3431 575.08191 1042.2772 569.73196 1064.3652 547.29883C1071.2678 538.32557 1078.6891 537.29086 1086.627 544.19336C1104.2284 559.72399 1120.4487 576.11679 1135.2891 593.37305C1141.5013 601.31093 1140.8115 608.73227 1133.2188 615.63477C1110.4405 636.6874 1104.5732 661.3638 1115.6172 689.6640600000001C1127.3515 717.6192 1147.8871 731.5957000000001 1177.2227 731.5957000000001L1180.3281 729.52539C1191.7173 729.52539 1197.4121 735.0478 1197.4121 746.0917999999999C1200.8633 769.2151799999999 1200.8633 791.47529 1197.4121 812.8730499999999C1197.4121 823.91705 1191.3724 829.4394500000001 1179.293 829.4394500000001C1147.8866 829.4394500000001 1127.351 842.72615 1117.6875 869.30078C1106.2984 897.60104 1111.4759 922.4499 1133.2188 943.84766C1141.5018 949.02453 1142.1916 956.44587 1135.2891 966.10938C1122.1743 980.94975 1106.4713 997.34256 1088.1797 1015.28906C1080.5869 1020.12081 1073.1656 1019.25855 1065.918 1012.70117C1046.591 988.54241 1021.7421 982.67511 991.37109 995.09961C962.38058 1006.83386 948.92143 1028.40416 950.99219 1059.81055C950.99219 1071.5448000000001 945.81469 1077.41211 935.46094 1077.41211C923.89925 1079.13774 912.51149 1080 901.29492 1080zM900.77734 879.13672C928.38735 879.13672 952.19954 869.38824 972.2168 849.88867C992.23405 830.3891 1002.2441 807.3519699999999 1002.2441 780.77734C1002.2441 752.47708 992.23405 728.57575 972.2168 709.07617C952.19954 689.5766100000001 928.38735 679.82812 900.77734 679.82812C874.20271 679.82812 851.16559 689.5766100000001 831.66602 709.07617C812.16645 728.57575 802.41602 752.47708 802.41602 780.77734C802.41602 807.3519699999999 812.16645 830.3891 831.66602 849.88867C851.16559 869.38824 874.20271 879.13672 900.77734 879.13672zM0 769L0 -48L96 -72L278 -120L278 697L157 729L0 769zM510.81445 727.7207000000001L367 692L367 -120L676 -41L677 -41L677 457.11133C651.13913 469.82739 630.67635 492.1677 611.14453 512.96094C573.01802 543.69659 555.88329 599.36014 573.70703 645.54297C556.17723 654.26137 540.0436 666.61017 529.01953 682.9668C520.05299 696.7851499999999 514.33545 711.94808 510.81445 727.7207000000001zM764.51953 453.62109C763.68541 453.32607 762.84095 453.05603 762 452.77734L762 -41L883 -73L1040 -113L1040 450.03125C1038.131 450.6815 1036.2722 451.36689 1034.4375 452.12891C1025.623 436.03568 1014.0882 419.23554 997.85352 409.00977C961.8788 385.61736 917.03281 382.33831 875.34961 385.7480500000001C829.67094 384.96168 783.48276 411.45016 764.51953 453.62109z" /> <glyph glyph-name="map-edit-1" unicode="map-edit" horiz-adv-x="1200" d=" M901.29492 1080C890.07836 1080 879.03355 1079.13774 868.16211 1077.41211C859.18886 1077.41211 854.70312 1072.06215 854.70312 1061.36328C854.70312 1030.64714 840.72466 1009.50896 812.76953 997.94727C784.8144 986.38557 759.96554 991.30342 738.22266 1012.70117C731.32016 1022.01955 723.72832 1023.39917 715.44531 1016.8418C704.05619 1007.52342 687.83388 991.30307 666.78125 968.17969C659.87875 959.55156 661.26033 952.13022 670.92383 945.91797C693.01184 924.52021 698.01493 899.6713500000001 685.93555 871.37109C674.54641 844.1062099999999 653.14857 830.47461 621.74219 830.47461C610.00793 830.47461 604.14062 825.46956 604.14062 815.4609399999999C600.68937 792.3375599999999 600.68937 769.56009 604.14062 747.1269500000001C604.14062 736.7732 610.87215 731.5957000000001 624.33203 731.5957000000001C651.94204 734.3567 671.78585 721.07001 683.86523 691.73438C695.59949 663.43412 690.59445 638.58526 668.85156 617.1875C660.56856 611.32037 659.87875 603.89903 666.78125 594.92578C679.55088 580.0854 695.08142 563.6926 713.37305 545.74609C721.65605 540.56921 729.24984 541.08657 736.15234 547.29883C755.82448 571.80271 780.84579 577.84247 811.2168 565.41797C840.2073 553.33859 853.494 532.11319 851.07812 501.7421900000001C851.07813 490.00793 856.08317 484.14062 866.0918 484.14062C882.6578 481.37962 894.21996 480 900.77734 480C906.98959 480 917.85999 481.37962 933.39062 484.14062C943.05412 484.14062 947.88672 489.31812 947.88672 499.67188C947.88672 530.38801 961.77797 551.6134 989.56055 563.34766C1017.3431 575.08191 1042.2772 569.73196 1064.3652 547.29883C1071.2678 538.32557 1078.6891 537.29086 1086.627 544.19336C1104.2284 559.72399 1120.4487 576.11679 1135.2891 593.37305C1141.5013 601.31093 1140.8115 608.73227 1133.2188 615.63477C1110.4405 636.6874 1104.5732 661.3638 1115.6172 689.6640600000001C1127.3515 717.6192 1147.8871 731.5957000000001 1177.2227 731.5957000000001L1180.3281 729.52539C1191.7173 729.52539 1197.4121 735.0478 1197.4121 746.0917999999999C1200.8633 769.2151799999999 1200.8633 791.47529 1197.4121 812.8730499999999C1197.4121 823.91705 1191.3724 829.4394500000001 1179.293 829.4394500000001C1147.8866 829.4394500000001 1127.351 842.72615 1117.6875 869.30078C1106.2984 897.60104 1111.4759 922.4499 1133.2188 943.84766C1141.5018 949.02453 1142.1916 956.44587 1135.2891 966.10938C1122.1743 980.94975 1106.4713 997.34256 1088.1797 1015.28906C1080.5869 1020.12081 1073.1656 1019.25855 1065.918 1012.70117C1046.591 988.54241 1021.7421 982.67511 991.37109 995.09961C962.38058 1006.83386 948.92143 1028.40416 950.99219 1059.81055C950.99219 1071.5448000000001 945.81469 1077.41211 935.46094 1077.41211C923.89925 1079.13774 912.51149 1080 901.29492 1080zM900.77734 879.13672C928.38735 879.13672 952.19954 869.38824 972.2168 849.88867C992.23405 830.3891 1002.2441 807.3519699999999 1002.2441 780.77734C1002.2441 752.47708 992.23405 728.57575 972.2168 709.07617C952.19954 689.5766100000001 928.38735 679.82812 900.77734 679.82812C874.20271 679.82812 851.16559 689.5766100000001 831.66602 709.07617C812.16645 728.57575 802.41602 752.47708 802.41602 780.77734C802.41602 807.3519699999999 812.16645 830.3891 831.66602 849.88867C851.16559 869.38824 874.20271 879.13672 900.77734 879.13672zM0 769L0 -48L96 -72L278 -120L278 697L157 729L0 769zM510.81445 727.7207000000001L367 692L367 -120L676 -41L677 -41L677 457.11133C651.13913 469.82739 630.67635 492.1677 611.14453 512.96094C573.01802 543.69659 555.88329 599.36014 573.70703 645.54297C556.17723 654.26137 540.0436 666.61017 529.01953 682.9668C520.05299 696.7851499999999 514.33545 711.94808 510.81445 727.7207000000001zM764.51953 453.62109C763.68541 453.32607 762.84095 453.05603 762 452.77734L762 -41L883 -73L1040 -113L1040 450.03125C1038.131 450.6815 1036.2722 451.36689 1034.4375 452.12891C1025.623 436.03568 1014.0882 419.23554 997.85352 409.00977C961.8788 385.61736 917.03281 382.33831 875.34961 385.7480500000001C829.67094 384.96168 783.48276 411.45016 764.51953 453.62109z" /> <glyph glyph-name="map-filter" - unicode="" + unicode="" horiz-adv-x="1200" d=" M805 1080H1178Q1187 1080 1193.5 1073.5T1200 1058Q1200 1038 1178 1038H805Q785 1038 785 1058Q785 1067 791 1073.5T805 1080zM805 996H1178L1034 788V663L951 580V788zM842 776L890 763Q891 740 890 649T894 535Q902 511 930.5 505.5T976 520Q986 531 1094 638V710L1120 704V-113L963 -73L842 -41V776zM757 769V-41H756L447 -120V692zM80 769L237 729L358 697V-120L176 -72L80 -48V769z" /> <glyph glyph-name="map-filter-1" unicode="map-filter" horiz-adv-x="1200" d=" M805 1080H1178Q1187 1080 1193.5 1073.5T1200 1058Q1200 1038 1178 1038H805Q785 1038 785 1058Q785 1067 791 1073.5T805 1080zM805 996H1178L1034 788V663L951 580V788zM842 776L890 763Q891 740 890 649T894 535Q902 511 930.5 505.5T976 520Q986 531 1094 638V710L1120 704V-113L963 -73L842 -41V776zM757 769V-41H756L447 -120V692zM80 769L237 729L358 697V-120L176 -72L80 -48V769z" /> <glyph glyph-name="map-marker" - unicode="" + unicode="" horiz-adv-x="1200" d=" M246 719Q246 864 349.5 968T599 1072T849 968T953 719Q953 416 599 -100Q246 416 246 719zM689 585Q728 620 728 673T690.5 764T600.5 802T510.5 764T473 673T510.5 583T600.5 546T689 585z" /> <glyph glyph-name="map-marker-1" unicode="map-marker" horiz-adv-x="1200" d=" M246 719Q246 864 349.5 968T599 1072T849 968T953 719Q953 416 599 -100Q246 416 246 719zM689 585Q728 620 728 673T690.5 764T600.5 802T510.5 764T473 673T510.5 583T600.5 546T689 585z" /> <glyph glyph-name="map-synch" - unicode="" + unicode="" horiz-adv-x="1200" d=" M909 1080Q1032 1080 1106 982L1114 1041Q1117 1066 1139 1063Q1147 1063 1156 1053Q1160 1048 1160 1037L1143 893L1001 925Q991 925 985 934T983 951Q987 974 1012 969L1063 957Q1002 1031 909 1031Q827 1031 768.5 972.5T710 833H661Q661 936 733.5 1008T909 1080zM1108 833H1158Q1158 730 1085 657.5T909 585Q788 585 713 679L708 621Q705 597 680 601Q671 601 666 610Q658 617 661 626L678 771L820 740Q843 733 838 712Q836 702 827.5 696T810 694L757 706Q817 634 909 634Q993 634 1050.5 692.5T1108 833zM40 769L197 729L318 697V-120L136 -72L40 -48V769zM607 742Q593 638 596 597Q606 561 643 543T716 537H717V-41H716L407 -120V692zM1081 566V-113L924 -73L803 -41V534Q871 510 945.5 518.5T1081 566z" /> <glyph glyph-name="map-synch-1" unicode="map-synch" horiz-adv-x="1200" d=" M909 1080Q1032 1080 1106 982L1114 1041Q1117 1066 1139 1063Q1147 1063 1156 1053Q1160 1048 1160 1037L1143 893L1001 925Q991 925 985 934T983 951Q987 974 1012 969L1063 957Q1002 1031 909 1031Q827 1031 768.5 972.5T710 833H661Q661 936 733.5 1008T909 1080zM1108 833H1158Q1158 730 1085 657.5T909 585Q788 585 713 679L708 621Q705 597 680 601Q671 601 666 610Q658 617 661 626L678 771L820 740Q843 733 838 712Q836 702 827.5 696T810 694L757 706Q817 634 909 634Q993 634 1050.5 692.5T1108 833zM40 769L197 729L318 697V-120L136 -72L40 -48V769zM607 742Q593 638 596 597Q606 561 643 543T716 537H717V-41H716L407 -120V692zM1081 566V-113L924 -73L803 -41V534Q871 510 945.5 518.5T1081 566z" /> <glyph glyph-name="map-view" - unicode="" + unicode="" horiz-adv-x="1200" d=" M206.53516 1079.99219C204.83516 1079.94788 203.1419 1079.72864 201.45312 1079.33594L27.966797 1042.53906L83.332031 874.74414C87.908831 855.8777600000001 99.603512 849.50392 118.41602 855.62109C137.48962 861.21021 143.84472 873.19795 137.48242 891.5859399999999L117.20703 952.53125L208.13086 900.03516L241.94922 958.61133L151.02539 1011.10742L214.06445 1024.23242C233.08835 1027.77507 240.21169 1039.13146 235.43359 1058.3027299999999C234.95669 1064.99216 230.47563 1070.78624 221.98633 1075.6875C216.78665 1078.68953 211.63516 1080.1251 206.53516 1079.99219zM305.78125 921.75781L271.95898 863.17578L376.90234 802.58789L410.72461 861.16992L305.78125 921.75781zM474.55664 824.31641L440.73438 765.73438L546.71484 704.54688L580.53711 763.12891L474.55664 824.31641zM644.36914 726.27539L610.54688 667.69336L666.20312 635.56055C676.56256 643.53066 687.07401 651.30548 697.83398 658.70508C707.60276 665.45718 717.54087 671.98289 727.67969 678.17578L644.36914 726.27539zM900.21875 670.3125C850.40083 670.3125 800.72776 654.29074 751.20117 622.24414C701.6746 590.19747 664.23854 559.02321 638.89258 528.72461L600 479.78125C604.36999 474.8286000000001 609.90481 468.20143 616.60547 459.8984400000001C623.30612 451.59545 637.36438 436.44485 658.77734 414.44922C680.1903 392.45359 701.89304 372.93554 723.88867 355.89258C745.8843 338.8496 773.05269 323.5547900000001 805.39062 310.00781C837.72857 296.46084 869.33746 289.6875 900.21875 289.6875C949.74534 289.6875 999.3453 305.63812 1049.0176 337.53906C1098.6898 369.4400100000001 1136.1989 400.53927 1161.5449 430.83789L1200 479.78125C1195.9213 484.73391 1190.5326 491.36106 1183.832 499.6640599999999C1177.1314 507.9670599999999 1163.0732 523.11768 1141.6602 545.11328C1120.2472 567.10888 1098.4714 586.62692 1076.3301 603.66992C1054.1887 620.71292 1027.1665 636.08084 995.26562 649.77344C963.36462 663.4661 931.68268 670.3125 900.21875 670.3125zM900.4375 598.20898C932.92109 598.20898 960.67021 586.62773 983.68555 563.4668C1006.7008 540.3058 1018.209 512.41051 1018.209 479.78125C1018.209 447.15198 1006.7008 419.32975 983.68555 396.31445C960.67021 373.2991500000001 932.92109 361.79102 900.4375 361.79102C867.95388 361.79102 840.05857 373.2991500000001 816.75195 396.31445C793.44532 419.32975 781.79102 447.15198 781.79102 479.78125C781.79102 512.41051 793.44532 540.3058 816.75195 563.4668C840.05857 586.62773 867.95388 598.20898 900.4375 598.20898zM900.21875 558.44141C878.66012 558.44141 860.15939 550.72192 844.71875 535.28125C829.27811 519.84065 821.55859 501.33991 821.55859 479.78125C821.55859 458.22262 829.27811 439.79693 844.71875 424.50195C860.15939 409.2069800000001 878.66012 401.55859 900.21875 401.55859C921.77734 401.55859 940.20305 409.2069800000001 955.49805 424.50195C970.79305 439.79693 978.44141 458.22262 978.44141 479.78125C978.44141 491.7259 976.40289 501.63204 972.32422 509.49805C967.37155 489.6873900000001 954.11531 479.78125 932.55664 479.78125C921.77736 479.78125 912.45388 483.7871699999999 904.58789 491.79883C896.72191 499.81049 892.78906 509.64361 892.78906 521.29688C892.78906 536.15487 899.3451 548.53607 912.45508 558.44141L900.21875 558.44141zM667.08789 324.9511700000001L610.54688 292.30664L644.36914 233.72461L727.48047 281.70898C708.59444 292.55326 690.80916 305.23932 673.99023 319.0546900000001C671.6404 320.96438 669.40379 323.00272 667.08789 324.9511700000001zM546.71484 255.45312L440.73438 194.2656L474.55664 135.6836000000001L580.53711 196.8711L546.71484 255.45312zM376.90234 157.4121L271.95898 96.8242L305.78125 38.2421999999999L410.72461 98.8300999999999L376.90234 157.4121zM105.64062 106.625C94.200435 106.5287000000001 86.764631 99.4056000000001 83.332031 85.2559000000001L27.966797 -82.5391L201.45312 -119.3359C208.20822 -120.9066 215.05343 -119.6902 221.98633 -115.6875C230.47563 -110.7863 234.95669 -104.9921999999999 235.43359 -98.3027C240.21169 -79.1315 233.08835 -67.7751000000001 214.06445 -64.2324000000001L151.02539 -51.1074000000001L241.94922 1.3887L208.13086 59.9648L117.20703 7.4688000000001L137.48242 68.4141C143.84472 86.8021000000001 137.48962 98.7898 118.41602 104.3788999999999C113.71289 105.9082000000001 109.45403 106.6570999999999 105.64062 106.625z" /> <glyph glyph-name="map-view-1" unicode="map-view" horiz-adv-x="1200" d=" M206.53516 1079.99219C204.83516 1079.94788 203.1419 1079.72864 201.45312 1079.33594L27.966797 1042.53906L83.332031 874.74414C87.908831 855.8777600000001 99.603512 849.50392 118.41602 855.62109C137.48962 861.21021 143.84472 873.19795 137.48242 891.5859399999999L117.20703 952.53125L208.13086 900.03516L241.94922 958.61133L151.02539 1011.10742L214.06445 1024.23242C233.08835 1027.77507 240.21169 1039.13146 235.43359 1058.3027299999999C234.95669 1064.99216 230.47563 1070.78624 221.98633 1075.6875C216.78665 1078.68953 211.63516 1080.1251 206.53516 1079.99219zM305.78125 921.75781L271.95898 863.17578L376.90234 802.58789L410.72461 861.16992L305.78125 921.75781zM474.55664 824.31641L440.73438 765.73438L546.71484 704.54688L580.53711 763.12891L474.55664 824.31641zM644.36914 726.27539L610.54688 667.69336L666.20312 635.56055C676.56256 643.53066 687.07401 651.30548 697.83398 658.70508C707.60276 665.45718 717.54087 671.98289 727.67969 678.17578L644.36914 726.27539zM900.21875 670.3125C850.40083 670.3125 800.72776 654.29074 751.20117 622.24414C701.6746 590.19747 664.23854 559.02321 638.89258 528.72461L600 479.78125C604.36999 474.8286000000001 609.90481 468.20143 616.60547 459.8984400000001C623.30612 451.59545 637.36438 436.44485 658.77734 414.44922C680.1903 392.45359 701.89304 372.93554 723.88867 355.89258C745.8843 338.8496 773.05269 323.5547900000001 805.39062 310.00781C837.72857 296.46084 869.33746 289.6875 900.21875 289.6875C949.74534 289.6875 999.3453 305.63812 1049.0176 337.53906C1098.6898 369.4400100000001 1136.1989 400.53927 1161.5449 430.83789L1200 479.78125C1195.9213 484.73391 1190.5326 491.36106 1183.832 499.6640599999999C1177.1314 507.9670599999999 1163.0732 523.11768 1141.6602 545.11328C1120.2472 567.10888 1098.4714 586.62692 1076.3301 603.66992C1054.1887 620.71292 1027.1665 636.08084 995.26562 649.77344C963.36462 663.4661 931.68268 670.3125 900.21875 670.3125zM900.4375 598.20898C932.92109 598.20898 960.67021 586.62773 983.68555 563.4668C1006.7008 540.3058 1018.209 512.41051 1018.209 479.78125C1018.209 447.15198 1006.7008 419.32975 983.68555 396.31445C960.67021 373.2991500000001 932.92109 361.79102 900.4375 361.79102C867.95388 361.79102 840.05857 373.2991500000001 816.75195 396.31445C793.44532 419.32975 781.79102 447.15198 781.79102 479.78125C781.79102 512.41051 793.44532 540.3058 816.75195 563.4668C840.05857 586.62773 867.95388 598.20898 900.4375 598.20898zM900.21875 558.44141C878.66012 558.44141 860.15939 550.72192 844.71875 535.28125C829.27811 519.84065 821.55859 501.33991 821.55859 479.78125C821.55859 458.22262 829.27811 439.79693 844.71875 424.50195C860.15939 409.2069800000001 878.66012 401.55859 900.21875 401.55859C921.77734 401.55859 940.20305 409.2069800000001 955.49805 424.50195C970.79305 439.79693 978.44141 458.22262 978.44141 479.78125C978.44141 491.7259 976.40289 501.63204 972.32422 509.49805C967.37155 489.6873900000001 954.11531 479.78125 932.55664 479.78125C921.77736 479.78125 912.45388 483.7871699999999 904.58789 491.79883C896.72191 499.81049 892.78906 509.64361 892.78906 521.29688C892.78906 536.15487 899.3451 548.53607 912.45508 558.44141L900.21875 558.44141zM667.08789 324.9511700000001L610.54688 292.30664L644.36914 233.72461L727.48047 281.70898C708.59444 292.55326 690.80916 305.23932 673.99023 319.0546900000001C671.6404 320.96438 669.40379 323.00272 667.08789 324.9511700000001zM546.71484 255.45312L440.73438 194.2656L474.55664 135.6836000000001L580.53711 196.8711L546.71484 255.45312zM376.90234 157.4121L271.95898 96.8242L305.78125 38.2421999999999L410.72461 98.8300999999999L376.90234 157.4121zM105.64062 106.625C94.200435 106.5287000000001 86.764631 99.4056000000001 83.332031 85.2559000000001L27.966797 -82.5391L201.45312 -119.3359C208.20822 -120.9066 215.05343 -119.6902 221.98633 -115.6875C230.47563 -110.7863 234.95669 -104.9921999999999 235.43359 -98.3027C240.21169 -79.1315 233.08835 -67.7751000000001 214.06445 -64.2324000000001L151.02539 -51.1074000000001L241.94922 1.3887L208.13086 59.9648L117.20703 7.4688000000001L137.48242 68.4141C143.84472 86.8021000000001 137.48962 98.7898 118.41602 104.3788999999999C113.71289 105.9082000000001 109.45403 106.6570999999999 105.64062 106.625z" /> <glyph glyph-name="maps-catalog" - unicode="" + unicode="" horiz-adv-x="1200" d=" M599.55078 1080.00002C593.46823 1079.13108 588.68864 1076.74226 585.21289 1072.83205C581.73715 1068.92184 580 1064.36012 580 1059.146495V750.67385L662.11523 947.488293C663.56346 957.625883 668.26914 966.023723 676.23438 972.685563C684.19962 979.347403 693.54095 982.679703 704.25781 982.679703H1093.9746V985.285173C1093.9746 988.760913 1094.1205 992.309143 1094.4102 995.929703C1094.6998 999.550263 1094.5539 1003.388343 1093.9746 1007.443373C1093.9746 1009.760533 1093.6128 1011.789483 1092.8887 1013.527353C1092.1645 1015.265223 1091.3689 1016.856473 1090.5 1018.304703C1087.8932 1022.649383 1084.8507 1025.401983 1081.375 1026.560563C1077.8993 1027.719143 1073.8453 1028.298843 1069.2109 1028.298843H791.15039C790.5711 1028.298843 789.84746 1028.370813 788.97852 1028.515633C788.10958 1028.660453 787.09608 1029.168193 785.9375 1030.037123C777.82743 1030.037123 771.74449 1033.367473 767.68945 1040.029313C766.53087 1041.767183 765.80722 1043.504323 765.51758 1045.242205C765.22793 1046.980065 764.79413 1049.007075 764.21484 1051.324235C763.9252 1053.641405 763.7793 1055.960195 763.7793 1058.277355C763.7793 1060.59452 763.48944 1062.76547 762.91016 1064.79299C759.14476 1074.93057 751.32467 1080.00002 739.44922 1080.00002H603.02734zM718.5957 925.330093L718.16016 924.460953L609.97852 668.99416H1070.5137L1071.3828 670.7304899999999L1180 925.330093H1102.6641zM19.999989 769.00002V-48L115.99999 -72L297.9999900000001 -120V697.00002L176.99999 729.00002zM506.37305 727.54299C506.19592 727.53997 506.76464 727.2144900000001 508.39453 726.3926C508.39453 725.05512 508.3851 723.68797 508.38281 722.34377L516.29688 724.3222900000001C511.61666 725.66524 506.80275 727.55031 506.37305 727.54299zM516.29688 724.3222900000001C522.03468 722.6758600000001 527.5717 721.85067 524.57422 726.3926zM508.38281 722.34377L387 692.00002V-120L696 -41H697V537.00002V600.99416H507.31445C507.31445 641.03682 508.31597 683.07008 508.38281 722.34377zM782.9375 600.99416V1.5430200000001L783 1.5273200000001V-41L904 -73L1061 -113V566.00002C1060.9793 565.98672 1060.9582 565.97426 1060.9375 565.96096V600.99416z" /> <glyph glyph-name="maps-catalog-1" unicode="maps-catalog" horiz-adv-x="1200" d=" M599.55078 1080.00002C593.46823 1079.13108 588.68864 1076.74226 585.21289 1072.83205C581.73715 1068.92184 580 1064.36012 580 1059.146495V750.67385L662.11523 947.488293C663.56346 957.625883 668.26914 966.023723 676.23438 972.685563C684.19962 979.347403 693.54095 982.679703 704.25781 982.679703H1093.9746V985.285173C1093.9746 988.760913 1094.1205 992.309143 1094.4102 995.929703C1094.6998 999.550263 1094.5539 1003.388343 1093.9746 1007.443373C1093.9746 1009.760533 1093.6128 1011.789483 1092.8887 1013.527353C1092.1645 1015.265223 1091.3689 1016.856473 1090.5 1018.304703C1087.8932 1022.649383 1084.8507 1025.401983 1081.375 1026.560563C1077.8993 1027.719143 1073.8453 1028.298843 1069.2109 1028.298843H791.15039C790.5711 1028.298843 789.84746 1028.370813 788.97852 1028.515633C788.10958 1028.660453 787.09608 1029.168193 785.9375 1030.037123C777.82743 1030.037123 771.74449 1033.367473 767.68945 1040.029313C766.53087 1041.767183 765.80722 1043.504323 765.51758 1045.242205C765.22793 1046.980065 764.79413 1049.007075 764.21484 1051.324235C763.9252 1053.641405 763.7793 1055.960195 763.7793 1058.277355C763.7793 1060.59452 763.48944 1062.76547 762.91016 1064.79299C759.14476 1074.93057 751.32467 1080.00002 739.44922 1080.00002H603.02734zM718.5957 925.330093L718.16016 924.460953L609.97852 668.99416H1070.5137L1071.3828 670.7304899999999L1180 925.330093H1102.6641zM19.999989 769.00002V-48L115.99999 -72L297.9999900000001 -120V697.00002L176.99999 729.00002zM506.37305 727.54299C506.19592 727.53997 506.76464 727.2144900000001 508.39453 726.3926C508.39453 725.05512 508.3851 723.68797 508.38281 722.34377L516.29688 724.3222900000001C511.61666 725.66524 506.80275 727.55031 506.37305 727.54299zM516.29688 724.3222900000001C522.03468 722.6758600000001 527.5717 721.85067 524.57422 726.3926zM508.38281 722.34377L387 692.00002V-120L696 -41H697V537.00002V600.99416H507.31445C507.31445 641.03682 508.31597 683.07008 508.38281 722.34377zM782.9375 600.99416V1.5430200000001L783 1.5273200000001V-41L904 -73L1061 -113V566.00002C1060.9793 565.98672 1060.9582 565.97426 1060.9375 565.96096V600.99416z" /> <glyph glyph-name="menu-hamburger" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1127 798H70Q48 798 33 813.5T18 851T33 887.5T70 902H1127Q1149 902 1165.5 887.5T1182 851T1165.5 813.5T1127 798zM1127 437H70Q48 437 33 452.5T18 491T33 529.5T70 545H1127Q1149 545 1165.5 529.5T1182 491T1165.5 452.5T1127 437zM1127 80H70Q48 80 33 95T18 130.5T33 168T70 185H1127Q1149 185 1165.5 168T1182 130.5T1165.5 95T1127 80z" /> <glyph glyph-name="menu-hamburger-1" unicode="menu-hamburger" horiz-adv-x="1200" d=" M1127 798H70Q48 798 33 813.5T18 851T33 887.5T70 902H1127Q1149 902 1165.5 887.5T1182 851T1165.5 813.5T1127 798zM1127 437H70Q48 437 33 452.5T18 491T33 529.5T70 545H1127Q1149 545 1165.5 529.5T1182 491T1165.5 452.5T1127 437zM1127 80H70Q48 80 33 95T18 130.5T33 168T70 185H1127Q1149 185 1165.5 168T1182 130.5T1165.5 95T1127 80z" /> <glyph glyph-name="minus-sign" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1007 902Q1174 734 1174 495.5T1005.5 89.5T597.5 -78T191.5 89.5T25 495.5T191.5 901.5T597.5 1069T1007 902zM950 427Q979 427 998 446.5T1017 495T998 544.5T950 565H246Q221 565 200.5 544.5T180 495T200.5 446.5T246 427H950z" /> <glyph glyph-name="minus-sign-1" unicode="minus-sign" horiz-adv-x="1200" d=" M1007 902Q1174 734 1174 495.5T1005.5 89.5T597.5 -78T191.5 89.5T25 495.5T191.5 901.5T597.5 1069T1007 902zM950 427Q979 427 998 446.5T1017 495T998 544.5T950 565H246Q221 565 200.5 544.5T180 495T200.5 446.5T246 427H950z" /> <glyph glyph-name="minus" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1065 401H136Q100 401 72.5 427T45 491.5T72.5 556T136 582H1065Q1103 582 1129 556T1155 491.5T1129 427T1065 401z" /> <glyph glyph-name="minus-1" unicode="minus" horiz-adv-x="1200" d=" M1065 401H136Q100 401 72.5 427T45 491.5T72.5 556T136 582H1065Q1103 582 1129 556T1155 491.5T1129 427T1065 401z" /> <glyph glyph-name="model-plus" - unicode="" + unicode="" horiz-adv-x="1200" d=" M950 1080C938.66667 1080 928.83333 1076 920.5 1068C912.16667 1060 908 1050.66667 908 1040L908 870L741 870C729.66666 870 720 866.3333299999999 712 859C704 851.6666700000001 700 842.1666700000001 700 830.5C700 818.8333299999999 704 809 712 801C720 793 729.66666 789 741 789L908 789L908 620C908 608.66667 912.16667 599.16667 920.5 591.5C928.83333 583.83333 938.66667 580 950 580C961.33333 580 971 583.83333 979 591.5C987 599.16667 991 608.66667 991 620L991 789L1160 789C1170.6667 789 1180 793 1188 801C1196 809 1200 818.8333299999999 1200 830.5C1200 842.1666700000001 1196 851.6666700000001 1188 859C1180 866.3333299999999 1170.6667 870 1160 870L991 870L991 1040C991 1050.66667 987 1060 979 1068C971 1076 961.33333 1080 950 1080zM238.70898 680L0 441.29102L497.65039 441.29102L736.35938 680L238.70898 680zM800 616.35938L561.29102 377.65039L561.29102 -120L800 118.7090000000001L800 616.35938zM0 347.67773L0 -120L467.67773 -120L467.67773 347.67773L0 347.67773z" /> <glyph glyph-name="model-plus-1" unicode="model-plus" horiz-adv-x="1200" d=" M950 1080C938.66667 1080 928.83333 1076 920.5 1068C912.16667 1060 908 1050.66667 908 1040L908 870L741 870C729.66666 870 720 866.3333299999999 712 859C704 851.6666700000001 700 842.1666700000001 700 830.5C700 818.8333299999999 704 809 712 801C720 793 729.66666 789 741 789L908 789L908 620C908 608.66667 912.16667 599.16667 920.5 591.5C928.83333 583.83333 938.66667 580 950 580C961.33333 580 971 583.83333 979 591.5C987 599.16667 991 608.66667 991 620L991 789L1160 789C1170.6667 789 1180 793 1188 801C1196 809 1200 818.8333299999999 1200 830.5C1200 842.1666700000001 1196 851.6666700000001 1188 859C1180 866.3333299999999 1170.6667 870 1160 870L991 870L991 1040C991 1050.66667 987 1060 979 1068C971 1076 961.33333 1080 950 1080zM238.70898 680L0 441.29102L497.65039 441.29102L736.35938 680L238.70898 680zM800 616.35938L561.29102 377.65039L561.29102 -120L800 118.7090000000001L800 616.35938zM0 347.67773L0 -120L467.67773 -120L467.67773 347.67773L0 347.67773z" /> <glyph glyph-name="model" - unicode="" + unicode="" horiz-adv-x="1200" d=" M358.0633900000001 1080.00003L-0.0000062500003 721.93656H746.47556L1104.5391 1080.00003zM1200 984.5391L841.93651 626.47561V-120L1200 238.06351zM-0.0000062500003 581.51662V-120H701.51657V581.51662z" /> <glyph glyph-name="model-1" unicode="model" horiz-adv-x="1200" d=" M358.0633900000001 1080.00003L-0.0000062500003 721.93656H746.47556L1104.5391 1080.00003zM1200 984.5391L841.93651 626.47561V-120L1200 238.06351zM-0.0000062500003 581.51662V-120H701.51657V581.51662z" /> <glyph glyph-name="mouse" - unicode="" + unicode="" horiz-adv-x="1200" d=" M660 1077Q730 1070 793.5 1044.5T903.5 983T977 900.5T1004 806V636V629V540H660V628Q674 634 686.5 644.5T706 667.5T713 692V732V738V740V742V764V778V780V782V796V804V820V822V837V868V909Q713 926 697.5 944.5T660 972V1077zM540 1077V969Q521 960 507.5 942.5T494 909V868V863V861V859V837V822V820V818V804V796V782V780V778V764V742V740V738V732V692Q494 681 500 669.5T516.5 647.5T540 631V540H196V621V629V636V806Q196 854 223 900.5T296.5 983T406.5 1044.5T540 1077zM603.5 901Q628 901 645.5 889T663 860V838V820V812V803V798V791V789V788V780V768V767V766V763V741Q663 724 645.5 712T603.5 700T561 712T543 741V763V766V767V768V780V788V789V791V798V803V810V812V820V832V834V835V838V860Q543 877 561 889T603.5 901zM196 420H1004V339V331V324V154Q1004 98 972 47.5T886 -40T757 -98.5T600 -120Q490 -120 397 -83.5T250 16.5T196 154V324V331V339V420z" /> <glyph glyph-name="mouse-1" unicode="mouse" horiz-adv-x="1200" d=" M660 1077Q730 1070 793.5 1044.5T903.5 983T977 900.5T1004 806V636V629V540H660V628Q674 634 686.5 644.5T706 667.5T713 692V732V738V740V742V764V778V780V782V796V804V820V822V837V868V909Q713 926 697.5 944.5T660 972V1077zM540 1077V969Q521 960 507.5 942.5T494 909V868V863V861V859V837V822V820V818V804V796V782V780V778V764V742V740V738V732V692Q494 681 500 669.5T516.5 647.5T540 631V540H196V621V629V636V806Q196 854 223 900.5T296.5 983T406.5 1044.5T540 1077zM603.5 901Q628 901 645.5 889T663 860V838V820V812V803V798V791V789V788V780V768V767V766V763V741Q663 724 645.5 712T603.5 700T561 712T543 741V763V766V767V768V780V788V789V791V798V803V810V812V820V832V834V835V838V860Q543 877 561 889T603.5 901zM196 420H1004V339V331V324V154Q1004 98 972 47.5T886 -40T757 -98.5T600 -120Q490 -120 397 -83.5T250 16.5T196 154V324V331V339V420z" /> <glyph glyph-name="move-row-after" - unicode="" + unicode="" horiz-adv-x="1200" d=" M511 822H681V445L788 566Q836 621 890 569Q946 519 893 469L597 138L299 469Q281 488 281 518Q281 555 302 569Q356 621 403 566L511 445V822zM54 46H1148Q1199 46 1199 -6V-67Q1199 -86 1184 -103T1148 -120H54Q35 -120 18 -103T1 -67V-6Q1 46 54 46z" /> <glyph glyph-name="move-row-after-1" unicode="move-row-after" horiz-adv-x="1200" d=" M511 822H681V445L788 566Q836 621 890 569Q946 519 893 469L597 138L299 469Q281 488 281 518Q281 555 302 569Q356 621 403 566L511 445V822zM54 46H1148Q1199 46 1199 -6V-67Q1199 -86 1184 -103T1148 -120H54Q35 -120 18 -103T1 -67V-6Q1 46 54 46z" /> <glyph glyph-name="move-row-before" - unicode="" + unicode="" horiz-adv-x="1200" d=" M689 138H519V515L412 394Q364 339 310 391Q254 441 307 491L603 822L901 491Q919 472 919 442Q919 405 898 391Q844 339 797 394L689 515V138zM1146 914H52Q1 914 1 966V1027Q1 1046 16 1063T52 1080H1146Q1165 1080 1182 1063T1199 1027V966Q1199 914 1146 914z" /> <glyph glyph-name="move-row-before-1" unicode="move-row-before" horiz-adv-x="1200" d=" M689 138H519V515L412 394Q364 339 310 391Q254 441 307 491L603 822L901 491Q919 472 919 442Q919 405 898 391Q844 339 797 394L689 515V138zM1146 914H52Q1 914 1 966V1027Q1 1046 16 1063T52 1080H1146Q1165 1080 1182 1063T1199 1027V966Q1199 914 1146 914z" /> <glyph glyph-name="move" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1230 534L1033 354Q1021 342 1003 342Q992 342 972 357Q943 395 975 417L1050 488H662V100L732 175Q754 206 791 178Q820 149 795 116L615 -81L437 116Q425 127 425 146Q425 156 440 178Q476 206 502 175L569 100V488H181L256 417Q289 395 258 357Q237 342 227 342Q210 342 199 354L0 534L199 715Q230 738 258 710Q289 673 256 647L181 580H569V968L502 893Q476 862 440 890Q425 912 425 922Q425 940 437 952L615 1149L795 952Q820 919 791 890Q754 862 732 893L662 968V580H1050L975 647Q943 673 972 710Q999 738 1033 715z" /> <glyph glyph-name="move-1" unicode="move" horiz-adv-x="1200" d=" M1230 534L1033 354Q1021 342 1003 342Q992 342 972 357Q943 395 975 417L1050 488H662V100L732 175Q754 206 791 178Q820 149 795 116L615 -81L437 116Q425 127 425 146Q425 156 440 178Q476 206 502 175L569 100V488H181L256 417Q289 395 258 357Q237 342 227 342Q210 342 199 354L0 534L199 715Q230 738 258 710Q289 673 256 647L181 580H569V968L502 893Q476 862 440 890Q425 912 425 922Q425 940 437 952L615 1149L795 952Q820 919 791 890Q754 862 732 893L662 968V580H1050L975 647Q943 673 972 710Q999 738 1033 715z" /> <glyph glyph-name="muted" - unicode="" + unicode="" horiz-adv-x="1200" d=" M373.49997 693.99998L631.49997 865.99998Q640.49997 871.99998 646.49997 868.49998Q652.49997 864.99998 652.49997 854.99998V105.00002Q652.49997 95.00002 646.49997 91.50002Q640.49997 88.00002 631.49997 94.00002L373.49997 266.00002Q352.49997 280.00002 327.49997 280.00002H77.499969Q67.499969 280.00002 59.999969 287.50002Q52.499969 295.00002 52.499969 305.00002V654.99998Q52.499969 664.99998 59.999969 672.49998Q67.499969 679.99998 77.499969 679.99998H327.49997Q352.49997 679.99998 373.49997 693.99998zM952.50002 547.99998L1072.5 667.99998Q1079.5 674.99998 1089.5 674.99998Q1099.5 674.99998 1106.5 667.99998L1140.5 633.99998Q1147.5 626.99998 1147.5 616.99998Q1147.5 606.99998 1140.5 599.99998L1020.5 479.9999800000001L1140.5 360.00002Q1147.5 353.00002 1147.5 343.00002Q1147.5 333.00002 1140.5 326.00002L1106.5 292.00002Q1099.5 285.00002 1089.5 285.00002Q1079.5 285.00002 1072.5 292.00002L952.50002 411.00002L832.49997 292.00002Q825.49997 285.00002 815.49997 285.00002Q805.49997 285.00002 798.49997 292.00002L764.49997 326.00002Q757.49997 333.00002 757.49997 343.00002Q757.49997 353.00002 764.49997 360.00002L883.50002 479.9999800000001L764.49997 599.99998Q757.49997 606.99998 757.49997 616.99998Q757.49997 626.99998 764.49997 633.99998L798.49997 667.99998Q805.49997 675.99998 815.49997 675.99998Q825.49997 675.99998 832.49997 667.99998z" /> <glyph glyph-name="muted-1" unicode="muted" horiz-adv-x="1200" d=" M373.49997 693.99998L631.49997 865.99998Q640.49997 871.99998 646.49997 868.49998Q652.49997 864.99998 652.49997 854.99998V105.00002Q652.49997 95.00002 646.49997 91.50002Q640.49997 88.00002 631.49997 94.00002L373.49997 266.00002Q352.49997 280.00002 327.49997 280.00002H77.499969Q67.499969 280.00002 59.999969 287.50002Q52.499969 295.00002 52.499969 305.00002V654.99998Q52.499969 664.99998 59.999969 672.49998Q67.499969 679.99998 77.499969 679.99998H327.49997Q352.49997 679.99998 373.49997 693.99998zM952.50002 547.99998L1072.5 667.99998Q1079.5 674.99998 1089.5 674.99998Q1099.5 674.99998 1106.5 667.99998L1140.5 633.99998Q1147.5 626.99998 1147.5 616.99998Q1147.5 606.99998 1140.5 599.99998L1020.5 479.9999800000001L1140.5 360.00002Q1147.5 353.00002 1147.5 343.00002Q1147.5 333.00002 1140.5 326.00002L1106.5 292.00002Q1099.5 285.00002 1089.5 285.00002Q1079.5 285.00002 1072.5 292.00002L952.50002 411.00002L832.49997 292.00002Q825.49997 285.00002 815.49997 285.00002Q805.49997 285.00002 798.49997 292.00002L764.49997 326.00002Q757.49997 333.00002 757.49997 343.00002Q757.49997 353.00002 764.49997 360.00002L883.50002 479.9999800000001L764.49997 599.99998Q757.49997 606.99998 757.49997 616.99998Q757.49997 626.99998 764.49997 633.99998L798.49997 667.99998Q805.49997 675.99998 815.49997 675.99998Q825.49997 675.99998 832.49997 667.99998z" /> <glyph glyph-name="new-window" - unicode="" + unicode="" horiz-adv-x="1200" d=" M844 -75H294Q191 -75 119.5 -4.5T48 169V719Q48 822 119.5 892T294 962H708V883H294Q223 883 175.5 837T128 719V169Q128 96 175.5 50T294 4H844Q915 4 962 50T1009 169V594H1090V169Q1090 66 1018.5 -4.5T844 -75zM671 615L988 932L885 924Q844 924 839 962Q839 1012 882 1012L1151 1025L1137 755Q1137 738 1123 728Q1109 714 1090 714Q1050 719 1050 761L1056 863L738 548z" /> <glyph glyph-name="new-window-1" unicode="new-window" horiz-adv-x="1200" d=" M844 -75H294Q191 -75 119.5 -4.5T48 169V719Q48 822 119.5 892T294 962H708V883H294Q223 883 175.5 837T128 719V169Q128 96 175.5 50T294 4H844Q915 4 962 50T1009 169V594H1090V169Q1090 66 1018.5 -4.5T844 -75zM671 615L988 932L885 924Q844 924 839 962Q839 1012 882 1012L1151 1025L1137 755Q1137 738 1123 728Q1109 714 1090 714Q1050 719 1050 761L1056 863L738 548z" /> <glyph glyph-name="next" - unicode="" + unicode="" horiz-adv-x="1200" d=" M396.30263 1080C347.07711 1079.99947 307.17208 1040.094426 307.17155 990.868906C307.17884 967.5402254 316.33202 945.144211 332.66629 928.488312C332.66629 928.488312 338.26402 922.798044 332.66629 928.488312L691.35222 476.6732500000001L330.56428 29.16146L330.55931 29.1565000000001C315.55253 12.7635700000001 307.21134 -8.64437 307.17155 -30.8688999999999C307.17207 -80.0943999999999 347.07711 -119.9994999999999 396.30263 -120C429.54788 -119.9701 460.01346 -101.4404999999999 475.33063 -71.934C475.33063 -71.934 477.93686 -66.9235000000001 475.33063 -71.934L859.21101 404.21686C880.49729 422.25662 892.78813 448.7337299999999 892.82843 476.6360199999999C892.81067 505.0416700000001 880.09712 531.9525100000001 858.16621 550.00569L474.84917 1032.844776V1032.847254C459.36605 1061.84722 429.177 1079.97019 396.30263 1080z" /> <glyph glyph-name="next-1" unicode="next" horiz-adv-x="1200" d=" M396.30263 1080C347.07711 1079.99947 307.17208 1040.094426 307.17155 990.868906C307.17884 967.5402254 316.33202 945.144211 332.66629 928.488312C332.66629 928.488312 338.26402 922.798044 332.66629 928.488312L691.35222 476.6732500000001L330.56428 29.16146L330.55931 29.1565000000001C315.55253 12.7635700000001 307.21134 -8.64437 307.17155 -30.8688999999999C307.17207 -80.0943999999999 347.07711 -119.9994999999999 396.30263 -120C429.54788 -119.9701 460.01346 -101.4404999999999 475.33063 -71.934C475.33063 -71.934 477.93686 -66.9235000000001 475.33063 -71.934L859.21101 404.21686C880.49729 422.25662 892.78813 448.7337299999999 892.82843 476.6360199999999C892.81067 505.0416700000001 880.09712 531.9525100000001 858.16621 550.00569L474.84917 1032.844776V1032.847254C459.36605 1061.84722 429.177 1079.97019 396.30263 1080z" /> <glyph glyph-name="off" - unicode="" + unicode="" horiz-adv-x="1200" d=" M46 470Q46 620 121.5 750T326 950L385 841Q284 784 226 684T168 470Q168 287 295 162T601 37T907 162T1034 470Q1034 584 976 684T818 841L877 950Q1004 880 1079 750T1154 470Q1154 240 990.5 78T600 -84T209.5 78T46 470zM538 612V1023Q538 1049 557 1067T601.5 1085T646 1067T665 1023V612Q665 585 646 569T601.5 553T557 569T538 612z" /> <glyph glyph-name="off-1" unicode="off" horiz-adv-x="1200" d=" M46 470Q46 620 121.5 750T326 950L385 841Q284 784 226 684T168 470Q168 287 295 162T601 37T907 162T1034 470Q1034 584 976 684T818 841L877 950Q1004 880 1079 750T1154 470Q1154 240 990.5 78T600 -84T209.5 78T46 470zM538 612V1023Q538 1049 557 1067T601.5 1085T646 1067T665 1023V612Q665 585 646 569T601.5 553T557 569T538 612z" /> <glyph glyph-name="ok-circle" - unicode="" + unicode="" horiz-adv-x="1200" d=" M263 554Q317 615 382 558L535 408L777 758Q824 825 896 778Q961 730 915 659L567 143L263 436Q240 457 238 493T263 554zM270 825Q132 686 132 493T271 162.5T602 25T931.5 162.5T1069 493T931.5 824T602 962T270 825zM1006 899Q1179 730 1179 493T1008.5 85T600 -86T191 85T20 493T191 901.5T600 1073T1006 899z" /> <glyph glyph-name="ok-circle-1" unicode="ok-circle" horiz-adv-x="1200" d=" M263 554Q317 615 382 558L535 408L777 758Q824 825 896 778Q961 730 915 659L567 143L263 436Q240 457 238 493T263 554zM270 825Q132 686 132 493T271 162.5T602 25T931.5 162.5T1069 493T931.5 824T602 962T270 825zM1006 899Q1179 730 1179 493T1008.5 85T600 -86T191 85T20 493T191 901.5T600 1073T1006 899z" /> <glyph glyph-name="ok-sign" - unicode="" + unicode="" horiz-adv-x="1200" d=" M190 87Q22 256 22 495.5T190 903.5T598.5 1072T1008 903.5T1177 495.5T1008 87T598.5 -82T190 87zM245 559Q219 534 221.5 496T245 436L563 129L928 668Q977 744 908 794Q834 842 785 773L531 407L371 564Q304 623 245 559z" /> <glyph glyph-name="ok-sign-1" unicode="ok-sign" horiz-adv-x="1200" d=" M190 87Q22 256 22 495.5T190 903.5T598.5 1072T1008 903.5T1177 495.5T1008 87T598.5 -82T190 87zM245 559Q219 534 221.5 496T245 436L563 129L928 668Q977 744 908 794Q834 842 785 773L531 407L371 564Q304 623 245 559z" /> <glyph glyph-name="ok" - unicode="" + unicode="" horiz-adv-x="1200" d=" M559 -51L62 429Q29 460 27 507.5T57 590Q92 628 139.5 628T225 593L521 308L956 946Q983 988 1032.5 996T1120 977T1166.5 903.5T1149 815z" /> <glyph glyph-name="ok-1" unicode="ok" horiz-adv-x="1200" d=" M559 -51L62 429Q29 460 27 507.5T57 590Q92 628 139.5 628T225 593L521 308L956 946Q983 988 1032.5 996T1120 977T1166.5 903.5T1149 815z" /> <glyph glyph-name="open" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1185 144V-72H15V144H1185zM1123 89H1010V-18H1123V89zM950 679Q973 651 970.5 615.5T941 554Q928 542 911.5 536.5T878.5 532T846 540.5T818 562L678 715V275H490V715L352 562Q326 534 291 532T228 554Q213 567 205 584T197 619Q197 652 221 679L586 1081z" /> <glyph glyph-name="open-1" unicode="open" horiz-adv-x="1200" d=" M1185 144V-72H15V144H1185zM1123 89H1010V-18H1123V89zM950 679Q973 651 970.5 615.5T941 554Q928 542 911.5 536.5T878.5 532T846 540.5T818 562L678 715V275H490V715L352 562Q326 534 291 532T228 554Q213 567 205 584T197 619Q197 652 221 679L586 1081z" /> <glyph glyph-name="option-horizontal" - unicode="" + unicode="" horiz-adv-x="1200" d=" M689 567Q728 532 728 478T691.5 387T600 350T509 387T473 478T509 569T600 606T689 567zM264 567Q305 532 305 478T268 387T176.5 350T83 387T44 478T83 569T176.5 606T264 567zM1119 567Q1155 532 1155 478T1117 387T1024 350T932.5 387T896 478T932.5 569T1024 606T1119 567z" /> <glyph glyph-name="option-horizontal-1" unicode="option-horizontal" horiz-adv-x="1200" d=" M689 567Q728 532 728 478T691.5 387T600 350T509 387T473 478T509 569T600 606T689 567zM264 567Q305 532 305 478T268 387T176.5 350T83 387T44 478T83 569T176.5 606T264 567zM1119 567Q1155 532 1155 478T1117 387T1024 350T932.5 387T896 478T932.5 569T1024 606T1119 567z" /> <glyph glyph-name="option-vertical" - unicode="" + unicode="" horiz-adv-x="1200" d=" M689 396Q654 357 600 357T509 393.5T472 485T509 576T600 612T691 576T728 485T689 396zM689 821Q654 780 600 780T509 817T472 908.5T509 1002T600 1041T691 1002T728 908.5T689 821zM689 -34Q654 -70 600 -70T509 -32T472 61T509 152.5T600 189T691 152.5T728 61T689 -34z" /> <glyph glyph-name="option-vertical-1" unicode="option-vertical" horiz-adv-x="1200" d=" M689 396Q654 357 600 357T509 393.5T472 485T509 576T600 612T691 576T728 485T689 396zM689 821Q654 780 600 780T509 817T472 908.5T509 1002T600 1041T691 1002T728 908.5T689 821zM689 -34Q654 -70 600 -70T509 -32T472 61T509 152.5T600 189T691 152.5T728 61T689 -34z" /> <glyph glyph-name="paperclip" - unicode="" + unicode="" horiz-adv-x="1200" d=" M322 376Q286 341 286 292T322 207Q357 172 408 172T494 207L1016 730Q1074 789 1074 875Q1074 958 1015.5 1016.5T872 1075Q789 1075 731 1016L208 493Q125 408 125 293Q125 172 208 90T409 8Q535 8 608 91L844 321Q872 350 904 321.5T905 262L671 29Q567 -83 409 -83Q255 -83 144 29Q39 137 39 293Q39 446 144 553L671 1077Q752 1160 872 1160T1078 1077Q1160 994 1160 875Q1160 753 1078 669L555 145Q495 83 408.5 83T260.5 145T199 293Q199 376 261 436L494 669Q525 697 553.5 669.5T555 606z" /> <glyph glyph-name="paperclip-1" unicode="paperclip" horiz-adv-x="1200" d=" M322 376Q286 341 286 292T322 207Q357 172 408 172T494 207L1016 730Q1074 789 1074 875Q1074 958 1015.5 1016.5T872 1075Q789 1075 731 1016L208 493Q125 408 125 293Q125 172 208 90T409 8Q535 8 608 91L844 321Q872 350 904 321.5T905 262L671 29Q567 -83 409 -83Q255 -83 144 29Q39 137 39 293Q39 446 144 553L671 1077Q752 1160 872 1160T1078 1077Q1160 994 1160 875Q1160 753 1078 669L555 145Q495 83 408.5 83T260.5 145T199 293Q199 376 261 436L494 669Q525 697 553.5 669.5T555 606z" /> <glyph glyph-name="paste" - unicode="" + unicode="" horiz-adv-x="1200" d=" M810 90Q793 71 757 71Q728 71 707 94Q658 145 713 195L830 302H456V477H830L713 586Q658 635 707 688Q755 744 810 693L1149 390zM903 732V831Q903 876 872 907T801 938H709V780H289V938H197Q157 938 127.5 907T98 831V15Q98 -29 127.5 -61T197 -93H801Q841 -93 872 -61T903 15H948Q948 -46 904 -89.5T801 -133H197Q137 -133 93.5 -89.5T50 15V831Q50 892 93.5 935T197 978H363Q371 1032 409.5 1064.5T498.5 1097T588 1064.5T635 978H801Q860 978 904 935T948 831V732H903zM570 978Q549 1033 498.5 1033T427 978H570z" /> <glyph glyph-name="paste-1" unicode="paste" horiz-adv-x="1200" d=" M810 90Q793 71 757 71Q728 71 707 94Q658 145 713 195L830 302H456V477H830L713 586Q658 635 707 688Q755 744 810 693L1149 390zM903 732V831Q903 876 872 907T801 938H709V780H289V938H197Q157 938 127.5 907T98 831V15Q98 -29 127.5 -61T197 -93H801Q841 -93 872 -61T903 15H948Q948 -46 904 -89.5T801 -133H197Q137 -133 93.5 -89.5T50 15V831Q50 892 93.5 935T197 978H363Q371 1032 409.5 1064.5T498.5 1097T588 1064.5T635 978H801Q860 978 904 935T948 831V732H903zM570 978Q549 1033 498.5 1033T427 978H570z" /> <glyph glyph-name="pause" - unicode="" + unicode="" horiz-adv-x="1200" d=" M172 914H499V49H172V914zM701 914H1028V49H701V914z" /> <glyph glyph-name="pause-1" unicode="pause" horiz-adv-x="1200" d=" M172 914H499V49H172V914zM701 914H1028V49H701V914z" /> <glyph glyph-name="pencil-add" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 805L275 1080L909 445L1200 -120L646 163zM679 253L693 240L925 122Q929 131 938 140Q950 150 957 155L840 386L824 403Q812 398 800.5 391T780.5 373T768 347.5T767 313Q748 315 734 310T709.5 296.5T691.5 276.5T679 253zM180 899L702 378Q707 393 717 407Q725 419 739 430.5T774 449L253 970zM741 789Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080T979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741z" /> <glyph glyph-name="pencil-add-1" unicode="pencil-add" horiz-adv-x="1200" d=" M0 805L275 1080L909 445L1200 -120L646 163zM679 253L693 240L925 122Q929 131 938 140Q950 150 957 155L840 386L824 403Q812 398 800.5 391T780.5 373T768 347.5T767 313Q748 315 734 310T709.5 296.5T691.5 276.5T679 253zM180 899L702 378Q707 393 717 407Q725 419 739 430.5T774 449L253 970zM741 789Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080T979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741z" /> <glyph glyph-name="pencil-edit" - unicode="" + unicode="" horiz-adv-x="1200" d=" M4 837L246 1080L807 519L1064 20L574 270zM603 350L616 338L821 233Q825 241 833 249Q843 258 849 263L745 467L731 482Q721 478 710.5 471.5T692.5 455.5T681.5 433T681 403Q664 404 652 400T630.5 388.5T614.5 370.5T603 350zM162 920L624 460Q628 473 637 486Q644 496 656.5 506T687 523L227 983zM840 543H1196V-120H534V253L555 232Q594 212 634 195V-20H1096V442H890Q867 493 840 543z" /> <glyph glyph-name="pencil-edit-1" unicode="pencil-edit" horiz-adv-x="1200" d=" M4 837L246 1080L807 519L1064 20L574 270zM603 350L616 338L821 233Q825 241 833 249Q843 258 849 263L745 467L731 482Q721 478 710.5 471.5T692.5 455.5T681.5 433T681 403Q664 404 652 400T630.5 388.5T614.5 370.5T603 350zM162 920L624 460Q628 473 637 486Q644 496 656.5 506T687 523L227 983zM840 543H1196V-120H534V253L555 232Q594 212 634 195V-20H1096V442H890Q867 493 840 543z" /> <glyph glyph-name="pencil" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 805L275 1080L909 445L1200 -120L646 163zM679 253L693 240L925 122Q929 131 938 140Q950 150 957 155L840 386L824 403Q812 398 800.5 391T780.5 373T768 347.5T767 313Q748 315 734 310T709.5 296.5T691.5 276.5T679 253zM180 899L702 378Q707 393 717 407Q725 419 739 430.5T774 449L253 970z" /> <glyph glyph-name="pencil-1" unicode="pencil" horiz-adv-x="1200" d=" M0 805L275 1080L909 445L1200 -120L646 163zM679 253L693 240L925 122Q929 131 938 140Q950 150 957 155L840 386L824 403Q812 398 800.5 391T780.5 373T768 347.5T767 313Q748 315 734 310T709.5 296.5T691.5 276.5T679 253zM180 899L702 378Q707 393 717 407Q725 419 739 430.5T774 449L253 970z" /> <glyph glyph-name="phone" - unicode="" + unicode="" horiz-adv-x="1200" d=" M934 89V-73H772H744H457H429H267V89V126V1000V1005V1162H429H772H934V1091V89zM601 -15Q624 -15 640.5 1T657 39Q657 63 640.5 79T601 95Q577 95 561 79T545 39Q545 17 561 1T601 -15zM848 144V1002H353V144H848z" /> <glyph glyph-name="phone-1" unicode="phone" horiz-adv-x="1200" d=" M934 89V-73H772H744H457H429H267V89V126V1000V1005V1162H429H772H934V1091V89zM601 -15Q624 -15 640.5 1T657 39Q657 63 640.5 79T601 95Q577 95 561 79T545 39Q545 17 561 1T601 -15zM848 144V1002H353V144H848z" /> <glyph glyph-name="picture" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1186 877V-8H14V877H1186zM50 840V222L560 462L790 273L709 462L935 639L1151 506V840H50zM344 683Q374 651 374 607T344 532.5T271.5 502T198 532.5T167 607T198 682T271.5 713T344 683z" /> <glyph glyph-name="picture-1" unicode="picture" horiz-adv-x="1200" d=" M1186 877V-8H14V877H1186zM50 840V222L560 462L790 273L709 462L935 639L1151 506V840H50zM344 683Q374 651 374 607T344 532.5T271.5 502T198 532.5T167 607T198 682T271.5 713T344 683z" /> <glyph glyph-name="pie-chart" - unicode="" + unicode="" horiz-adv-x="1200" d=" M632 1032H648Q696 1032 742 1024L618 562L285 895Q346 949 448 989T632 1032zM823 1003Q874 986 937.5 947.5T1039 871Q1106 804 1153.5 689.5T1201 480T1153.5 271T1039 90T857.5 -24.5T648.5 -72T439.5 -24.5T258 90Q228 120 195 169T145 257L624 386V387Q642 387 656 400.5T671 433zM152 907L588 471Q492 445 301 394T15 317Q-16 472 20 626.5T152 907z" /> <glyph glyph-name="pie-chart-1" unicode="pie-chart" horiz-adv-x="1200" d=" M632 1032H648Q696 1032 742 1024L618 562L285 895Q346 949 448 989T632 1032zM823 1003Q874 986 937.5 947.5T1039 871Q1106 804 1153.5 689.5T1201 480T1153.5 271T1039 90T857.5 -24.5T648.5 -72T439.5 -24.5T258 90Q228 120 195 169T145 257L624 386V387Q642 387 656 400.5T671 433zM152 907L588 471Q492 445 301 394T15 317Q-16 472 20 626.5T152 907z" /> <glyph glyph-name="plane" - unicode="" + unicode="" horiz-adv-x="1200" d=" M12 1039L1187 456L12 -127L270 400L658 447L270 511z" /> <glyph glyph-name="plane-1" unicode="plane" horiz-adv-x="1200" d=" M12 1039L1187 456L12 -127L270 400L658 447L270 511z" /> <glyph glyph-name="play-circle" - unicode="" + unicode="" horiz-adv-x="1200" d=" M271 828Q135 690 135 499T273 171.5T601.5 35T930 171.5T1068 499T930 827.5T601.5 965T271 828zM1004 903Q1176 734 1176 498.5T1006 93T600 -77T194 93T24 498.5T194 904.5T600 1075T1004 903zM486 694L824 499L486 303V694z" /> <glyph glyph-name="play-circle-1" unicode="play-circle" horiz-adv-x="1200" d=" M271 828Q135 690 135 499T273 171.5T601.5 35T930 171.5T1068 499T930 827.5T601.5 965T271 828zM1004 903Q1176 734 1176 498.5T1006 93T600 -77T194 93T24 498.5T194 904.5T600 1075T1004 903zM486 694L824 499L486 303V694z" /> <glyph glyph-name="play" - unicode="" + unicode="" horiz-adv-x="1200" d=" M205 926L995 471L205 18V926z" /> <glyph glyph-name="play-1" unicode="play" horiz-adv-x="1200" d=" M205 926L995 471L205 18V926z" /> <glyph glyph-name="playback" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 480V1080H600H1200V480V-120H600H0V480zM237 -1V60H176H116V-1V-62H176H237V-1zM1084 -1V60H1024H963V-1V-62H1024H1084V-1zM237 240V304L178 302L119 300L117 246Q115 192 118.5 183.5T179 175H237V240zM1081 239V300L1022 302L963 304V239V175L1022 177L1081 178V239zM836 484Q831 488 656 604L481 721V480V239L661 359Q710 392 750.5 420T814 465T836 484zM237 480V541H176H116V480V419H176H237V480zM1084 480V541H1024H963V480V419H1024H1084V480zM237 721V785L178 783L119 782L117 728Q115 674 118.5 665T179 656H237V721zM1081 721V782L1022 783L963 785V721V656L1022 658L1081 660V721zM237 961V1022H176H116V961V900H176H237V961zM1084 961V1022H1024H963V961V900H1024H1084V961z" /> <glyph glyph-name="playback-1" unicode="playback" horiz-adv-x="1200" d=" M0 480V1080H600H1200V480V-120H600H0V480zM237 -1V60H176H116V-1V-62H176H237V-1zM1084 -1V60H1024H963V-1V-62H1024H1084V-1zM237 240V304L178 302L119 300L117 246Q115 192 118.5 183.5T179 175H237V240zM1081 239V300L1022 302L963 304V239V175L1022 177L1081 178V239zM836 484Q831 488 656 604L481 721V480V239L661 359Q710 392 750.5 420T814 465T836 484zM237 480V541H176H116V480V419H176H237V480zM1084 480V541H1024H963V480V419H1024H1084V480zM237 721V785L178 783L119 782L117 728Q115 674 118.5 665T179 656H237V721zM1081 721V782L1022 783L963 785V721V656L1022 658L1081 660V721zM237 961V1022H176H116V961V900H176H237V961zM1084 961V1022H1024H963V961V900H1024H1084V961z" /> <glyph glyph-name="plug" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1143 1080H1200V995L916 711L1034 593Q1058 568 1054.5 530.5T1022 463L837 278L766 349L737 320L807 249L623 64Q593 35 555 31.5T493 52L375 170L85 -120H0V-63L304 241L186 359Q162 383 165.5 421T198 489L383 673L454 603L483 632L412 703L597 888Q627 917 664.5 920.5T727 900L845 782zM554 561L525 532L666 391L695 420z" /> <glyph glyph-name="plug-1" unicode="plug" horiz-adv-x="1200" d=" M1143 1080H1200V995L916 711L1034 593Q1058 568 1054.5 530.5T1022 463L837 278L766 349L737 320L807 249L623 64Q593 35 555 31.5T493 52L375 170L85 -120H0V-63L304 241L186 359Q162 383 165.5 421T198 489L383 673L454 603L483 632L412 703L597 888Q627 917 664.5 920.5T727 900L845 782zM554 561L525 532L666 391L695 420z" /> <glyph glyph-name="plus-sign" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1010 907Q1178 737 1178 497T1008.5 88.5T598 -80T189.5 88.5T22 497T189.5 906T598 1075T1010 907zM952 429Q981 429 1000.5 448.5T1020 497T1000.5 546.5T952 567H670V851Q670 880 648.5 899.5T599 919T550.5 899.5T530 851V567H244Q218 567 198 546.5T178 497T198 448.5T244 429H530V144Q530 115 550.5 95.5T599 76T648.5 95.5T670 144V429H952z" /> <glyph glyph-name="plus-sign-1" unicode="plus-sign" horiz-adv-x="1200" d=" M1010 907Q1178 737 1178 497T1008.5 88.5T598 -80T189.5 88.5T22 497T189.5 906T598 1075T1010 907zM952 429Q981 429 1000.5 448.5T1020 497T1000.5 546.5T952 567H670V851Q670 880 648.5 899.5T599 919T550.5 899.5T530 851V567H244Q218 567 198 546.5T178 497T198 448.5T244 429H530V144Q530 115 550.5 95.5T599 76T648.5 95.5T670 144V429H952z" /> <glyph glyph-name="plus-square" - unicode="" + unicode="" horiz-adv-x="1200" d=" M299 421Q274 421 257 438.5T240 481T257 522T299 538H539V782Q539 806 557 823T599.5 840T641.5 823T659 782V538H902Q924 538 942 522T960 481T942 438.5T902 421H659V178Q659 153 641.5 136.5T599.5 120T557 136.5T539 178V421H299zM0 1080H1200V-120H0V1080zM109 971V-11H1091V971H109z" /> <glyph glyph-name="plus-square-1" unicode="plus-square" horiz-adv-x="1200" d=" M299 421Q274 421 257 438.5T240 481T257 522T299 538H539V782Q539 806 557 823T599.5 840T641.5 823T659 782V538H902Q924 538 942 522T960 481T942 438.5T902 421H659V178Q659 153 641.5 136.5T599.5 120T557 136.5T539 178V421H299zM0 1080H1200V-120H0V1080zM109 971V-11H1091V971H109z" /> <glyph glyph-name="plus" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1070 399H694V20Q694 -19 666.5 -45T600.5 -71T534.5 -45T507 20V399H128Q93 399 65.5 426T38 492T65.5 556.5T128 582H507V962Q507 1000 534.5 1026.5T600.5 1053T666.5 1026.5T694 962V582H1070Q1109 582 1135 556.5T1161 492T1135 426T1070 399z" /> <glyph glyph-name="plus-1" unicode="plus" horiz-adv-x="1200" d=" M1070 399H694V20Q694 -19 666.5 -45T600.5 -71T534.5 -45T507 20V399H128Q93 399 65.5 426T38 492T65.5 556.5T128 582H507V962Q507 1000 534.5 1026.5T600.5 1053T666.5 1026.5T694 962V582H1070Q1109 582 1135 556.5T1161 492T1135 426T1070 399z" /> <glyph glyph-name="point-coordinates" - unicode="" + unicode="" horiz-adv-x="1200" d=" M575 1080L575 987.9082A509.86899 509.86899 0 0 1 91.917969 505L0 505L0 455L91.919922 455A499.2190100000001 493.34449 0 0 1 94.587891 417.68945A509.86899 509.86899 0 0 1 98.779297 391.5332A499.2190100000001 493.34449 0 0 1 105.125 362.36523A509.86899 509.86899 0 0 1 575 -27.9492L575 -120L625 -120L625 -27.9629A509.86899 509.86899 0 0 1 1109.2559 455L1200 455L1200 505L1109.2559 505A509.86899 509.86899 0 0 1 625 987.96289L625 1080L575 1080zM575 947.23438L575 505L132.5957 505A469.19100999999995 469.19100999999995 0 0 0 575 947.23438zM625 455L1068.4961 455A469.19100999999995 469.19100999999995 0 0 0 625 12.7109L625 455z" /> <glyph glyph-name="point-coordinates-1" unicode="point-coordinates" horiz-adv-x="1200" d=" M575 1080L575 987.9082A509.86899 509.86899 0 0 1 91.917969 505L0 505L0 455L91.919922 455A499.2190100000001 493.34449 0 0 1 94.587891 417.68945A509.86899 509.86899 0 0 1 98.779297 391.5332A499.2190100000001 493.34449 0 0 1 105.125 362.36523A509.86899 509.86899 0 0 1 575 -27.9492L575 -120L625 -120L625 -27.9629A509.86899 509.86899 0 0 1 1109.2559 455L1200 455L1200 505L1109.2559 505A509.86899 509.86899 0 0 1 625 987.96289L625 1080L575 1080zM575 947.23438L575 505L132.5957 505A469.19100999999995 469.19100999999995 0 0 0 575 947.23438zM625 455L1068.4961 455A469.19100999999995 469.19100999999995 0 0 0 625 12.7109L625 455z" /> <glyph glyph-name="point-dash" - unicode="" + unicode="" horiz-adv-x="1200" d=" M599.5 1080Q749 1080 855.5 973.5T962 719Q962 408 599 -120Q238 408 238 719Q238 867 344 973.5T599.5 1080zM598 1011Q505 1011 426 952.5T321 806Q296 724 320 607Q350 456 462 239Q515 138 600 7Q785 291 857 517Q904 667 886 777Q870 861 805.5 925T656 1005Q627 1011 598 1011zM603 874Q673 874 729.5 826.5T799 711Q811 651 784 592T705 501Q667 477 621.5 472T534 482Q507 492 483 509T441 549T413 599Q394 648 402.5 703.5T446 799Q474 834 514.5 854T599 874H603zM601 804Q547 804 508.5 765T470 671.5T508.5 579T601 541T692 581Q732 617 732 671.5T693.5 765T601 804z" /> <glyph glyph-name="point-dash-1" unicode="point-dash" horiz-adv-x="1200" d=" M599.5 1080Q749 1080 855.5 973.5T962 719Q962 408 599 -120Q238 408 238 719Q238 867 344 973.5T599.5 1080zM598 1011Q505 1011 426 952.5T321 806Q296 724 320 607Q350 456 462 239Q515 138 600 7Q785 291 857 517Q904 667 886 777Q870 861 805.5 925T656 1005Q627 1011 598 1011zM603 874Q673 874 729.5 826.5T799 711Q811 651 784 592T705 501Q667 477 621.5 472T534 482Q507 492 483 509T441 549T413 599Q394 648 402.5 703.5T446 799Q474 834 514.5 854T599 874H603zM601 804Q547 804 508.5 765T470 671.5T508.5 579T601 541T692 581Q732 617 732 671.5T693.5 765T601 804z" /> <glyph glyph-name="point-minus" - unicode="" + unicode="" horiz-adv-x="1200" d=" M72 671Q72 790 157 875T361.5 960T566 875T651 671Q651 423 361 0Q72 423 72 671zM435 561Q467 590 467 633.5T436.5 708T363 739T289 708T258 633.5T289 559.5T363 529T435 561zM1159 789H741Q725 789 712.5 801T700 830T712.5 859T741 871H1159Q1177 871 1188.5 859T1200 830T1188.5 801T1159 789z" /> <glyph glyph-name="point-minus-1" unicode="point-minus" horiz-adv-x="1200" d=" M72 671Q72 790 157 875T361.5 960T566 875T651 671Q651 423 361 0Q72 423 72 671zM435 561Q467 590 467 633.5T436.5 708T363 739T289 708T258 633.5T289 559.5T363 529T435 561zM1159 789H741Q725 789 712.5 801T700 830T712.5 859T741 871H1159Q1177 871 1188.5 859T1200 830T1188.5 801T1159 789z" /> <glyph glyph-name="point-plus" - unicode="" + unicode="" horiz-adv-x="1200" d=" M72 671Q72 790 157 875T361.5 960T566 875T651 671Q651 423 361 0Q72 423 72 671zM435 561Q467 590 467 633.5T436.5 708T363 739T289 708T258 633.5T289 559.5T363 529T435 561zM741 789Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080T979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741z" /> <glyph glyph-name="point-plus-1" unicode="point-plus" horiz-adv-x="1200" d=" M72 671Q72 790 157 875T361.5 960T566 875T651 671Q651 423 361 0Q72 423 72 671zM435 561Q467 590 467 633.5T436.5 708T363 739T289 708T258 633.5T289 559.5T363 529T435 561zM741 789Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080T979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741z" /> <glyph glyph-name="point-remove" - unicode="" + unicode="" horiz-adv-x="1200" d=" M72 671Q72 790 157 875T361.5 960T566 875T651 671Q651 423 361 0Q72 423 72 671zM435 561Q467 590 467 633.5T436.5 708T363 739T289 708T258 633.5T289 559.5T363 529T435 561zM773 949Q761 961 761.5 978T774 1007T802.5 1019T831 1007L949 888L1069 1008Q1081 1020 1098 1019.5T1127 1007T1139 978T1127 949L1008 830L1127 710Q1138 699 1138.5 682.5T1127 653.5T1098 641.5T1070 653L950 772L831 653Q819 640 802 640.5T773 653.5T760.5 682.5T772 712L892 831z" /> <glyph glyph-name="point-remove-1" unicode="point-remove" horiz-adv-x="1200" d=" M72 671Q72 790 157 875T361.5 960T566 875T651 671Q651 423 361 0Q72 423 72 671zM435 561Q467 590 467 633.5T436.5 708T363 739T289 708T258 633.5T289 559.5T363 529T435 561zM773 949Q761 961 761.5 978T774 1007T802.5 1019T831 1007L949 888L1069 1008Q1081 1020 1098 1019.5T1127 1007T1139 978T1127 949L1008 830L1127 710Q1138 699 1138.5 682.5T1127 653.5T1098 641.5T1070 653L950 772L831 653Q819 640 802 640.5T773 653.5T760.5 682.5T772 712L892 831z" /> <glyph glyph-name="point-trash" - unicode="" + unicode="" horiz-adv-x="1200" d=" M72 671Q72 790 157 875T361.5 960T566 875T651 671Q651 423 361 0Q72 423 72 671zM435 561Q467 590 467 633.5T436.5 708T363 739T289 708T258 633.5T289 559.5T363 529T435 561zM1176 994Q1200 994 1200 969.5T1176 945H723Q700 945 700 969.5T723 994H790V1019Q790 1044 804.5 1062T838 1080H1061Q1082 1080 1096 1062T1110 1019V994H1176zM814 994H1086V1019Q1086 1055 1061 1055H838Q814 1055 814 1019V994zM1164 882L1102 418H796L735 882H1164zM863 452Q881 456 881 475L843 831Q838 853 820 850Q802 850 802 829L841 470Q841 452 860 452H863zM970 831Q970 850 949.5 850T929 831V472Q929 452 949.5 452T970 472V831zM1097 829Q1097 850 1080 850Q1061 853 1058 831L1019 475Q1019 456 1037 452H1038Q1059 452 1059 470z" /> <glyph glyph-name="point-trash-1" unicode="point-trash" horiz-adv-x="1200" d=" M72 671Q72 790 157 875T361.5 960T566 875T651 671Q651 423 361 0Q72 423 72 671zM435 561Q467 590 467 633.5T436.5 708T363 739T289 708T258 633.5T289 559.5T363 529T435 561zM1176 994Q1200 994 1200 969.5T1176 945H723Q700 945 700 969.5T723 994H790V1019Q790 1044 804.5 1062T838 1080H1061Q1082 1080 1096 1062T1110 1019V994H1176zM814 994H1086V1019Q1086 1055 1061 1055H838Q814 1055 814 1019V994zM1164 882L1102 418H796L735 882H1164zM863 452Q881 456 881 475L843 831Q838 853 820 850Q802 850 802 829L841 470Q841 452 860 452H863zM970 831Q970 850 949.5 850T929 831V472Q929 452 949.5 452T970 472V831zM1097 829Q1097 850 1080 850Q1061 853 1058 831L1019 475Q1019 456 1037 452H1038Q1059 452 1059 470z" /> <glyph glyph-name="point" - unicode="" + unicode="" horiz-adv-x="1200" d=" M238 719Q238 867 344 973.5T599.5 1080T855.5 973.5T962 719Q962 408 599 -120Q238 408 238 719zM692 581Q732 617 732 671.5T693.5 765T601 804T508.5 765T470 671.5T508.5 579T601 541T692 581z" /> <glyph glyph-name="point-1" unicode="point" horiz-adv-x="1200" d=" M238 719Q238 867 344 973.5T599.5 1080T855.5 973.5T962 719Q962 408 599 -120Q238 408 238 719zM692 581Q732 617 732 671.5T693.5 765T601 804T508.5 765T470 671.5T508.5 579T601 541T692 581z" /> <glyph glyph-name="polygon-3d" - unicode="" + unicode="" horiz-adv-x="1200" d=" M716.49996 1080Q766.99996 1080 797.99996 1047.5000009999999Q823.49995 1021.000003 823.49995 987.500004Q823.49995 940.000006 771.49996 912.000012Q802.49995 905.000012 820.99996 882.000014Q839.49996 859.00001 839.49996 826.50002Q839.49996 779.00002 804.74995 745.50003Q769.99996 712.00003 718.4999700000001 712.00003Q669.4999700000001 712.00003 637.4999700000001 740.00002Q604.9999700000001 768.50002 599.9999700000001 813.50001L666.9999700000001 822.00002Q669.9999700000001 796.50002 683.9999600000001 782.75002Q697.9999600000001 769.00002 717.9999600000001 769.00002Q739.4999700000001 769.00002 753.9999600000001 785.50002Q768.4999600000001 801.50001 768.4999600000001 829.00001Q768.4999600000001 855.50001 754.4999700000001 870.7500150000001Q740.4999600000001 886.0000170000001 720.4999600000001 886.0000170000001Q706.9999600000001 886.0000170000001 688.9999600000001 880.500014L696.4999600000001 937.000006Q724.4999700000001 936.000007 738.9999600000001 949.000006Q753.9999600000001 962.0000057 753.9999600000001 983.500004Q753.9999600000001 1001.500003 743.2499700000001 1012.500003Q732.4999500000001 1023.500002 714.4999600000001 1023.500002Q696.4999600000001 1023.500002 683.9999600000001 1011.000003Q671.4999700000001 998.500003 668.9999700000001 975.000005L604.9999700000001 986.000004Q611.9999700000001 1018.500003 624.9999700000001 1038.000002Q638.4999700000001 1057.5000009999999 662.4999700000001 1068.5Q686.4999600000001 1080 716.4999600000001 1080zM897.99995 1078.5H1031Q1075.9999 1078.5 1099.4999 1071.5Q1130.9999 1062.5 1153.75 1038.500002Q1176.4999 1014.500003 1187.9999 980.000005Q1200 945.500006 1200 895.000012Q1200 850.50001 1189 818.00001Q1175.5 779.00002 1150.4999 754.50002Q1131.4999 736.00001 1099 725.50001Q1075 718.00003 1035 718.00003H897.99995zM970.49988 1017.500003V779.00002H1024.9999Q1055.5 779.00002 1069 782.50002Q1086.4999 786.50002 1097.9999 797.50002Q1109.9999 808.00002 1117.4999 832.00002Q1124.9999 856.50001 1124.9999 898.2500130000001Q1124.9999 940.000006 1117.4999 962.2500051Q1109.9999 984.500004 1096.75 997.000004Q1083.4999 1009.500003 1063 1014.000003Q1048 1017.500003 1003.5 1017.500003z M124.99999 880.00002Q176.66669 880.00002 213.33329 843.33335Q249.99999 806.66669 249.99999 755.00002Q249.99999 722.50002 233.33329 693.33335L813.33329 114.16669Q842.49999 130.0000300000002 874.99999 130.0000300000002Q926.66669 130.0000300000002 963.33329 93.3333600000001Q999.99999 56.6667000000002 999.99999 5Q999.99999 -46.6666999999998 963.33329 -83.3332999999998Q926.66669 -119.9999999999998 874.99999 -119.9999999999998Q849.99999 -119.9999999999998 825.41669 -108.3332999999998Q800.83329 -96.6666999999998 782.49999 -77.0832999999998Q764.16669 -57.4999999999998 755.83329 -33.3332999999998H243.3332900000001Q231.6666900000001 -69.1666999999998 197.08329 -94.5832999999998Q162.49999 -120 124.99999 -120Q73.333294 -120 36.666694 -83.3333Q-0.0000062500003 -46.6667 -0.0000062500003 5Q-0.0000062500003 42.5 25.416694 77.5Q50.833294 112.5000300000002 86.666694 124.16669V636.66669Q50.833294 648.33335 25.416694 682.91669Q-0.0000062500003 717.50002 -0.0000062500003 755.00002Q-0.0000062500003 806.66669 36.666694 843.33335Q73.333294 880.00002 124.99999 880.00002zM124.99999 817.50002Q99.166694 817.50002 80.833294 799.16669Q62.499994 780.83335 62.499994 755.00002Q62.499994 729.16669 80.833294 710.83335Q99.166694 692.50002 124.99999 692.50002Q141.66669 692.50002 156.24999 700.83335Q170.83329 709.16669 179.16669 723.75002Q187.49999 738.33335 187.49999 755.00002Q187.49999 780.83335 169.16669 799.16669Q150.83329 817.50002 124.99999 817.50002zM176.66669 641.66669Q169.99999 638.33335 163.33329 635.83335V123.3333600000001Q188.33329 115.8333600000001 212.08329 92.0833600000001Q235.83329 68.3333 244.16669 43.3333H756.66669Q758.33329 50 761.66669 56.6667zM124.99999 67.5Q99.166694 67.5 80.833294 49.1667Q62.499994 30.8333 62.499994 5Q62.499994 -20.8333 80.833294 -39.1667Q99.166694 -57.5 124.99999 -57.5Q141.66669 -57.5 156.24999 -49.1667Q170.83329 -40.8333 179.16669 -26.25Q187.49999 -11.6667 187.49999 5Q187.49999 30.8333 169.16669 49.1667Q150.83329 67.5 124.99999 67.5zM874.99999 67.5Q849.16669 67.5 830.83329 49.1667Q812.49999 30.8333 812.49999 5Q812.49999 -20.8333 830.83329 -39.1667Q849.16669 -57.5 874.99999 -57.5Q900.83329 -57.5 919.16669 -39.1667Q937.49999 -20.8333 937.49999 5Q937.49999 21.6667 929.16669 36.25Q920.83329 50.8333 906.24999 59.1667Q891.66669 67.5 874.99999 67.5z" /> <glyph glyph-name="polygon-3d-1" unicode="polygon-3d" horiz-adv-x="1200" d=" M716.49996 1080Q766.99996 1080 797.99996 1047.5000009999999Q823.49995 1021.000003 823.49995 987.500004Q823.49995 940.000006 771.49996 912.000012Q802.49995 905.000012 820.99996 882.000014Q839.49996 859.00001 839.49996 826.50002Q839.49996 779.00002 804.74995 745.50003Q769.99996 712.00003 718.4999700000001 712.00003Q669.4999700000001 712.00003 637.4999700000001 740.00002Q604.9999700000001 768.50002 599.9999700000001 813.50001L666.9999700000001 822.00002Q669.9999700000001 796.50002 683.9999600000001 782.75002Q697.9999600000001 769.00002 717.9999600000001 769.00002Q739.4999700000001 769.00002 753.9999600000001 785.50002Q768.4999600000001 801.50001 768.4999600000001 829.00001Q768.4999600000001 855.50001 754.4999700000001 870.7500150000001Q740.4999600000001 886.0000170000001 720.4999600000001 886.0000170000001Q706.9999600000001 886.0000170000001 688.9999600000001 880.500014L696.4999600000001 937.000006Q724.4999700000001 936.000007 738.9999600000001 949.000006Q753.9999600000001 962.0000057 753.9999600000001 983.500004Q753.9999600000001 1001.500003 743.2499700000001 1012.500003Q732.4999500000001 1023.500002 714.4999600000001 1023.500002Q696.4999600000001 1023.500002 683.9999600000001 1011.000003Q671.4999700000001 998.500003 668.9999700000001 975.000005L604.9999700000001 986.000004Q611.9999700000001 1018.500003 624.9999700000001 1038.000002Q638.4999700000001 1057.5000009999999 662.4999700000001 1068.5Q686.4999600000001 1080 716.4999600000001 1080zM897.99995 1078.5H1031Q1075.9999 1078.5 1099.4999 1071.5Q1130.9999 1062.5 1153.75 1038.500002Q1176.4999 1014.500003 1187.9999 980.000005Q1200 945.500006 1200 895.000012Q1200 850.50001 1189 818.00001Q1175.5 779.00002 1150.4999 754.50002Q1131.4999 736.00001 1099 725.50001Q1075 718.00003 1035 718.00003H897.99995zM970.49988 1017.500003V779.00002H1024.9999Q1055.5 779.00002 1069 782.50002Q1086.4999 786.50002 1097.9999 797.50002Q1109.9999 808.00002 1117.4999 832.00002Q1124.9999 856.50001 1124.9999 898.2500130000001Q1124.9999 940.000006 1117.4999 962.2500051Q1109.9999 984.500004 1096.75 997.000004Q1083.4999 1009.500003 1063 1014.000003Q1048 1017.500003 1003.5 1017.500003z M124.99999 880.00002Q176.66669 880.00002 213.33329 843.33335Q249.99999 806.66669 249.99999 755.00002Q249.99999 722.50002 233.33329 693.33335L813.33329 114.16669Q842.49999 130.0000300000002 874.99999 130.0000300000002Q926.66669 130.0000300000002 963.33329 93.3333600000001Q999.99999 56.6667000000002 999.99999 5Q999.99999 -46.6666999999998 963.33329 -83.3332999999998Q926.66669 -119.9999999999998 874.99999 -119.9999999999998Q849.99999 -119.9999999999998 825.41669 -108.3332999999998Q800.83329 -96.6666999999998 782.49999 -77.0832999999998Q764.16669 -57.4999999999998 755.83329 -33.3332999999998H243.3332900000001Q231.6666900000001 -69.1666999999998 197.08329 -94.5832999999998Q162.49999 -120 124.99999 -120Q73.333294 -120 36.666694 -83.3333Q-0.0000062500003 -46.6667 -0.0000062500003 5Q-0.0000062500003 42.5 25.416694 77.5Q50.833294 112.5000300000002 86.666694 124.16669V636.66669Q50.833294 648.33335 25.416694 682.91669Q-0.0000062500003 717.50002 -0.0000062500003 755.00002Q-0.0000062500003 806.66669 36.666694 843.33335Q73.333294 880.00002 124.99999 880.00002zM124.99999 817.50002Q99.166694 817.50002 80.833294 799.16669Q62.499994 780.83335 62.499994 755.00002Q62.499994 729.16669 80.833294 710.83335Q99.166694 692.50002 124.99999 692.50002Q141.66669 692.50002 156.24999 700.83335Q170.83329 709.16669 179.16669 723.75002Q187.49999 738.33335 187.49999 755.00002Q187.49999 780.83335 169.16669 799.16669Q150.83329 817.50002 124.99999 817.50002zM176.66669 641.66669Q169.99999 638.33335 163.33329 635.83335V123.3333600000001Q188.33329 115.8333600000001 212.08329 92.0833600000001Q235.83329 68.3333 244.16669 43.3333H756.66669Q758.33329 50 761.66669 56.6667zM124.99999 67.5Q99.166694 67.5 80.833294 49.1667Q62.499994 30.8333 62.499994 5Q62.499994 -20.8333 80.833294 -39.1667Q99.166694 -57.5 124.99999 -57.5Q141.66669 -57.5 156.24999 -49.1667Q170.83329 -40.8333 179.16669 -26.25Q187.49999 -11.6667 187.49999 5Q187.49999 30.8333 169.16669 49.1667Q150.83329 67.5 124.99999 67.5zM874.99999 67.5Q849.16669 67.5 830.83329 49.1667Q812.49999 30.8333 812.49999 5Q812.49999 -20.8333 830.83329 -39.1667Q849.16669 -57.5 874.99999 -57.5Q900.83329 -57.5 919.16669 -39.1667Q937.49999 -20.8333 937.49999 5Q937.49999 21.6667 929.16669 36.25Q920.83329 50.8333 906.24999 59.1667Q891.66669 67.5 874.99999 67.5z" /> <glyph glyph-name="polygon-dash" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L381 756L315 690L212 794Q204 790 196 787V780H104V788Q61 802 30.5 843.5T0 930Q0 992 44 1036T150 1080V1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855Q170 855 187.5 865T215 892.5T225 930Q225 961 203 983T150 1005zM104 730H196V630H104V730zM452 685L522 615L457 549L386 620zM593 544L664 473L598 407L527 478zM104 530H196V430H104V530zM735 402L805 332L740 266L669 337zM104 330H196V230H104V330zM876 261L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q1020 -120 990.5 -106T939 -68.5T907 -16H900V76H908Q910 84 914 92L810 195zM104 180H196V172Q226 163 254.5 134.5T293 76H300V-16H292Q278 -59 236.5 -89.5T150 -120Q88 -120 44 -76T0 30Q0 75 30.5 117T104 173V180zM150 105Q119 105 97 83T75 30T97 -23T150 -45Q170 -45 187.5 -35T215 -7.5T225 30Q225 61 203 83T150 105zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 50 1115 67.5T1087.5 95T1050 105zM350 76H450V-16H350V76zM550 76H650V-16H550V76zM750 76H850V-16H750V76z" /> <glyph glyph-name="polygon-dash-1" unicode="polygon-dash" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L381 756L315 690L212 794Q204 790 196 787V780H104V788Q61 802 30.5 843.5T0 930Q0 992 44 1036T150 1080V1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855Q170 855 187.5 865T215 892.5T225 930Q225 961 203 983T150 1005zM104 730H196V630H104V730zM452 685L522 615L457 549L386 620zM593 544L664 473L598 407L527 478zM104 530H196V430H104V530zM735 402L805 332L740 266L669 337zM104 330H196V230H104V330zM876 261L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q1020 -120 990.5 -106T939 -68.5T907 -16H900V76H908Q910 84 914 92L810 195zM104 180H196V172Q226 163 254.5 134.5T293 76H300V-16H292Q278 -59 236.5 -89.5T150 -120Q88 -120 44 -76T0 30Q0 75 30.5 117T104 173V180zM150 105Q119 105 97 83T75 30T97 -23T150 -45Q170 -45 187.5 -35T215 -7.5T225 30Q225 61 203 83T150 105zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 50 1115 67.5T1087.5 95T1050 105zM350 76H450V-16H350V76zM550 76H650V-16H550V76zM750 76H850V-16H750V76z" /> <glyph glyph-name="polygon-minus" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q1020 -120 990.5 -106T939 -68.5T907 -16H292Q278 -59 236.5 -89.5T150 -120Q88 -120 44 -76T0 30Q0 75 30.5 117T104 173V788Q61 802 30.5 843.5T0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855Q170 855 187.5 865T215 892.5T225 930Q225 961 203 983T150 1005zM212 794Q204 790 196 787V172Q226 163 254.5 134.5T293 76H908Q910 84 914 92zM150 105Q119 105 97 83T75 30T97 -23T150 -45Q170 -45 187.5 -35T215 -7.5T225 30Q225 61 203 83T150 105zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 50 1115 67.5T1087.5 95T1050 105zM1160 789H741Q725 789 712.5 801T700 830T712.5 859T741 871H1160Q1177 871 1188.5 859T1200 830T1188.5 801T1160 789z" /> <glyph glyph-name="polygon-minus-1" unicode="polygon-minus" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q1020 -120 990.5 -106T939 -68.5T907 -16H292Q278 -59 236.5 -89.5T150 -120Q88 -120 44 -76T0 30Q0 75 30.5 117T104 173V788Q61 802 30.5 843.5T0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855Q170 855 187.5 865T215 892.5T225 930Q225 961 203 983T150 1005zM212 794Q204 790 196 787V172Q226 163 254.5 134.5T293 76H908Q910 84 914 92zM150 105Q119 105 97 83T75 30T97 -23T150 -45Q170 -45 187.5 -35T215 -7.5T225 30Q225 61 203 83T150 105zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 50 1115 67.5T1087.5 95T1050 105zM1160 789H741Q725 789 712.5 801T700 830T712.5 859T741 871H1160Q1177 871 1188.5 859T1200 830T1188.5 801T1160 789z" /> <glyph glyph-name="polygon-plus" - unicode="" + unicode="" horiz-adv-x="1200" d=" M741 789Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080T979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741zM150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120V-120Q1005 -120 963 -89.5T907 -16H292Q278 -59 236.5 -89.5T150 -120Q88 -120 44 -76T0 30Q0 75 30.5 117T104 173V788Q61 802 30.5 843.5T0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855V855Q170 855 187.5 865T215 892.5T225 930T215 967.5T187.5 995T150 1005V1005zM212 794Q204 790 196 787V172Q226 163 254.5 134.5T293 76H908Q910 84 914 92zM150 105Q119 105 97 83T75 30T97 -23T150 -45V-45Q170 -45 187.5 -35T215 -7.5T225 30T215 67.5T187.5 95T150 105V105zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45V-45Q1070 -45 1087.5 -35T1115 -7.5T1125 30Q1125 61 1103 83T1050 105V105z" /> <glyph glyph-name="polygon-plus-1" unicode="polygon-plus" horiz-adv-x="1200" d=" M741 789Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080T979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741zM150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120V-120Q1005 -120 963 -89.5T907 -16H292Q278 -59 236.5 -89.5T150 -120Q88 -120 44 -76T0 30Q0 75 30.5 117T104 173V788Q61 802 30.5 843.5T0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855V855Q170 855 187.5 865T215 892.5T225 930T215 967.5T187.5 995T150 1005V1005zM212 794Q204 790 196 787V172Q226 163 254.5 134.5T293 76H908Q910 84 914 92zM150 105Q119 105 97 83T75 30T97 -23T150 -45V-45Q170 -45 187.5 -35T215 -7.5T225 30T215 67.5T187.5 95T150 105V105zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45V-45Q1070 -45 1087.5 -35T1115 -7.5T1125 30Q1125 61 1103 83T1050 105V105z" /> <glyph glyph-name="polygon-remove" - unicode="" + unicode="" horiz-adv-x="1200" d=" M773 949Q761 961 761.5 978T774 1007T802.5 1019T831 1007L949 888L1069 1008Q1081 1020 1098 1019.5T1127 1007T1139 978T1127 949L1008 830L1127 710Q1138 699 1138.5 682.5T1127 653.5T1098 641.5T1070 653L950 772L831 653Q819 640 802 640.5T773 653.5T760.5 682.5T772 712L892 831zM150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120V-120Q1005 -120 963 -89.5T907 -16H292Q278 -59 236.5 -89.5T150 -120Q88 -120 44 -76T0 30Q0 75 30.5 117T104 173V788Q61 802 30.5 843.5T0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855V855Q170 855 187.5 865T215 892.5T225 930T215 967.5T187.5 995T150 1005V1005zM212 794Q204 790 196 787V172Q226 163 254.5 134.5T293 76H908Q910 84 914 92zM150 105Q119 105 97 83T75 30T97 -23T150 -45V-45Q170 -45 187.5 -35T215 -7.5T225 30T215 67.5T187.5 95T150 105V105zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45V-45Q1070 -45 1087.5 -35T1115 -7.5T1125 30Q1125 61 1103 83T1050 105V105z" /> <glyph glyph-name="polygon-remove-1" unicode="polygon-remove" horiz-adv-x="1200" d=" M773 949Q761 961 761.5 978T774 1007T802.5 1019T831 1007L949 888L1069 1008Q1081 1020 1098 1019.5T1127 1007T1139 978T1127 949L1008 830L1127 710Q1138 699 1138.5 682.5T1127 653.5T1098 641.5T1070 653L950 772L831 653Q819 640 802 640.5T773 653.5T760.5 682.5T772 712L892 831zM150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120V-120Q1005 -120 963 -89.5T907 -16H292Q278 -59 236.5 -89.5T150 -120Q88 -120 44 -76T0 30Q0 75 30.5 117T104 173V788Q61 802 30.5 843.5T0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855V855Q170 855 187.5 865T215 892.5T225 930T215 967.5T187.5 995T150 1005V1005zM212 794Q204 790 196 787V172Q226 163 254.5 134.5T293 76H908Q910 84 914 92zM150 105Q119 105 97 83T75 30T97 -23T150 -45V-45Q170 -45 187.5 -35T215 -7.5T225 30T215 67.5T187.5 95T150 105V105zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45V-45Q1070 -45 1087.5 -35T1115 -7.5T1125 30Q1125 61 1103 83T1050 105V105z" /> <glyph glyph-name="polygon-trash" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q1020 -120 990.5 -106T939 -68.5T907 -16H292Q278 -59 236.5 -89.5T150 -120Q88 -120 44 -76T0 30Q0 75 30.5 117T104 173V788Q61 802 30.5 843.5T0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855Q170 855 187.5 865T215 892.5T225 930Q225 961 203 983T150 1005zM212 794Q204 790 196 787V172Q226 163 254.5 134.5T293 76H908Q910 84 914 92zM150 105Q119 105 97 83T75 30T97 -23T150 -45Q170 -45 187.5 -35T215 -7.5T225 30Q225 61 203 83T150 105zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 50 1115 67.5T1087.5 95T1050 105zM1176 994Q1200 994 1200 969.5T1176 945H723Q700 945 700 969.5T723 994H790V1019Q790 1044 804.5 1062T838 1080H1061Q1082 1080 1096 1062T1110 1019V994H1176zM814 994H1086V1019Q1086 1055 1061 1055H838Q814 1055 814 1019V994zM1164 882L1102 418H796L735 882H1164zM863 452Q881 456 881 475L843 831Q838 853 820 850Q802 850 802 829L841 470Q841 452 860 452H863zM970 831Q970 850 949.5 850T929 831V472Q929 452 949.5 452T970 472V831zM1097 829Q1097 850 1080 850Q1061 853 1058 831L1019 475Q1019 456 1037 452H1038Q1059 452 1059 470z" /> <glyph glyph-name="polygon-trash-1" unicode="polygon-trash" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q1020 -120 990.5 -106T939 -68.5T907 -16H292Q278 -59 236.5 -89.5T150 -120Q88 -120 44 -76T0 30Q0 75 30.5 117T104 173V788Q61 802 30.5 843.5T0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855Q170 855 187.5 865T215 892.5T225 930Q225 961 203 983T150 1005zM212 794Q204 790 196 787V172Q226 163 254.5 134.5T293 76H908Q910 84 914 92zM150 105Q119 105 97 83T75 30T97 -23T150 -45Q170 -45 187.5 -35T215 -7.5T225 30Q225 61 203 83T150 105zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 50 1115 67.5T1087.5 95T1050 105zM1176 994Q1200 994 1200 969.5T1176 945H723Q700 945 700 969.5T723 994H790V1019Q790 1044 804.5 1062T838 1080H1061Q1082 1080 1096 1062T1110 1019V994H1176zM814 994H1086V1019Q1086 1055 1061 1055H838Q814 1055 814 1019V994zM1164 882L1102 418H796L735 882H1164zM863 452Q881 456 881 475L843 831Q838 853 820 850Q802 850 802 829L841 470Q841 452 860 452H863zM970 831Q970 850 949.5 850T929 831V472Q929 452 949.5 452T970 472V831zM1097 829Q1097 850 1080 850Q1061 853 1058 831L1019 475Q1019 456 1037 452H1038Q1059 452 1059 470z" /> <glyph glyph-name="polygon" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q1020 -120 990.5 -106T939 -68.5T907 -16H292Q278 -59 236.5 -89.5T150 -120Q88 -120 44 -76T0 30Q0 75 30.5 117T104 173V788Q61 802 30.5 843.5T0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855Q170 855 187.5 865T215 892.5T225 930Q225 961 203 983T150 1005zM212 794Q204 790 196 787V172Q226 163 254.5 134.5T293 76H908Q910 84 914 92zM150 105Q119 105 97 83T75 30T97 -23T150 -45Q170 -45 187.5 -35T215 -7.5T225 30Q225 61 203 83T150 105zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 50 1115 67.5T1087.5 95T1050 105z" /> <glyph glyph-name="polygon-1" unicode="polygon" horiz-adv-x="1200" d=" M150 1080Q212 1080 256 1036T300 930Q300 891 280 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q1020 -120 990.5 -106T939 -68.5T907 -16H292Q278 -59 236.5 -89.5T150 -120Q88 -120 44 -76T0 30Q0 75 30.5 117T104 173V788Q61 802 30.5 843.5T0 930Q0 992 44 1036T150 1080zM150 1005Q119 1005 97 983T75 930T97 877T150 855Q170 855 187.5 865T215 892.5T225 930Q225 961 203 983T150 1005zM212 794Q204 790 196 787V172Q226 163 254.5 134.5T293 76H908Q910 84 914 92zM150 105Q119 105 97 83T75 30T97 -23T150 -45Q170 -45 187.5 -35T215 -7.5T225 30Q225 61 203 83T150 105zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 50 1115 67.5T1087.5 95T1050 105z" /> <glyph glyph-name="polyline-3d" - unicode="" + unicode="" horiz-adv-x="1200" d=" M716.49996 1080Q766.99996 1080 797.99996 1047.5000009999999Q823.49995 1021.000003 823.49995 987.500004Q823.49995 940.000006 771.49996 912.000012Q802.49995 905.000012 820.99996 882.000014Q839.49996 859.00001 839.49996 826.50002Q839.49996 779.00002 804.74995 745.50003Q769.99996 712.00003 718.4999700000001 712.00003Q669.4999700000001 712.00003 637.4999700000001 740.00002Q604.9999700000001 768.50002 599.9999700000001 813.50001L666.9999700000001 822.00002Q669.9999700000001 796.50002 683.9999600000001 782.75002Q697.9999600000001 769.00002 717.9999600000001 769.00002Q739.4999700000001 769.00002 753.9999600000001 785.50002Q768.4999600000001 801.50001 768.4999600000001 829.00001Q768.4999600000001 855.50001 754.4999700000001 870.7500150000001Q740.4999600000001 886.0000170000001 720.4999600000001 886.0000170000001Q706.9999600000001 886.0000170000001 688.9999600000001 880.500014L696.4999600000001 937.000006Q724.4999700000001 936.000007 738.9999600000001 949.000006Q753.9999600000001 962.0000057 753.9999600000001 983.500004Q753.9999600000001 1001.500003 743.2499700000001 1012.500003Q732.4999500000001 1023.500002 714.4999600000001 1023.500002Q696.4999600000001 1023.500002 683.9999600000001 1011.000003Q671.4999700000001 998.500003 668.9999700000001 975.000005L604.9999700000001 986.000004Q611.9999700000001 1018.500003 624.9999700000001 1038.000002Q638.4999700000001 1057.5000009999999 662.4999700000001 1068.5Q686.4999600000001 1080 716.4999600000001 1080zM897.99995 1078.5H1031Q1075.9999 1078.5 1099.4999 1071.5Q1130.9999 1062.5 1153.75 1038.500002Q1176.4999 1014.500003 1187.9999 980.000005Q1200 945.500006 1200 895.000012Q1200 850.50001 1189 818.00001Q1175.5 779.00002 1150.4999 754.50002Q1131.4999 736.00001 1099 725.50001Q1075 718.00003 1035 718.00003H897.99995zM970.49988 1017.500003V779.00002H1024.9999Q1055.5 779.00002 1069 782.50002Q1086.4999 786.50002 1097.9999 797.50002Q1109.9999 808.00002 1117.4999 832.00002Q1124.9999 856.50001 1124.9999 898.2500130000001Q1124.9999 940.000006 1117.4999 962.2500051Q1109.9999 984.500004 1096.75 997.000004Q1083.4999 1009.500003 1063 1014.000003Q1048 1017.500003 1003.5 1017.500003z M124.99999 880.0000299999999H127.49999H128.33329V880.0000299999999H131.66669Q155.83329 878.33336 177.91669 868.33336Q199.99999 858.33336 215.83329 841.6667Q231.6666900000001 825.0000299999999 240.8332900000001 802.5000299999999Q249.9999900000001 780.0000299999999 249.9999900000001 755.0000299999999Q249.9999900000001 746.6667 248.3332900000001 737.5000299999999V735.83336V735.0000299999999Q244.9999900000001 713.33336 234.1666900000001 693.33336L813.33329 114.1667Q842.49999 130 874.99999 130Q926.66669 130 963.33329 93.3333Q999.99999 56.6667 999.99999 5Q999.99999 -46.6667 963.33329 -83.3333Q926.66669 -120 874.99999 -120Q819.99999 -120 783.33329 -80Q781.66669 -77.5 779.16669 -75Q777.49999 -72.5 774.99999 -70Q773.33329 -67.5 771.66669 -65.8333L768.33329 -59.1667Q766.66669 -57.5 765.83329 -55Q763.33329 -51.6667 761.66669 -48.3333Q760.83329 -45.8333 759.99999 -44.1667Q758.33329 -40 757.49999 -35.8333Q749.99999 -15.8333 749.99999 5Q749.99999 25.8333 756.66669 45.8333Q759.16669 50.8333 761.66669 56.6667L194.99999 622.50003L237.4999900000001 463.3333600000001L239.9999900000001 454.1667L294.16669 254.1666700000001Q326.66669 253.33334 354.9999900000001 237.5000000000001Q399.9999900000001 210.8333400000001 413.3332900000001 160.8333000000002Q426.66669 110.8333000000002 400.8332900000001 66.25Q374.9999900000001 21.6667000000002 324.9999900000001 8.3333000000002Q274.9999900000001 -5 229.9999900000001 20.8333000000002Q183.33329 48.3333000000002 170.83329 101.6667000000002Q169.99999 104.1667000000002 169.99999 106.6667000000002Q169.16669 110.8333000000002 169.16669 114.1667000000002Q168.33329 116.6667000000002 168.33329 119.1667000000002Q168.33329 123.3333000000002 167.49999 126.6667000000002V131.6667000000002Q168.33329 135.8333000000002 168.33329 139.1667000000002V144.1667000000002L169.99999 152.5Q174.16669 173.3333000000002 184.16669 191.6666700000001Q194.99999 209.1666700000001 210.83329 223.33334Q214.99999 226.6666700000001 219.99999 230L162.49999 443.33336L112.49999 630.83336Q103.33329 631.6667 94.999994 634.1667Q77.499994 638.33336 62.499994 646.6667Q44.999994 656.6667 31.666694 671.6667Q31.666694 672.5000299999999 30.833294 672.9167Q29.999994 673.33336 29.166694 675.0000299999999Q28.333294 675.83336 27.499994 677.5000299999999Q26.666694 677.5000299999999 25.833294 679.1667Q19.166694 688.33336 13.749994 698.7500299999999Q8.3332937 709.1667 4.9999937 720.83336V720.83336Q0.83329375 735.83336 -0.0000062500003 751.6667V755.0000299999999V755.0000299999999V758.33336V765.0000299999999Q0.83329375 765.83336 0.83329375 767.50003V770.83336V771.6667Q1.6666937 772.5000299999999 1.6666937 774.1667V775.0000299999999V776.6667V777.5000299999999L2.4999937 778.33336V780.0000299999999V780.83336Q3.3332937 782.5000299999999 3.3332937 783.33336V784.1667Q3.3332937 785.0000299999999 4.1666937 785.83336V786.6667Q4.1666937 788.33336 4.9999937 789.1667V790.0000299999999Q4.9999937 790.83336 5.8332937 792.5000299999999Q9.9999937 805.83336 16.666694 817.5000299999999Q35.833294 850.83336 70.833294 867.5000299999999L71.666694 868.33336H72.083294H73.333294Q93.333294 878.33336 115.83329 880.0000299999999H116.66669H119.16669H119.99999H122.08329H124.16669zM124.16669 817.5000299999999H123.33329H120.83329H119.99999H117.49999Q115.83329 816.6667 114.99999 816.6667H114.16669Q111.66669 816.6667 108.33329 815.83336Q107.49999 815.00003 105.83329 814.58336Q104.16669 814.1667 103.33329 814.1667L102.49999 813.33336H101.66669L100.83329 812.50003Q99.166694 812.50003 97.499994 811.6667Q87.499994 806.6667 79.583294 797.9167Q71.666694 789.1667 67.083294 778.3333600000001Q62.499994 767.50003 62.499994 755.00003Q62.499994 729.1667 80.833294 710.8333600000001Q99.166694 692.50003 124.99999 692.50003H131.66669Q132.49999 692.50003 134.16669 693.3333600000001H134.99999H136.24999H138.33329V694.1667Q165.83329 700.00003 179.16669 723.3333600000001Q192.49999 745.8333600000001 185.83329 771.25003Q179.16669 796.6667000000001 156.66669 809.1667000000001Q144.16669 816.6667000000001 129.99999 817.50003H129.16669H126.66669zM291.66669 191.6666700000001Q284.16669 191.6666700000001 276.66669 189.1666700000001Q251.66669 182.5000000000001 238.3332900000001 160Q224.99999 137.5 232.0832900000001 112.5Q239.1666900000001 87.5 261.66669 74.5833000000002Q284.16669 61.6667000000002 309.16669 68.3333000000002Q334.16669 75 347.0832900000001 97.5Q359.9999900000001 120 353.3332900000001 145Q346.66669 170 324.16669 183.3333400000001Q309.16669 191.6666700000002 291.66669 191.6666700000002zM874.99999 67.5Q849.16669 67.5 830.83329 49.1667Q812.49999 30.8333 812.49999 5Q812.49999 -20.8333 830.83329 -39.1667Q849.16669 -57.5 874.99999 -57.5Q900.83329 -57.5 919.16669 -39.1667Q937.49999 -20.8333 937.49999 5Q937.49999 17.5 932.49999 29.1667Q927.49999 40.8333 919.16669 49.1667Q910.83329 57.5 899.16669 62.5Q887.49999 67.5 874.99999 67.5z" /> <glyph glyph-name="polyline-3d-1" unicode="polyline-3d" horiz-adv-x="1200" d=" M716.49996 1080Q766.99996 1080 797.99996 1047.5000009999999Q823.49995 1021.000003 823.49995 987.500004Q823.49995 940.000006 771.49996 912.000012Q802.49995 905.000012 820.99996 882.000014Q839.49996 859.00001 839.49996 826.50002Q839.49996 779.00002 804.74995 745.50003Q769.99996 712.00003 718.4999700000001 712.00003Q669.4999700000001 712.00003 637.4999700000001 740.00002Q604.9999700000001 768.50002 599.9999700000001 813.50001L666.9999700000001 822.00002Q669.9999700000001 796.50002 683.9999600000001 782.75002Q697.9999600000001 769.00002 717.9999600000001 769.00002Q739.4999700000001 769.00002 753.9999600000001 785.50002Q768.4999600000001 801.50001 768.4999600000001 829.00001Q768.4999600000001 855.50001 754.4999700000001 870.7500150000001Q740.4999600000001 886.0000170000001 720.4999600000001 886.0000170000001Q706.9999600000001 886.0000170000001 688.9999600000001 880.500014L696.4999600000001 937.000006Q724.4999700000001 936.000007 738.9999600000001 949.000006Q753.9999600000001 962.0000057 753.9999600000001 983.500004Q753.9999600000001 1001.500003 743.2499700000001 1012.500003Q732.4999500000001 1023.500002 714.4999600000001 1023.500002Q696.4999600000001 1023.500002 683.9999600000001 1011.000003Q671.4999700000001 998.500003 668.9999700000001 975.000005L604.9999700000001 986.000004Q611.9999700000001 1018.500003 624.9999700000001 1038.000002Q638.4999700000001 1057.5000009999999 662.4999700000001 1068.5Q686.4999600000001 1080 716.4999600000001 1080zM897.99995 1078.5H1031Q1075.9999 1078.5 1099.4999 1071.5Q1130.9999 1062.5 1153.75 1038.500002Q1176.4999 1014.500003 1187.9999 980.000005Q1200 945.500006 1200 895.000012Q1200 850.50001 1189 818.00001Q1175.5 779.00002 1150.4999 754.50002Q1131.4999 736.00001 1099 725.50001Q1075 718.00003 1035 718.00003H897.99995zM970.49988 1017.500003V779.00002H1024.9999Q1055.5 779.00002 1069 782.50002Q1086.4999 786.50002 1097.9999 797.50002Q1109.9999 808.00002 1117.4999 832.00002Q1124.9999 856.50001 1124.9999 898.2500130000001Q1124.9999 940.000006 1117.4999 962.2500051Q1109.9999 984.500004 1096.75 997.000004Q1083.4999 1009.500003 1063 1014.000003Q1048 1017.500003 1003.5 1017.500003z M124.99999 880.0000299999999H127.49999H128.33329V880.0000299999999H131.66669Q155.83329 878.33336 177.91669 868.33336Q199.99999 858.33336 215.83329 841.6667Q231.6666900000001 825.0000299999999 240.8332900000001 802.5000299999999Q249.9999900000001 780.0000299999999 249.9999900000001 755.0000299999999Q249.9999900000001 746.6667 248.3332900000001 737.5000299999999V735.83336V735.0000299999999Q244.9999900000001 713.33336 234.1666900000001 693.33336L813.33329 114.1667Q842.49999 130 874.99999 130Q926.66669 130 963.33329 93.3333Q999.99999 56.6667 999.99999 5Q999.99999 -46.6667 963.33329 -83.3333Q926.66669 -120 874.99999 -120Q819.99999 -120 783.33329 -80Q781.66669 -77.5 779.16669 -75Q777.49999 -72.5 774.99999 -70Q773.33329 -67.5 771.66669 -65.8333L768.33329 -59.1667Q766.66669 -57.5 765.83329 -55Q763.33329 -51.6667 761.66669 -48.3333Q760.83329 -45.8333 759.99999 -44.1667Q758.33329 -40 757.49999 -35.8333Q749.99999 -15.8333 749.99999 5Q749.99999 25.8333 756.66669 45.8333Q759.16669 50.8333 761.66669 56.6667L194.99999 622.50003L237.4999900000001 463.3333600000001L239.9999900000001 454.1667L294.16669 254.1666700000001Q326.66669 253.33334 354.9999900000001 237.5000000000001Q399.9999900000001 210.8333400000001 413.3332900000001 160.8333000000002Q426.66669 110.8333000000002 400.8332900000001 66.25Q374.9999900000001 21.6667000000002 324.9999900000001 8.3333000000002Q274.9999900000001 -5 229.9999900000001 20.8333000000002Q183.33329 48.3333000000002 170.83329 101.6667000000002Q169.99999 104.1667000000002 169.99999 106.6667000000002Q169.16669 110.8333000000002 169.16669 114.1667000000002Q168.33329 116.6667000000002 168.33329 119.1667000000002Q168.33329 123.3333000000002 167.49999 126.6667000000002V131.6667000000002Q168.33329 135.8333000000002 168.33329 139.1667000000002V144.1667000000002L169.99999 152.5Q174.16669 173.3333000000002 184.16669 191.6666700000001Q194.99999 209.1666700000001 210.83329 223.33334Q214.99999 226.6666700000001 219.99999 230L162.49999 443.33336L112.49999 630.83336Q103.33329 631.6667 94.999994 634.1667Q77.499994 638.33336 62.499994 646.6667Q44.999994 656.6667 31.666694 671.6667Q31.666694 672.5000299999999 30.833294 672.9167Q29.999994 673.33336 29.166694 675.0000299999999Q28.333294 675.83336 27.499994 677.5000299999999Q26.666694 677.5000299999999 25.833294 679.1667Q19.166694 688.33336 13.749994 698.7500299999999Q8.3332937 709.1667 4.9999937 720.83336V720.83336Q0.83329375 735.83336 -0.0000062500003 751.6667V755.0000299999999V755.0000299999999V758.33336V765.0000299999999Q0.83329375 765.83336 0.83329375 767.50003V770.83336V771.6667Q1.6666937 772.5000299999999 1.6666937 774.1667V775.0000299999999V776.6667V777.5000299999999L2.4999937 778.33336V780.0000299999999V780.83336Q3.3332937 782.5000299999999 3.3332937 783.33336V784.1667Q3.3332937 785.0000299999999 4.1666937 785.83336V786.6667Q4.1666937 788.33336 4.9999937 789.1667V790.0000299999999Q4.9999937 790.83336 5.8332937 792.5000299999999Q9.9999937 805.83336 16.666694 817.5000299999999Q35.833294 850.83336 70.833294 867.5000299999999L71.666694 868.33336H72.083294H73.333294Q93.333294 878.33336 115.83329 880.0000299999999H116.66669H119.16669H119.99999H122.08329H124.16669zM124.16669 817.5000299999999H123.33329H120.83329H119.99999H117.49999Q115.83329 816.6667 114.99999 816.6667H114.16669Q111.66669 816.6667 108.33329 815.83336Q107.49999 815.00003 105.83329 814.58336Q104.16669 814.1667 103.33329 814.1667L102.49999 813.33336H101.66669L100.83329 812.50003Q99.166694 812.50003 97.499994 811.6667Q87.499994 806.6667 79.583294 797.9167Q71.666694 789.1667 67.083294 778.3333600000001Q62.499994 767.50003 62.499994 755.00003Q62.499994 729.1667 80.833294 710.8333600000001Q99.166694 692.50003 124.99999 692.50003H131.66669Q132.49999 692.50003 134.16669 693.3333600000001H134.99999H136.24999H138.33329V694.1667Q165.83329 700.00003 179.16669 723.3333600000001Q192.49999 745.8333600000001 185.83329 771.25003Q179.16669 796.6667000000001 156.66669 809.1667000000001Q144.16669 816.6667000000001 129.99999 817.50003H129.16669H126.66669zM291.66669 191.6666700000001Q284.16669 191.6666700000001 276.66669 189.1666700000001Q251.66669 182.5000000000001 238.3332900000001 160Q224.99999 137.5 232.0832900000001 112.5Q239.1666900000001 87.5 261.66669 74.5833000000002Q284.16669 61.6667000000002 309.16669 68.3333000000002Q334.16669 75 347.0832900000001 97.5Q359.9999900000001 120 353.3332900000001 145Q346.66669 170 324.16669 183.3333400000001Q309.16669 191.6666700000002 291.66669 191.6666700000002zM874.99999 67.5Q849.16669 67.5 830.83329 49.1667Q812.49999 30.8333 812.49999 5Q812.49999 -20.8333 830.83329 -39.1667Q849.16669 -57.5 874.99999 -57.5Q900.83329 -57.5 919.16669 -39.1667Q937.49999 -20.8333 937.49999 5Q937.49999 17.5 932.49999 29.1667Q927.49999 40.8333 919.16669 49.1667Q910.83329 57.5 899.16669 62.5Q887.49999 67.5 874.99999 67.5z" /> <glyph glyph-name="polyline-dash" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080H153H154V1080H158Q217 1077 258.5 1033.5T300 930Q300 920 298 909V907V906Q294 880 281 856L381 756L315 690L234 771L251 710L161 686L135 781Q125 782 115 784V784Q94 789 75 800Q54 812 38 830Q38 831 37 832Q35 834 33 837Q29 841 26 846Q25 848 24 849Q22 852 21 854Q18 858 17 862Q16 862 16 862.5V863Q16 864 15 864Q12 871 9 879V880Q8 881 8 882L6 888V889Q1 905 0 922V926V930V930V934V942Q1 943 1 945V946V949V950Q2 951 2 953V954V956L3 958V960V961Q4 963 4 964V965Q4 966 5 967V968Q5 970 6 971V972Q6 973 7 975Q12 991 20 1005Q43 1045 85 1065L86 1065.5L88 1066Q112 1078 139 1080H140H143H144H146.5H149H150zM149 1005H148H145H144H141Q139 1004 138 1004H137Q134 1004 130 1003Q129 1002 127 1001.5T124 1001L123 1000H122L121 999Q119 999 117 998Q105 992 95.5 981.5T80.5 958T75 930Q75 899 97 877T150 855H158Q159 855 161 856H162H163.5H166V857Q199 864 215 892Q231 919 223 949.5T188 995Q173 1004 156 1005H155H152H149zM452 685L522 615L457 549L386 620zM276 613L285 580L288 569L302 516L213 492L195 556L187 589zM593 544L664 473L598 407L527 478zM328 420L353 329Q392 328 426 309Q480 277 496 217T481 103.5T390 34T276 49Q220 82 205 146Q204 149 204 152Q203 157 203 161Q202 164 202 167Q202 172 201 176V182Q202 187 202 191V197L204 207Q209 232 221 254Q234 275 253 292Q258 296 264 300L238 396zM735 402L805 332L740 266L669 337zM876 261L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q998 -120 957 -88Q951 -83 946 -78Q946 -77 945 -77Q940 -72 936 -67L934 -65Q930 -60 927 -55Q925 -53 924 -51Q921 -47 919 -43Q917 -40 915.5 -36.5T913 -30Q911 -25 909 -21Q900 4 900 30Q900 55 908 79Q911 86 914 92L810 195zM350 254Q341 254 332 251Q302 243 286 216T278.5 159T314 113.5T371 106T416.5 141T424 198T389 244Q371 254 350 254zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30T1103 83T1050 105z" /> <glyph glyph-name="polyline-dash-1" unicode="polyline-dash" horiz-adv-x="1200" d=" M150 1080H153H154V1080H158Q217 1077 258.5 1033.5T300 930Q300 920 298 909V907V906Q294 880 281 856L381 756L315 690L234 771L251 710L161 686L135 781Q125 782 115 784V784Q94 789 75 800Q54 812 38 830Q38 831 37 832Q35 834 33 837Q29 841 26 846Q25 848 24 849Q22 852 21 854Q18 858 17 862Q16 862 16 862.5V863Q16 864 15 864Q12 871 9 879V880Q8 881 8 882L6 888V889Q1 905 0 922V926V930V930V934V942Q1 943 1 945V946V949V950Q2 951 2 953V954V956L3 958V960V961Q4 963 4 964V965Q4 966 5 967V968Q5 970 6 971V972Q6 973 7 975Q12 991 20 1005Q43 1045 85 1065L86 1065.5L88 1066Q112 1078 139 1080H140H143H144H146.5H149H150zM149 1005H148H145H144H141Q139 1004 138 1004H137Q134 1004 130 1003Q129 1002 127 1001.5T124 1001L123 1000H122L121 999Q119 999 117 998Q105 992 95.5 981.5T80.5 958T75 930Q75 899 97 877T150 855H158Q159 855 161 856H162H163.5H166V857Q199 864 215 892Q231 919 223 949.5T188 995Q173 1004 156 1005H155H152H149zM452 685L522 615L457 549L386 620zM276 613L285 580L288 569L302 516L213 492L195 556L187 589zM593 544L664 473L598 407L527 478zM328 420L353 329Q392 328 426 309Q480 277 496 217T481 103.5T390 34T276 49Q220 82 205 146Q204 149 204 152Q203 157 203 161Q202 164 202 167Q202 172 201 176V182Q202 187 202 191V197L204 207Q209 232 221 254Q234 275 253 292Q258 296 264 300L238 396zM735 402L805 332L740 266L669 337zM876 261L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q998 -120 957 -88Q951 -83 946 -78Q946 -77 945 -77Q940 -72 936 -67L934 -65Q930 -60 927 -55Q925 -53 924 -51Q921 -47 919 -43Q917 -40 915.5 -36.5T913 -30Q911 -25 909 -21Q900 4 900 30Q900 55 908 79Q911 86 914 92L810 195zM350 254Q341 254 332 251Q302 243 286 216T278.5 159T314 113.5T371 106T416.5 141T424 198T389 244Q371 254 350 254zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30T1103 83T1050 105z" /> <glyph glyph-name="polyline-minus" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080H153H154V1080H158Q187 1078 213.5 1066T259 1034T289 987T300 930Q300 920 298 909V907V906Q294 880 281 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L234 771L285 580L288 569L353 329Q392 328 426 309Q480 277 496 217T481 103.5T390 34T276 49Q220 82 205 146Q204 149 204 152Q203 157 203 161Q202 164 202 167Q202 172 201 176V182Q202 187 202 191V197L204 207Q209 232 221 254Q234 275 253 292Q258 296 264 300L195 556L135 781Q124 782 114 785Q93 790 75 800Q54 812 38 830Q38 831 37 831.5T35 834Q34 835 33 837Q32 837 31 839Q23 850 16.5 862.5T6 889V889Q1 907 0 926V930V930V934V942Q1 943 1 945V949V950Q2 951 2 953V954V956V957L3 958V960V961Q4 963 4 964V965Q4 966 5 967V968Q5 970 6 971V972Q6 973 7 975Q12 991 20 1005Q43 1045 85 1065L86 1066H86.5H88Q112 1078 139 1080H140H143H144H146.5H149H150zM149 1005H148H145H144H141Q139 1004 138 1004H137Q134 1004 130 1003Q129 1002 127 1001.5T124 1001L123 1000H122L121 999Q119 999 117 998Q105 992 95.5 981.5T80.5 958T75 930Q75 899 97 877T150 855H158Q159 855 161 856H162H163.5H166V857Q199 864 215 892Q231 919 223 949.5T188 995Q173 1004 156 1005H155H152H149zM350 254Q341 254 332 251Q302 243 286 216T278.5 159T314 113.5T371 106T416.5 141T424 198T389 244Q371 254 350 254zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM1159 789H741Q725 789 712.5 801T700 830T712.5 859T741 871H1159Q1177 871 1188.5 859T1200 830T1188.5 801T1159 789z" /> <glyph glyph-name="polyline-minus-1" unicode="polyline-minus" horiz-adv-x="1200" d=" M150 1080H153H154V1080H158Q187 1078 213.5 1066T259 1034T289 987T300 930Q300 920 298 909V907V906Q294 880 281 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L234 771L285 580L288 569L353 329Q392 328 426 309Q480 277 496 217T481 103.5T390 34T276 49Q220 82 205 146Q204 149 204 152Q203 157 203 161Q202 164 202 167Q202 172 201 176V182Q202 187 202 191V197L204 207Q209 232 221 254Q234 275 253 292Q258 296 264 300L195 556L135 781Q124 782 114 785Q93 790 75 800Q54 812 38 830Q38 831 37 831.5T35 834Q34 835 33 837Q32 837 31 839Q23 850 16.5 862.5T6 889V889Q1 907 0 926V930V930V934V942Q1 943 1 945V949V950Q2 951 2 953V954V956V957L3 958V960V961Q4 963 4 964V965Q4 966 5 967V968Q5 970 6 971V972Q6 973 7 975Q12 991 20 1005Q43 1045 85 1065L86 1066H86.5H88Q112 1078 139 1080H140H143H144H146.5H149H150zM149 1005H148H145H144H141Q139 1004 138 1004H137Q134 1004 130 1003Q129 1002 127 1001.5T124 1001L123 1000H122L121 999Q119 999 117 998Q105 992 95.5 981.5T80.5 958T75 930Q75 899 97 877T150 855H158Q159 855 161 856H162H163.5H166V857Q199 864 215 892Q231 919 223 949.5T188 995Q173 1004 156 1005H155H152H149zM350 254Q341 254 332 251Q302 243 286 216T278.5 159T314 113.5T371 106T416.5 141T424 198T389 244Q371 254 350 254zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM1159 789H741Q725 789 712.5 801T700 830T712.5 859T741 871H1159Q1177 871 1188.5 859T1200 830T1188.5 801T1159 789z" /> <glyph glyph-name="polyline-plus" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080H153H154V1080H158Q187 1078 213.5 1066T259 1034T289 987T300 930Q300 920 298 909V907V906Q294 880 281 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L234 771L285 580L288 569L353 329Q392 328 426 309Q480 277 496 217T481 103.5T390 34T276 49Q220 82 205 146Q204 149 204 152Q203 157 203 161Q202 164 202 167Q202 172 201 176V182Q202 187 202 191V197L204 207Q209 232 221 254Q234 275 253 292Q258 296 264 300L195 556L135 781Q124 782 114 785Q93 790 75 800Q54 812 38 830Q38 831 37 831.5T35 834Q34 835 33 837Q32 837 31 839Q23 850 16.5 862.5T6 889V889Q1 907 0 926V930V930V934V942Q1 943 1 945V949V950Q2 951 2 953V954V956V957L3 958V960V961Q4 963 4 964V965Q4 966 5 967V968Q5 970 6 971V972Q6 973 7 975Q12 991 20 1005Q43 1045 85 1065L86 1066H86.5H88Q112 1078 139 1080H140H143H144H146.5H149H150zM149 1005H148H145H144H141Q139 1004 138 1004H137Q134 1004 130 1003Q129 1002 127 1001.5T124 1001L123 1000H122L121 999Q119 999 117 998Q105 992 95.5 981.5T80.5 958T75 930Q75 899 97 877T150 855H158Q159 855 161 856H162H163.5H166V857Q199 864 215 892Q231 919 223 949.5T188 995Q173 1004 156 1005H155H152H149zM350 254Q341 254 332 251Q302 243 286 216T278.5 159T314 113.5T371 106T416.5 141T424 198T389 244Q371 254 350 254zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM741 789Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080T979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741z" /> <glyph glyph-name="polyline-plus-1" unicode="polyline-plus" horiz-adv-x="1200" d=" M150 1080H153H154V1080H158Q187 1078 213.5 1066T259 1034T289 987T300 930Q300 920 298 909V907V906Q294 880 281 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L234 771L285 580L288 569L353 329Q392 328 426 309Q480 277 496 217T481 103.5T390 34T276 49Q220 82 205 146Q204 149 204 152Q203 157 203 161Q202 164 202 167Q202 172 201 176V182Q202 187 202 191V197L204 207Q209 232 221 254Q234 275 253 292Q258 296 264 300L195 556L135 781Q124 782 114 785Q93 790 75 800Q54 812 38 830Q38 831 37 831.5T35 834Q34 835 33 837Q32 837 31 839Q23 850 16.5 862.5T6 889V889Q1 907 0 926V930V930V934V942Q1 943 1 945V949V950Q2 951 2 953V954V956V957L3 958V960V961Q4 963 4 964V965Q4 966 5 967V968Q5 970 6 971V972Q6 973 7 975Q12 991 20 1005Q43 1045 85 1065L86 1066H86.5H88Q112 1078 139 1080H140H143H144H146.5H149H150zM149 1005H148H145H144H141Q139 1004 138 1004H137Q134 1004 130 1003Q129 1002 127 1001.5T124 1001L123 1000H122L121 999Q119 999 117 998Q105 992 95.5 981.5T80.5 958T75 930Q75 899 97 877T150 855H158Q159 855 161 856H162H163.5H166V857Q199 864 215 892Q231 919 223 949.5T188 995Q173 1004 156 1005H155H152H149zM350 254Q341 254 332 251Q302 243 286 216T278.5 159T314 113.5T371 106T416.5 141T424 198T389 244Q371 254 350 254zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM741 789Q724 789 712 801T700 830.5T712 859T741 870H908V1040Q908 1056 920.5 1068T950 1080T979 1068T991 1040V870H1160Q1176 870 1188 859T1200 830.5T1188 801T1160 789H991V620Q991 603 979 591.5T950 580T920.5 591.5T908 620V789H741z" /> <glyph glyph-name="polyline-remove" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080H153H154V1080H158Q187 1078 213.5 1066T259 1034T289 987T300 930Q300 920 298 909V907V906Q294 880 281 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L234 771L285 580L288 569L353 329Q392 328 426 309Q480 277 496 217T481 103.5T390 34T276 49Q220 82 205 146Q204 149 204 152Q203 157 203 161Q202 164 202 167Q202 172 201 176V182Q202 187 202 191V197L204 207Q209 232 221 254Q234 275 253 292Q258 296 264 300L195 556L135 781Q124 782 114 785Q93 790 75 800Q54 812 38 830Q38 831 37 831.5T35 834Q34 835 33 837Q32 837 31 839Q23 850 16.5 862.5T6 889V889Q1 907 0 926V930V930V934V942Q1 943 1 945V949V950Q2 951 2 953V954V956V957L3 958V960V961Q4 963 4 964V965Q4 966 5 967V968Q5 970 6 971V972Q6 973 7 975Q12 991 20 1005Q43 1045 85 1065L86 1066H86.5H88Q112 1078 139 1080H140H143H144H146.5H149H150zM149 1005H148H145H144H141Q139 1004 138 1004H137Q134 1004 130 1003Q129 1002 127 1001.5T124 1001L123 1000H122L121 999Q119 999 117 998Q105 992 95.5 981.5T80.5 958T75 930Q75 899 97 877T150 855H158Q159 855 161 856H162H163.5H166V857Q199 864 215 892Q231 919 223 949.5T188 995Q173 1004 156 1005H155H152H149zM350 254Q341 254 332 251Q302 243 286 216T278.5 159T314 113.5T371 106T416.5 141T424 198T389 244Q371 254 350 254zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM773 949Q761 961 761.5 978T774 1007T802.5 1019T831 1007L949 888L1069 1008Q1081 1020 1098 1019.5T1127 1007T1139 978T1127 949L1008 830L1127 710Q1138 699 1138.5 682.5T1127 653.5T1098 641.5T1070 653L950 772L831 653Q819 640 802 640.5T773 653.5T760.5 682.5T772 712L892 831z" /> <glyph glyph-name="polyline-remove-1" unicode="polyline-remove" horiz-adv-x="1200" d=" M150 1080H153H154V1080H158Q187 1078 213.5 1066T259 1034T289 987T300 930Q300 920 298 909V907V906Q294 880 281 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L234 771L285 580L288 569L353 329Q392 328 426 309Q480 277 496 217T481 103.5T390 34T276 49Q220 82 205 146Q204 149 204 152Q203 157 203 161Q202 164 202 167Q202 172 201 176V182Q202 187 202 191V197L204 207Q209 232 221 254Q234 275 253 292Q258 296 264 300L195 556L135 781Q124 782 114 785Q93 790 75 800Q54 812 38 830Q38 831 37 831.5T35 834Q34 835 33 837Q32 837 31 839Q23 850 16.5 862.5T6 889V889Q1 907 0 926V930V930V934V942Q1 943 1 945V949V950Q2 951 2 953V954V956V957L3 958V960V961Q4 963 4 964V965Q4 966 5 967V968Q5 970 6 971V972Q6 973 7 975Q12 991 20 1005Q43 1045 85 1065L86 1066H86.5H88Q112 1078 139 1080H140H143H144H146.5H149H150zM149 1005H148H145H144H141Q139 1004 138 1004H137Q134 1004 130 1003Q129 1002 127 1001.5T124 1001L123 1000H122L121 999Q119 999 117 998Q105 992 95.5 981.5T80.5 958T75 930Q75 899 97 877T150 855H158Q159 855 161 856H162H163.5H166V857Q199 864 215 892Q231 919 223 949.5T188 995Q173 1004 156 1005H155H152H149zM350 254Q341 254 332 251Q302 243 286 216T278.5 159T314 113.5T371 106T416.5 141T424 198T389 244Q371 254 350 254zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM773 949Q761 961 761.5 978T774 1007T802.5 1019T831 1007L949 888L1069 1008Q1081 1020 1098 1019.5T1127 1007T1139 978T1127 949L1008 830L1127 710Q1138 699 1138.5 682.5T1127 653.5T1098 641.5T1070 653L950 772L831 653Q819 640 802 640.5T773 653.5T760.5 682.5T772 712L892 831z" /> <glyph glyph-name="polyline-trash" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080H153H154V1080H158Q187 1078 213.5 1066T259 1034T289 987T300 930Q300 920 298 909V907V906Q294 880 281 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L234 771L285 580L288 569L353 329Q392 328 426 309Q480 277 496 217T481 103.5T390 34T276 49Q220 82 205 146Q204 149 204 152Q203 157 203 161Q202 164 202 167Q202 172 201 176V182Q202 187 202 191V197L204 207Q209 232 221 254Q234 275 253 292Q258 296 264 300L195 556L135 781Q124 782 114 785Q93 790 75 800Q54 812 38 830Q38 831 37 831.5T35 834Q34 835 33 837Q32 837 31 839Q23 850 16.5 862.5T6 889V889Q1 907 0 926V930V930V934V942Q1 943 1 945V949V950Q2 951 2 953V954V956V957L3 958V960V961Q4 963 4 964V965Q4 966 5 967V968Q5 970 6 971V972Q6 973 7 975Q12 991 20 1005Q43 1045 85 1065L86 1066H86.5H88Q112 1078 139 1080H140H143H144H146.5H149H150zM149 1005H148H145H144H141Q139 1004 138 1004H137Q134 1004 130 1003Q129 1002 127 1001.5T124 1001L123 1000H122L121 999Q119 999 117 998Q105 992 95.5 981.5T80.5 958T75 930Q75 899 97 877T150 855H158Q159 855 161 856H162H163.5H166V857Q199 864 215 892Q231 919 223 949.5T188 995Q173 1004 156 1005H155H152H149zM350 254Q341 254 332 251Q302 243 286 216T278.5 159T314 113.5T371 106T416.5 141T424 198T389 244Q371 254 350 254zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM1176 994Q1200 994 1200 969.5T1176 945H723Q700 945 700 969.5T723 994H790V1019Q790 1044 804.5 1062T838 1080H1061Q1082 1080 1096 1062T1110 1019V994H1176zM814 994H1086V1019Q1086 1055 1061 1055H838Q814 1055 814 1019V994zM1164 882L1102 418H796L735 882H1164zM863 452Q881 456 881 475L843 831Q838 853 820 850Q802 850 802 829L841 470Q841 452 860 452H863zM970 831Q970 850 949.5 850T929 831V472Q929 452 949.5 452T970 472V831zM1097 829Q1097 850 1080 850Q1061 853 1058 831L1019 475Q1019 456 1037 452H1038Q1059 452 1059 470z" /> <glyph glyph-name="polyline-trash-1" unicode="polyline-trash" horiz-adv-x="1200" d=" M150 1080H153H154V1080H158Q187 1078 213.5 1066T259 1034T289 987T300 930Q300 920 298 909V907V906Q294 880 281 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L234 771L285 580L288 569L353 329Q392 328 426 309Q480 277 496 217T481 103.5T390 34T276 49Q220 82 205 146Q204 149 204 152Q203 157 203 161Q202 164 202 167Q202 172 201 176V182Q202 187 202 191V197L204 207Q209 232 221 254Q234 275 253 292Q258 296 264 300L195 556L135 781Q124 782 114 785Q93 790 75 800Q54 812 38 830Q38 831 37 831.5T35 834Q34 835 33 837Q32 837 31 839Q23 850 16.5 862.5T6 889V889Q1 907 0 926V930V930V934V942Q1 943 1 945V949V950Q2 951 2 953V954V956V957L3 958V960V961Q4 963 4 964V965Q4 966 5 967V968Q5 970 6 971V972Q6 973 7 975Q12 991 20 1005Q43 1045 85 1065L86 1066H86.5H88Q112 1078 139 1080H140H143H144H146.5H149H150zM149 1005H148H145H144H141Q139 1004 138 1004H137Q134 1004 130 1003Q129 1002 127 1001.5T124 1001L123 1000H122L121 999Q119 999 117 998Q105 992 95.5 981.5T80.5 958T75 930Q75 899 97 877T150 855H158Q159 855 161 856H162H163.5H166V857Q199 864 215 892Q231 919 223 949.5T188 995Q173 1004 156 1005H155H152H149zM350 254Q341 254 332 251Q302 243 286 216T278.5 159T314 113.5T371 106T416.5 141T424 198T389 244Q371 254 350 254zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105zM1176 994Q1200 994 1200 969.5T1176 945H723Q700 945 700 969.5T723 994H790V1019Q790 1044 804.5 1062T838 1080H1061Q1082 1080 1096 1062T1110 1019V994H1176zM814 994H1086V1019Q1086 1055 1061 1055H838Q814 1055 814 1019V994zM1164 882L1102 418H796L735 882H1164zM863 452Q881 456 881 475L843 831Q838 853 820 850Q802 850 802 829L841 470Q841 452 860 452H863zM970 831Q970 850 949.5 850T929 831V472Q929 452 949.5 452T970 472V831zM1097 829Q1097 850 1080 850Q1061 853 1058 831L1019 475Q1019 456 1037 452H1038Q1059 452 1059 470z" /> <glyph glyph-name="polyline" - unicode="" + unicode="" horiz-adv-x="1200" d=" M150 1080H153H154V1080H158Q187 1078 213.5 1066T259 1034T289 987T300 930Q300 920 298 909V907V906Q294 880 281 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L234 771L285 580L288 569L353 329Q392 328 426 309Q480 277 496 217T481 103.5T390 34T276 49Q220 82 205 146Q204 149 204 152Q203 157 203 161Q202 164 202 167Q202 172 201 176V182Q202 187 202 191V197L204 207Q209 232 221 254Q234 275 253 292Q258 296 264 300L195 556L135 781Q124 782 114 785Q93 790 75 800Q54 812 38 830Q38 831 37 831.5T35 834Q34 835 33 837Q32 837 31 839Q23 850 16.5 862.5T6 889V889Q1 907 0 926V930V930V934V942Q1 943 1 945V949V950Q2 951 2 953V954V956V957L3 958V960V961Q4 963 4 964V965Q4 966 5 967V968Q5 970 6 971V972Q6 973 7 975Q12 991 20 1005Q43 1045 85 1065L86 1066H86.5H88Q112 1078 139 1080H140H143H144H146.5H149H150zM149 1005H148H145H144H141Q139 1004 138 1004H137Q134 1004 130 1003Q129 1002 127 1001.5T124 1001L123 1000H122L121 999Q119 999 117 998Q105 992 95.5 981.5T80.5 958T75 930Q75 899 97 877T150 855H158Q159 855 161 856H162H163.5H166V857Q199 864 215 892Q231 919 223 949.5T188 995Q173 1004 156 1005H155H152H149zM350 254Q341 254 332 251Q302 243 286 216T278.5 159T314 113.5T371 106T416.5 141T424 198T389 244Q371 254 350 254zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105z" /> <glyph glyph-name="polyline-1" unicode="polyline" horiz-adv-x="1200" d=" M150 1080H153H154V1080H158Q187 1078 213.5 1066T259 1034T289 987T300 930Q300 920 298 909V907V906Q294 880 281 856L976 161Q1011 180 1050 180Q1112 180 1156 136T1200 30T1156 -76T1050 -120Q984 -120 940 -72Q938 -69 935 -66Q933 -63 930 -60Q928 -57 926 -55L922 -47Q920 -45 919 -42Q916 -38 914 -34Q913 -31 912 -29Q910 -24 909 -19Q900 5 900 30T908 79Q911 85 914 92L234 771L285 580L288 569L353 329Q392 328 426 309Q480 277 496 217T481 103.5T390 34T276 49Q220 82 205 146Q204 149 204 152Q203 157 203 161Q202 164 202 167Q202 172 201 176V182Q202 187 202 191V197L204 207Q209 232 221 254Q234 275 253 292Q258 296 264 300L195 556L135 781Q124 782 114 785Q93 790 75 800Q54 812 38 830Q38 831 37 831.5T35 834Q34 835 33 837Q32 837 31 839Q23 850 16.5 862.5T6 889V889Q1 907 0 926V930V930V934V942Q1 943 1 945V949V950Q2 951 2 953V954V956V957L3 958V960V961Q4 963 4 964V965Q4 966 5 967V968Q5 970 6 971V972Q6 973 7 975Q12 991 20 1005Q43 1045 85 1065L86 1066H86.5H88Q112 1078 139 1080H140H143H144H146.5H149H150zM149 1005H148H145H144H141Q139 1004 138 1004H137Q134 1004 130 1003Q129 1002 127 1001.5T124 1001L123 1000H122L121 999Q119 999 117 998Q105 992 95.5 981.5T80.5 958T75 930Q75 899 97 877T150 855H158Q159 855 161 856H162H163.5H166V857Q199 864 215 892Q231 919 223 949.5T188 995Q173 1004 156 1005H155H152H149zM350 254Q341 254 332 251Q302 243 286 216T278.5 159T314 113.5T371 106T416.5 141T424 198T389 244Q371 254 350 254zM1050 105Q1019 105 997 83T975 30T997 -23T1050 -45T1103 -23T1125 30Q1125 45 1119 59T1103 83T1079 99T1050 105z" /> <glyph glyph-name="preview" - unicode="" + unicode="" horiz-adv-x="1200" d=" M189.77539 1080C145.29629 1080 104.38994 1063.6667 67.056641 1031C24.390041 993.6667 2.3900406 949 1.0566406 897L1.0566406 541.5L1.0566406 186C-4.2766594 136 10.556641 90.1667 45.556641 48.5C80.556641 6.8333 123.05667 -16 173.05664 -20L280.54883 -20.4355C249.26281 7.0814 211.95977 41.6024 187.93359 73C161.93359 69 158.72334 75.5 136.05664 92.5C113.39007 109.5 100.72334 131 98.056641 157L98.056641 512L98.056641 867C94.056641 894.3334 100.22334 920.1667 116.55664 944.5C132.89001 968.8334 154.72334 982.3334 182.05664 985L390.55664 985L599.05664 985L599.05664 843C596.39004 819.6667 599.39004 798 608.05664 778C616.72334 758 631.05664 744.3334199999999 651.05664 737C663.05664 733.6667 676.22334 731.6667 690.55664 731C704.89004 730.3334 720.89004 730.3334 738.55664 731C756.22324 731.6667 769.72334 731.6667 779.05664 731C785.05664 730.3334 791.05664 730.3334 797.05664 731C803.05664 731.6667 809.05664 731.8334 815.05664 731.5C821.05664 731.1667 825.39004 729.6667 828.05664 727L828.05664 592.79297C861.09154 582.36185 893.22883 568.91647 924.05664 553.21484L924.05664 761L662.05664 1079L209.05664 1079C202.55664 1079.6666 196.12959 1080 189.77539 1080zM681.06641 538.87695C594.82979 538.87695 508.84556 511.13987 423.11328 455.66602C337.38086 400.19218 272.5759300000001 346.23126 228.70117 293.7832L161.37695 209.05859C168.94155 200.4853000000001 178.52396 189.0133 190.12305 174.6406C201.72214 160.2678000000001 226.05457 134.0440000000001 263.12109 95.9688000000001C300.1877600000001 57.8934999999999 337.7589 24.1035999999999 375.83398 -5.3984C413.90934 -34.9004 460.93601 -61.3738000000001 516.91406 -84.8242C572.89226 -108.2743 627.60981 -120 681.06641 -120C766.7987 -120 852.65624 -92.3896999999999 938.64062 -37.1679999999999C1024.6253 18.0536999999999 1089.555 71.8879999999999 1133.4297 124.3359000000001L1200 209.05859C1192.9397 217.63175 1183.6108 229.10776 1172.0117 243.48047C1160.4128 257.8533 1136.0784 284.07711 1099.0117 322.15234C1061.9452 360.22755 1024.2473 394.01371 985.91992 423.51562C947.5924 453.01769 900.81947 479.61976 845.59766 503.32227C790.37599 527.02465 735.53158 538.87695 681.06641 538.87695zM681.44531 414.0605500000001C737.67567 414.0605500000001 785.71049 394.01433 825.55078 353.92188C865.3912 313.8294200000001 885.31055 265.54099 885.31055 209.05859C885.31055 152.5761 865.3912 104.4165 825.55078 64.5762C785.71049 24.7358999999999 737.67567 4.8163999999999 681.44531 4.8163999999999C625.21507 4.8163999999999 576.92666 24.7358999999999 536.58203 64.5762C496.23754 104.4165 476.06641 152.5761 476.06641 209.05859C476.06641 265.54099 496.23754 313.8294200000001 536.58203 353.92188C576.92666 394.01433 625.21507 414.0605500000001 681.44531 414.0605500000001zM681.06641 345.22461C643.74757 345.22461 611.72426 331.85917 584.99609 305.13086C558.26779 278.40256 544.90234 246.37729 544.90234 209.05859C544.90234 171.7398000000001 558.26779 139.8433 584.99609 113.3671999999999C611.72426 86.8911000000001 643.74757 73.6542999999999 681.06641 73.6542999999999C718.38511 73.6542999999999 750.28167 86.8911000000001 776.75781 113.3671999999999C803.23408 139.8433 816.47461 171.7398000000001 816.47461 209.05859C816.47461 229.73518 812.94322 246.88172 805.88281 260.4980500000001C797.30965 226.2051300000001 774.36362 209.05859 737.04492 209.05859C718.38556 209.05859 702.24718 215.99478 688.63086 229.8632800000001C675.01454 243.73177 668.20703 260.75158 668.20703 280.92383C668.20703 306.6435800000001 679.55225 328.0781500000001 702.24609 345.22461L681.06641 345.22461z" /> <glyph glyph-name="preview-1" unicode="preview" horiz-adv-x="1200" d=" M189.77539 1080C145.29629 1080 104.38994 1063.6667 67.056641 1031C24.390041 993.6667 2.3900406 949 1.0566406 897L1.0566406 541.5L1.0566406 186C-4.2766594 136 10.556641 90.1667 45.556641 48.5C80.556641 6.8333 123.05667 -16 173.05664 -20L280.54883 -20.4355C249.26281 7.0814 211.95977 41.6024 187.93359 73C161.93359 69 158.72334 75.5 136.05664 92.5C113.39007 109.5 100.72334 131 98.056641 157L98.056641 512L98.056641 867C94.056641 894.3334 100.22334 920.1667 116.55664 944.5C132.89001 968.8334 154.72334 982.3334 182.05664 985L390.55664 985L599.05664 985L599.05664 843C596.39004 819.6667 599.39004 798 608.05664 778C616.72334 758 631.05664 744.3334199999999 651.05664 737C663.05664 733.6667 676.22334 731.6667 690.55664 731C704.89004 730.3334 720.89004 730.3334 738.55664 731C756.22324 731.6667 769.72334 731.6667 779.05664 731C785.05664 730.3334 791.05664 730.3334 797.05664 731C803.05664 731.6667 809.05664 731.8334 815.05664 731.5C821.05664 731.1667 825.39004 729.6667 828.05664 727L828.05664 592.79297C861.09154 582.36185 893.22883 568.91647 924.05664 553.21484L924.05664 761L662.05664 1079L209.05664 1079C202.55664 1079.6666 196.12959 1080 189.77539 1080zM681.06641 538.87695C594.82979 538.87695 508.84556 511.13987 423.11328 455.66602C337.38086 400.19218 272.5759300000001 346.23126 228.70117 293.7832L161.37695 209.05859C168.94155 200.4853000000001 178.52396 189.0133 190.12305 174.6406C201.72214 160.2678000000001 226.05457 134.0440000000001 263.12109 95.9688000000001C300.1877600000001 57.8934999999999 337.7589 24.1035999999999 375.83398 -5.3984C413.90934 -34.9004 460.93601 -61.3738000000001 516.91406 -84.8242C572.89226 -108.2743 627.60981 -120 681.06641 -120C766.7987 -120 852.65624 -92.3896999999999 938.64062 -37.1679999999999C1024.6253 18.0536999999999 1089.555 71.8879999999999 1133.4297 124.3359000000001L1200 209.05859C1192.9397 217.63175 1183.6108 229.10776 1172.0117 243.48047C1160.4128 257.8533 1136.0784 284.07711 1099.0117 322.15234C1061.9452 360.22755 1024.2473 394.01371 985.91992 423.51562C947.5924 453.01769 900.81947 479.61976 845.59766 503.32227C790.37599 527.02465 735.53158 538.87695 681.06641 538.87695zM681.44531 414.0605500000001C737.67567 414.0605500000001 785.71049 394.01433 825.55078 353.92188C865.3912 313.8294200000001 885.31055 265.54099 885.31055 209.05859C885.31055 152.5761 865.3912 104.4165 825.55078 64.5762C785.71049 24.7358999999999 737.67567 4.8163999999999 681.44531 4.8163999999999C625.21507 4.8163999999999 576.92666 24.7358999999999 536.58203 64.5762C496.23754 104.4165 476.06641 152.5761 476.06641 209.05859C476.06641 265.54099 496.23754 313.8294200000001 536.58203 353.92188C576.92666 394.01433 625.21507 414.0605500000001 681.44531 414.0605500000001zM681.06641 345.22461C643.74757 345.22461 611.72426 331.85917 584.99609 305.13086C558.26779 278.40256 544.90234 246.37729 544.90234 209.05859C544.90234 171.7398000000001 558.26779 139.8433 584.99609 113.3671999999999C611.72426 86.8911000000001 643.74757 73.6542999999999 681.06641 73.6542999999999C718.38511 73.6542999999999 750.28167 86.8911000000001 776.75781 113.3671999999999C803.23408 139.8433 816.47461 171.7398000000001 816.47461 209.05859C816.47461 229.73518 812.94322 246.88172 805.88281 260.4980500000001C797.30965 226.2051300000001 774.36362 209.05859 737.04492 209.05859C718.38556 209.05859 702.24718 215.99478 688.63086 229.8632800000001C675.01454 243.73177 668.20703 260.75158 668.20703 280.92383C668.20703 306.6435800000001 679.55225 328.0781500000001 702.24609 345.22461L681.06641 345.22461z" /> <glyph glyph-name="print" - unicode="" + unicode="" horiz-adv-x="1200" d=" M377 231H750V157H377V231zM377 379H823V307H377V379zM1119 824H77Q49 824 27.5 804.5T6 752V307Q6 274 26 252.5T77 231H228V-66H972V231H1119Q1155 231 1174 252.5T1193 307V752Q1193 785 1171.5 804.5T1119 824zM899 7H300V453H899V7zM1114 619H989V743H1114V619zM980 878H899V1049H300V878H224V1130H980V878z" /> <glyph glyph-name="print-1" unicode="print" horiz-adv-x="1200" d=" M377 231H750V157H377V231zM377 379H823V307H377V379zM1119 824H77Q49 824 27.5 804.5T6 752V307Q6 274 26 252.5T77 231H228V-66H972V231H1119Q1155 231 1174 252.5T1193 307V752Q1193 785 1171.5 804.5T1119 824zM899 7H300V453H899V7zM1114 619H989V743H1114V619zM980 878H899V1049H300V878H224V1130H980V878z" /> <glyph glyph-name="pushpin" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1158 695Q1184 660 1158 630Q1145 620 1129 620Q1109 620 1093 630L1031 700L767 437L847 156L217 784L498 705L760 968L697 1032Q664 1066 697 1093Q728 1130 757 1093zM382 482L546 319L16 -46z" /> <glyph glyph-name="pushpin-1" unicode="pushpin" horiz-adv-x="1200" d=" M1158 695Q1184 660 1158 630Q1145 620 1129 620Q1109 620 1093 630L1031 700L767 437L847 156L217 784L498 705L760 968L697 1032Q664 1066 697 1093Q728 1130 757 1093zM382 482L546 319L16 -46z" /> <glyph glyph-name="qrcode" - unicode="" + unicode="" horiz-adv-x="1200" d=" M565 563H0V1124H565V563zM78 642H486V1047H78V642zM163 963H403V722H163V963zM163 320H403V77H163V320zM806 963H1047V722H806V963zM565 -69H0V496H565V-69zM78 12H486V411H78V12zM1207 563H643V1124H1207V563zM723 642H1127V1047H723V642zM647 491H786V212H647V491zM647 75H786V-64H647V75zM786 212H926V75H786V212zM786 352H926V212H786V352zM1061 352H1202V212H1061V352zM1061 75H1202V-64H1061V75zM647 491H786V352H647V491zM926 491H1061V352H926V491z" /> <glyph glyph-name="qrcode-1" unicode="qrcode" horiz-adv-x="1200" d=" M565 563H0V1124H565V563zM78 642H486V1047H78V642zM163 963H403V722H163V963zM163 320H403V77H163V320zM806 963H1047V722H806V963zM565 -69H0V496H565V-69zM78 12H486V411H78V12zM1207 563H643V1124H1207V563zM723 642H1127V1047H723V642zM647 491H786V212H647V491zM647 75H786V-64H647V75zM786 212H926V75H786V212zM786 352H926V212H786V352zM1061 352H1202V212H1061V352zM1061 75H1202V-64H1061V75zM647 491H786V352H647V491zM926 491H1061V352H926V491z" /> <glyph glyph-name="question-sign" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1005 898Q1174 729 1174 493T1004.5 88T599.5 -81T194.5 88T25 493T194.5 898.5T599.5 1068T1005 898zM332 687Q332 661 353 642Q373 620 404 620Q457 620 475 677Q494 741 524 770Q551 799 613 799Q665 799 696 770Q728 741 728 697Q728 671 720 653Q711 631 691 620Q665 595 640 572T580 513Q553 481 541 455Q527 414 527 372Q527 333 543 317Q566 298 593 298Q646 298 661 356Q665 386 669 394Q669 398 676 414Q679 422 695 437Q701 448 723 468Q791 533 816 554Q847 586 863 615Q881 652 881 697Q881 754 847 805Q816 853 754 887Q691 917 613 917Q532 917 462 882Q397 845 366 791Q332 742 332 687zM601 84Q635 84 657 107Q681 132 681 165.5T656.5 224.5T601 250Q566 250 541 225Q517 203 517 166Q517 132 541 107Q563 84 601 84z" /> <glyph glyph-name="question-sign-1" unicode="question-sign" horiz-adv-x="1200" d=" M1005 898Q1174 729 1174 493T1004.5 88T599.5 -81T194.5 88T25 493T194.5 898.5T599.5 1068T1005 898zM332 687Q332 661 353 642Q373 620 404 620Q457 620 475 677Q494 741 524 770Q551 799 613 799Q665 799 696 770Q728 741 728 697Q728 671 720 653Q711 631 691 620Q665 595 640 572T580 513Q553 481 541 455Q527 414 527 372Q527 333 543 317Q566 298 593 298Q646 298 661 356Q665 386 669 394Q669 398 676 414Q679 422 695 437Q701 448 723 468Q791 533 816 554Q847 586 863 615Q881 652 881 697Q881 754 847 805Q816 853 754 887Q691 917 613 917Q532 917 462 882Q397 845 366 791Q332 742 332 687zM601 84Q635 84 657 107Q681 132 681 165.5T656.5 224.5T601 250Q566 250 541 225Q517 203 517 166Q517 132 541 107Q563 84 601 84z" /> <glyph glyph-name="random" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1070 408Q1089 408 1101 390L1333 187L1101 -19Q1070 -52 1036 -17Q1004 17 1036 57L1117 130H894L701 313L777 398L940 244H1122L1036 322Q1004 353 1036 390Q1053 408 1070 408zM940 676L365 130H0V244H319L894 790H1117L1036 865Q1004 904 1036 937Q1049 953 1069 953T1101 942L1333 734L1101 532Q1070 490 1036 532Q1004 568 1036 601L1122 676H940zM319 676H0V790H365L555 609L475 526z" /> <glyph glyph-name="random-1" unicode="random" horiz-adv-x="1200" d=" M1070 408Q1089 408 1101 390L1333 187L1101 -19Q1070 -52 1036 -17Q1004 17 1036 57L1117 130H894L701 313L777 398L940 244H1122L1036 322Q1004 353 1036 390Q1053 408 1070 408zM940 676L365 130H0V244H319L894 790H1117L1036 865Q1004 904 1036 937Q1049 953 1069 953T1101 942L1333 734L1101 532Q1070 490 1036 532Q1004 568 1036 601L1122 676H940zM319 676H0V790H365L555 609L475 526z" /> <glyph glyph-name="range-end" - unicode="" + unicode="" horiz-adv-x="1200" d=" M672 -120H800V1080H672H800V-120H672zM672 1080H400V1080L672 808V152L400 -120V-120H672H401L672 152V808L401 1080H672zM672 1080H800V-120H672H400L672 152V808L400 1080H672z" /> <glyph glyph-name="range-end-1" unicode="range-end" horiz-adv-x="1200" d=" M672 -120H800V1080H672H800V-120H672zM672 1080H400V1080L672 808V152L400 -120V-120H672H401L672 152V808L401 1080H672zM672 1080H800V-120H672H400L672 152V808L400 1080H672z" /> <glyph glyph-name="range-start" - unicode="" + unicode="" horiz-adv-x="1200" d=" M528 -120H800V-120L528 152V808L800 1080V1080H528H799L528 808V152L799 -120H528zM528 1080H400V-120H528H400V1080H528zM400 1080H528H800L528 808V152L800 -120H528H400V1080z" /> <glyph glyph-name="range-start-1" unicode="range-start" horiz-adv-x="1200" d=" M528 -120H800V-120L528 152V808L800 1080V1080H528H799L528 808V152L799 -120H528zM528 1080H400V-120H528H400V1080H528zM400 1080H528H800L528 808V152L800 -120H528H400V1080z" /> <glyph glyph-name="record" - unicode="" + unicode="" horiz-adv-x="1200" d=" M268 827Q129 689 129 495T269 164T601.5 27T932 164T1070 495T932 827T601.5 965T268 827zM1006 902Q1181 734 1181 495.5T1009.5 86T599.5 -85T190 86T19 495.5T190 905.5T599.5 1077T1006 902zM739 634Q797 576 797 495T738.5 356.5T599.5 299T461.5 356.5T404 495T461.5 634.5T599.5 693T739 634z" /> <glyph glyph-name="record-1" unicode="record" horiz-adv-x="1200" d=" M268 827Q129 689 129 495T269 164T601.5 27T932 164T1070 495T932 827T601.5 965T268 827zM1006 902Q1181 734 1181 495.5T1009.5 86T599.5 -85T190 86T19 495.5T190 905.5T599.5 1077T1006 902zM739 634Q797 576 797 495T738.5 356.5T599.5 299T461.5 356.5T404 495T461.5 634.5T599.5 693T739 634z" /> <glyph glyph-name="redo" - unicode="" + unicode="" horiz-adv-x="1200" d=" M440 1080L1018 982L644 530L662 728Q545 690 471.5 590.5T398 367Q398 273 439.5 178T557 14.5T723 -67V-120Q615 -120 515.5 -79T340 38Q290 89 254 150.5T200 281T182 421Q182 529 223 628.5T340 804Q445 909 589 945z" /> <glyph glyph-name="redo-1" unicode="redo" horiz-adv-x="1200" d=" M440 1080L1018 982L644 530L662 728Q545 690 471.5 590.5T398 367Q398 273 439.5 178T557 14.5T723 -67V-120Q615 -120 515.5 -79T340 38Q290 89 254 150.5T200 281T182 421Q182 529 223 628.5T340 804Q445 909 589 945z" /> <glyph glyph-name="refresh" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1171 1004Q1181 993 1181 968L1140 633L812 707Q788 709 775 729T770 769Q781 822 837 811L956 783Q814 954 599 954Q409 954 274 818.5T139 494H25Q25 733 193 900T599 1067Q884 1067 1056 841L1074 977Q1080 1035 1133 1028Q1150 1028 1171 1004zM1176 494Q1176 256 1006.5 88T599 -80Q318 -80 146 139L134 4Q126 -51 69 -42Q49 -42 37 -21Q18 -5 25 15L65 352L394 279Q446 263 434 215Q430 192 410 178.5T369 173L248 202Q386 34 599 34Q793 34 927 169.5T1061 494H1176z" /> <glyph glyph-name="refresh-1" unicode="refresh" horiz-adv-x="1200" d=" M1171 1004Q1181 993 1181 968L1140 633L812 707Q788 709 775 729T770 769Q781 822 837 811L956 783Q814 954 599 954Q409 954 274 818.5T139 494H25Q25 733 193 900T599 1067Q884 1067 1056 841L1074 977Q1080 1035 1133 1028Q1150 1028 1171 1004zM1176 494Q1176 256 1006.5 88T599 -80Q318 -80 146 139L134 4Q126 -51 69 -42Q49 -42 37 -21Q18 -5 25 15L65 352L394 279Q446 263 434 215Q430 192 410 178.5T369 173L248 202Q386 34 599 34Q793 34 927 169.5T1061 494H1176z" /> <glyph glyph-name="remove-circle" - unicode="" + unicode="" horiz-adv-x="1200" d=" M259 823Q116 679 116 479.5T260 137.5T602.5 -5T943.5 137.5T1086 479.5T943.5 822T602.5 965T259 823zM1021 900Q1200 725 1200 479.5T1023.5 57T600.5 -120T177 57T0 479.5T177 902.5T600.5 1080T1021 900zM903 307Q947 265 907 214Q857 165 812 211L605 399L399 206Q379 194 352 194T303 214Q262 265 305 307L505 487L305 666Q262 708 303 758Q352 808 399 762L605 575L812 767Q830 781 856.5 781T907 758Q947 708 903 666L704 487z" /> <glyph glyph-name="remove-circle-1" unicode="remove-circle" horiz-adv-x="1200" d=" M259 823Q116 679 116 479.5T260 137.5T602.5 -5T943.5 137.5T1086 479.5T943.5 822T602.5 965T259 823zM1021 900Q1200 725 1200 479.5T1023.5 57T600.5 -120T177 57T0 479.5T177 902.5T600.5 1080T1021 900zM903 307Q947 265 907 214Q857 165 812 211L605 399L399 206Q379 194 352 194T303 214Q262 265 305 307L505 487L305 666Q262 708 303 758Q352 808 399 762L605 575L812 767Q830 781 856.5 781T907 758Q947 708 903 666L704 487z" /> <glyph glyph-name="remove-sign" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1005 899Q1171 730 1171 493T1003 90T597.5 -76T194 90T28 493T194 897.5T597.5 1065T1005 899zM701 494L909 680Q956 725 913 777Q889 800 861.5 800T813 786L599 585L384 781Q336 827 285 777Q244 725 288 680L496 494L288 307Q244 264 285 211Q309 188 336.5 188T384 203L599 402L813 207Q861 160 913 211Q956 264 909 307z" /> <glyph glyph-name="remove-sign-1" unicode="remove-sign" horiz-adv-x="1200" d=" M1005 899Q1171 730 1171 493T1003 90T597.5 -76T194 90T28 493T194 897.5T597.5 1065T1005 899zM701 494L909 680Q956 725 913 777Q889 800 861.5 800T813 786L599 585L384 781Q336 827 285 777Q244 725 288 680L496 494L288 307Q244 264 285 211Q309 188 336.5 188T384 203L599 402L813 207Q861 160 913 211Q956 264 909 307z" /> <glyph glyph-name="remove-square" - unicode="" + unicode="" horiz-adv-x="1200" d=" M345 651Q328 669 328 693T346 734.5T387 752T428 734L598 564L771 736Q788 753 812.5 752.5T854.5 735T872 693.5T855 651L683 479L855 308Q871 292 871.5 268T854.5 226T812.5 208.5T772 225L600 396L429 225Q411 207 386.5 207.5T345 225.5T327 267.5T344 309L516 481zM0 1080H1200V-120H0V1080zM109 971V-11H1091V971H109z" /> <glyph glyph-name="remove-square-1" unicode="remove-square" horiz-adv-x="1200" d=" M345 651Q328 669 328 693T346 734.5T387 752T428 734L598 564L771 736Q788 753 812.5 752.5T854.5 735T872 693.5T855 651L683 479L855 308Q871 292 871.5 268T854.5 226T812.5 208.5T772 225L600 396L429 225Q411 207 386.5 207.5T345 225.5T327 267.5T344 309L516 481zM0 1080H1200V-120H0V1080zM109 971V-11H1091V971H109z" /> <glyph glyph-name="remove" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1090 182Q1163 113 1097 30Q1014 -51 939 25L600 333L262 17Q229 -4 185 -4T104 30Q37 113 109 182L437 477L109 772Q37 841 104 923Q185 1004 262 930L600 622L939 938Q971 960 1014 960T1097 923Q1163 841 1090 772L763 477z" /> <glyph glyph-name="remove-1" unicode="remove" horiz-adv-x="1200" d=" M1090 182Q1163 113 1097 30Q1014 -51 939 25L600 333L262 17Q229 -4 185 -4T104 30Q37 113 109 182L437 477L109 772Q37 841 104 923Q185 1004 262 930L600 622L939 938Q971 960 1014 960T1097 923Q1163 841 1090 772L763 477z" /> <glyph glyph-name="repeat" - unicode="" + unicode="" horiz-adv-x="1200" d=" M595 29Q751 29 875 122.5T1041 366L1154 331Q1102 148 945 31.5T595 -85Q357 -85 187 83.5T17 491.5T187 900T595 1069Q880 1069 1056 845L1073 980Q1080 1038 1131 1031Q1151 1031 1172 1007Q1183 994 1183 970L1138 633L809 707Q784 709 772 729T768 769Q778 823 833 812L954 784Q813 956 595 956Q404 956 269.5 819.5T135 492T269.5 165T595 29z" /> <glyph glyph-name="repeat-1" unicode="repeat" horiz-adv-x="1200" d=" M595 29Q751 29 875 122.5T1041 366L1154 331Q1102 148 945 31.5T595 -85Q357 -85 187 83.5T17 491.5T187 900T595 1069Q880 1069 1056 845L1073 980Q1080 1038 1131 1031Q1151 1031 1172 1007Q1183 994 1183 970L1138 633L809 707Q784 709 772 729T768 769Q778 823 833 812L954 784Q813 956 595 956Q404 956 269.5 819.5T135 492T269.5 165T595 29z" /> <glyph glyph-name="resize-full" - unicode="" + unicode="" horiz-adv-x="1200" d=" M473 500L587 387L399 199L299 100L242 61L312 88L499 103L454 -47L26 -59L39 367L190 413L174 226L147 157L186 213L285 312zM1173 1087L1161 660L1011 615L1026 802L1052 871L1013 815L915 715L727 527L614 640L802 829L900 928L957 966L888 939L701 924L746 1075z" /> <glyph glyph-name="resize-full-1" unicode="resize-full" horiz-adv-x="1200" d=" M473 500L587 387L399 199L299 100L242 61L312 88L499 103L454 -47L26 -59L39 367L190 413L174 226L147 157L186 213L285 312zM1173 1087L1161 660L1011 615L1026 802L1052 871L1013 815L915 715L727 527L614 640L802 829L900 928L957 966L888 939L701 924L746 1075z" /> <glyph glyph-name="resize-horizontal" - unicode="" + unicode="" horiz-adv-x="1200" d=" M385 307L267 243L0 496L267 747L385 682L263 577L206 553L263 564H382H858H977L1035 553L977 577L854 682L974 747L1239 496L974 243L854 307L977 411L1035 438L977 426H858H382H263L206 438L263 411z" /> <glyph glyph-name="resize-horizontal-1" unicode="resize-horizontal" horiz-adv-x="1200" d=" M385 307L267 243L0 496L267 747L385 682L263 577L206 553L263 564H382H858H977L1035 553L977 577L854 682L974 747L1239 496L974 243L854 307L977 411L1035 438L977 426H858H382H263L206 438L263 411z" /> <glyph glyph-name="resize-small" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1124 1092L1231 985L1054 807L960 713L907 676L972 702L1149 717L1105 574L702 562L714 967L855 1009L842 832L816 767L853 820L947 914zM531 391L519 -13L376 -56L390 121L416 186L380 132L286 38L107 -139L0 -31L178 146L272 240L326 276L260 252L83 237L126 380z" /> <glyph glyph-name="resize-small-1" unicode="resize-small" horiz-adv-x="1200" d=" M1124 1092L1231 985L1054 807L960 713L907 676L972 702L1149 717L1105 574L702 562L714 967L855 1009L842 832L816 767L853 820L947 914zM531 391L519 -13L376 -56L390 121L416 186L380 132L286 38L107 -139L0 -31L178 146L272 240L326 276L260 252L83 237L126 380z" /> <glyph glyph-name="resize-vertical" - unicode="" + unicode="" horiz-adv-x="1200" d=" M789 284L853 166L600 -101L349 166L414 284L519 162L543 105L532 162V281V757V876L543 934L519 876L414 753L349 873L600 1138L853 873L789 753L685 876L658 934L670 876V757V281V162L658 105L685 162z" /> <glyph glyph-name="resize-vertical-1" unicode="resize-vertical" horiz-adv-x="1200" d=" M789 284L853 166L600 -101L349 166L414 284L519 162L543 105L532 162V281V757V876L543 934L519 876L414 753L349 873L600 1138L853 873L789 753L685 876L658 934L670 876V757V281V162L658 105L685 162z" /> <glyph glyph-name="retweet" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1526 497Q1573 446 1527 393L1231 65L929 393Q911 421 911 442.5T935 497Q993 537 1039 488L1154 361V762H636V913H1304V361L1420 488Q1465 537 1526 497zM396 204H916V54H247V606L130 479Q84 430 26 470Q-23 520 22 574L319 902L623 574Q641 546 641 524.5T617 470Q559 430 513 479L396 606V204z" /> <glyph glyph-name="retweet-1" unicode="retweet" horiz-adv-x="1200" d=" M1526 497Q1573 446 1527 393L1231 65L929 393Q911 421 911 442.5T935 497Q993 537 1039 488L1154 361V762H636V913H1304V361L1420 488Q1465 537 1526 497zM396 204H916V54H247V606L130 479Q84 430 26 470Q-23 520 22 574L319 902L623 574Q641 546 641 524.5T617 470Q559 430 513 479L396 606V204z" /> <glyph glyph-name="rgb" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 -120V1080H300V-120H0zM450 -120V1080H750V-120H450zM900 -120V1080H1200V-120H900z" /> <glyph glyph-name="rgb-1" unicode="rgb" horiz-adv-x="1200" d=" M0 -120V1080H300V-120H0zM450 -120V1080H750V-120H450zM900 -120V1080H1200V-120H900z" /> <glyph glyph-name="road" - unicode="" + unicode="" horiz-adv-x="1200" d=" M630 -66H0L131 1030H630V839H730V1030H1233L1359 -66H730V205H630V-66zM630 386H730V645H630V386z" /> <glyph glyph-name="road-1" unicode="road" horiz-adv-x="1200" d=" M630 -66H0L131 1030H630V839H730V1030H1233L1359 -66H730V205H630V-66zM630 386H730V645H630V386z" /> <glyph glyph-name="row-add" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1148 46Q1199 46 1199 -6V-67Q1199 -86 1184 -103T1148 -120H54Q35 -120 18 -103T1 -67V-6Q1 46 54 46H1148zM1148 734Q1199 734 1199 684V621Q1199 574 1148 574H54Q1 574 1 621V684Q1 734 54 734H1148zM1148 1080Q1169 1080 1184 1063T1199 1028V966Q1199 914 1148 914H54Q1 914 1 966V1028Q1 1046 18 1063T54 1080H1148zM832 273Q818 273 809 282.5T800 306T809 329T832 338H966V473Q966 487 976 496.5T999.5 506T1023 496.5T1033 473V338H1167Q1180 338 1189.5 329T1199 306T1189.5 282.5T1167 273H1033V138Q1033 124 1023 115T999.5 106T976 115T966 138V273H832z" /> <glyph glyph-name="row-add-1" unicode="row-add" horiz-adv-x="1200" d=" M1148 46Q1199 46 1199 -6V-67Q1199 -86 1184 -103T1148 -120H54Q35 -120 18 -103T1 -67V-6Q1 46 54 46H1148zM1148 734Q1199 734 1199 684V621Q1199 574 1148 574H54Q1 574 1 621V684Q1 734 54 734H1148zM1148 1080Q1169 1080 1184 1063T1199 1028V966Q1199 914 1148 914H54Q1 914 1 966V1028Q1 1046 18 1063T54 1080H1148zM832 273Q818 273 809 282.5T800 306T809 329T832 338H966V473Q966 487 976 496.5T999.5 506T1023 496.5T1033 473V338H1167Q1180 338 1189.5 329T1199 306T1189.5 282.5T1167 273H1033V138Q1033 124 1023 115T999.5 106T976 115T966 138V273H832z" /> <glyph glyph-name="row-trash" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1148 46Q1199 46 1199 -6V-67Q1199 -86 1184 -103T1148 -120H54Q35 -120 18 -103T1 -67V-6Q1 46 54 46H1148zM1148 734Q1199 734 1199 684V621Q1199 574 1148 574H54Q1 574 1 621V684Q1 734 54 734H1148zM1148 1080Q1169 1080 1184 1063T1199 1028V966Q1199 914 1148 914H54Q1 914 1 966V1028Q1 1046 18 1063T54 1080H1148zM858 401Q848 411 848.5 424T858.5 447T881 457T904 447L999 352L1094 448Q1104 457 1117.5 457T1140.5 447.5T1150.5 424T1141 401L1046 305L1141 210Q1150 201 1150.5 187.5T1141 164.5T1117.5 155T1095 164L1000 259L904 164Q895 154 881.5 154.5T858 164.5T848 187.5T857 211L953 306z" /> <glyph glyph-name="row-trash-1" unicode="row-trash" horiz-adv-x="1200" d=" M1148 46Q1199 46 1199 -6V-67Q1199 -86 1184 -103T1148 -120H54Q35 -120 18 -103T1 -67V-6Q1 46 54 46H1148zM1148 734Q1199 734 1199 684V621Q1199 574 1148 574H54Q1 574 1 621V684Q1 734 54 734H1148zM1148 1080Q1169 1080 1184 1063T1199 1028V966Q1199 914 1148 914H54Q1 914 1 966V1028Q1 1046 18 1063T54 1080H1148zM858 401Q848 411 848.5 424T858.5 447T881 457T904 447L999 352L1094 448Q1104 457 1117.5 457T1140.5 447.5T1150.5 424T1141 401L1046 305L1141 210Q1150 201 1150.5 187.5T1141 164.5T1117.5 155T1095 164L1000 259L904 164Q895 154 881.5 154.5T858 164.5T848 187.5T857 211L953 306z" /> <glyph glyph-name="save" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1185 144V-72H15V144H1185zM1123 89H1010V-18H1123V89zM222 659Q199 687 201.5 722.5T231 784Q244 796 260.5 801.5T293.5 806T326 797.5T354 776L494 623V1063H682V623L820 776Q846 804 881 806T944 784Q959 771 967 754T975 719Q975 686 951 659L586 257z" /> <glyph glyph-name="save-1" unicode="save" horiz-adv-x="1200" d=" M1185 144V-72H15V144H1185zM1123 89H1010V-18H1123V89zM222 659Q199 687 201.5 722.5T231 784Q244 796 260.5 801.5T293.5 806T326 797.5T354 776L494 623V1063H682V623L820 776Q846 804 881 806T944 784Q959 771 967 754T975 719Q975 686 951 659L586 257z" /> <glyph glyph-name="saved" - unicode="" + unicode="" horiz-adv-x="1200" d=" M15 144V-72H1185V144H15zM1123 -18H1010V89H1123V-18zM228 760Q241 774 258.5 781.5T294 789T330 782T362 762L533 598L800 984Q810 1000 826 1010.5T860 1024.5T896 1024T930 1009Q946 997 956 981T969 947.5T968.5 911.5T954 877L564 305L230 627Q216 640 209 657.5T201.5 693T207.5 728.5T228 760z" /> <glyph glyph-name="saved-1" unicode="saved" horiz-adv-x="1200" d=" M15 144V-72H1185V144H15zM1123 -18H1010V89H1123V-18zM228 760Q241 774 258.5 781.5T294 789T330 782T362 762L533 598L800 984Q810 1000 826 1010.5T860 1024.5T896 1024T930 1009Q946 997 956 981T969 947.5T968.5 911.5T954 877L564 305L230 627Q216 640 209 657.5T201.5 693T207.5 728.5T228 760z" /> <glyph glyph-name="scissors" - unicode="" + unicode="" horiz-adv-x="1200" d=" M310 92Q232 46 146.5 62T22 146Q0 186 0 229Q0 267 7 279Q48 407 203 453Q207 453 257.5 466T369.5 499T448 529L453 534Q448 534 448 536Q431 547 369.5 567.5T257.5 600T203 612Q51 654 7 787Q0 803 0 838Q0 881 22 921Q61 989 146.5 1006.5T310 974Q406 921 428 833Q443 776 419 719L601 617Q1040 856 1047 860Q1078 881 1118 870.5T1178.5 849T1206 830L1226 810L746 534L1226 258L1206 237Q1199 229 1178.5 218T1118 194.5T1047 207Q1040 211 601 450L419 350Q443 291 428 232Q406 146 310 92zM166 722Q216 696 263 702T334 742Q347 768 341 810Q323 867 269 895Q221 924 172.5 916T102 875Q92 860 92 838Q92 830 93 823T94 810Q113 754 166 722zM102 194Q124 156 172.5 149.5T269 172Q323 200 341 258Q347 298 334 324Q310 359 263 364.5T166 346Q113 313 94 258Q94 251 93 244T92 229Q92 211 102 194z" /> <glyph glyph-name="scissors-1" unicode="scissors" horiz-adv-x="1200" d=" M310 92Q232 46 146.5 62T22 146Q0 186 0 229Q0 267 7 279Q48 407 203 453Q207 453 257.5 466T369.5 499T448 529L453 534Q448 534 448 536Q431 547 369.5 567.5T257.5 600T203 612Q51 654 7 787Q0 803 0 838Q0 881 22 921Q61 989 146.5 1006.5T310 974Q406 921 428 833Q443 776 419 719L601 617Q1040 856 1047 860Q1078 881 1118 870.5T1178.5 849T1206 830L1226 810L746 534L1226 258L1206 237Q1199 229 1178.5 218T1118 194.5T1047 207Q1040 211 601 450L419 350Q443 291 428 232Q406 146 310 92zM166 722Q216 696 263 702T334 742Q347 768 341 810Q323 867 269 895Q221 924 172.5 916T102 875Q92 860 92 838Q92 830 93 823T94 810Q113 754 166 722zM102 194Q124 156 172.5 149.5T269 172Q323 200 341 258Q347 298 334 324Q310 359 263 364.5T166 346Q113 313 94 258Q94 251 93 244T92 229Q92 211 102 194z" /> <glyph glyph-name="screenshot" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1280 594V160H706V594H1126V645H1205V594H1280zM993 247Q1020 247 1043.5 257.5T1084.5 285.5T1112.5 326.5T1123 377T1112.5 428T1084.5 470T1043.5 498.5T993 509T942 498.5T900 470T872 428T862 377T872 326.5T900 285.5T942 257.5T993 247zM956 867V650H871V782H86V278H647V191H539V183L584 102Q584 81 575.5 71.5T553 60T520 59.5T479 61T438 59.5T404.5 60T382 71.5T374 102L418 183V191H0V867H956z" /> <glyph glyph-name="screenshot-1" unicode="screenshot" horiz-adv-x="1200" d=" M1280 594V160H706V594H1126V645H1205V594H1280zM993 247Q1020 247 1043.5 257.5T1084.5 285.5T1112.5 326.5T1123 377T1112.5 428T1084.5 470T1043.5 498.5T993 509T942 498.5T900 470T872 428T862 377T872 326.5T900 285.5T942 257.5T993 247zM956 867V650H871V782H86V278H647V191H539V183L584 102Q584 81 575.5 71.5T553 60T520 59.5T479 61T438 59.5T404.5 60T382 71.5T374 102L418 183V191H0V867H956z" /> <glyph glyph-name="search-coords" - unicode="" + unicode="" horiz-adv-x="1200" d=" M601 1081Q764 1081 902.5 1000.5T1121.5 781.5T1202 480T1121 178Q1110 160 1098 141Q1075 163 1054 180Q1048 183 1037 187.5T1020 194Q1036 225 1045 259Q1056 285 1067 315Q1091 383 1096 435H1035Q1021 476 995 509L983 525H1096Q1091 577 1067 644.5T1014 755H644V617Q597 598 558 566V755H188Q159 712 135 644.5T106 525H517Q482 484 464 435H106Q111 383 135 315.5T188 205H474Q497 155 533 118H261Q313 69 400 30T558 -15V96Q596 65 644 47V-15Q715 -9 802 30Q805 32 811 34Q819 36 828 39Q858 47 886 61Q904 12 939 -17Q921 -29 903 -40Q764 -121 601 -121T299.5 -40.5T80.5 178.5T0 480T80.5 781.5T299.5 1000.5T601 1081zM644 975V842H941Q889 891 802 930T644 975zM558 975Q487 969 400 930T261 842H558V975zM750 580Q799 580 844 560.5T924 505Q961 470 979 425T997 332T979 238.5T924 157Q889 121 844 102.5T750 84Q699 84 654.5 102.5T576 157Q539 193 520.5 238.5T502 332T520.5 425T576 505Q610 541 654.5 560.5T750 580zM750 513Q712 513 679.5 499T623 458Q596 432 582.5 399T569 331T582.5 263T623 204Q647 178 679.5 165T750 152Q786 152 818.5 165T877 204T916 263T929 331T916 399T877 458Q851 485 818.5 499T750 513zM977 152L1032 129L1201 -40L1121 -120L952 50L929 105z" /> <glyph glyph-name="search-coords-1" unicode="search-coords" horiz-adv-x="1200" d=" M601 1081Q764 1081 902.5 1000.5T1121.5 781.5T1202 480T1121 178Q1110 160 1098 141Q1075 163 1054 180Q1048 183 1037 187.5T1020 194Q1036 225 1045 259Q1056 285 1067 315Q1091 383 1096 435H1035Q1021 476 995 509L983 525H1096Q1091 577 1067 644.5T1014 755H644V617Q597 598 558 566V755H188Q159 712 135 644.5T106 525H517Q482 484 464 435H106Q111 383 135 315.5T188 205H474Q497 155 533 118H261Q313 69 400 30T558 -15V96Q596 65 644 47V-15Q715 -9 802 30Q805 32 811 34Q819 36 828 39Q858 47 886 61Q904 12 939 -17Q921 -29 903 -40Q764 -121 601 -121T299.5 -40.5T80.5 178.5T0 480T80.5 781.5T299.5 1000.5T601 1081zM644 975V842H941Q889 891 802 930T644 975zM558 975Q487 969 400 930T261 842H558V975zM750 580Q799 580 844 560.5T924 505Q961 470 979 425T997 332T979 238.5T924 157Q889 121 844 102.5T750 84Q699 84 654.5 102.5T576 157Q539 193 520.5 238.5T502 332T520.5 425T576 505Q610 541 654.5 560.5T750 580zM750 513Q712 513 679.5 499T623 458Q596 432 582.5 399T569 331T582.5 263T623 204Q647 178 679.5 165T750 152Q786 152 818.5 165T877 204T916 263T929 331T916 399T877 458Q851 485 818.5 499T750 513zM977 152L1032 129L1201 -40L1121 -120L952 50L929 105z" /> <glyph glyph-name="search" - unicode="" + unicode="" horiz-adv-x="1200" d=" M429 230Q341 230 263.5 261.5T127 355Q64 418 32 497T0 658.5T32 819T127 959Q186 1021 263.5 1054.5T429 1088Q514 1088 591.5 1054.5T731 959Q794 897 825.5 819T857 658.5T825.5 497T731 355Q669 293 591.5 261.5T429 230zM429 972Q363 972 307 947.5T209 877Q162 832 138.5 774.5T115 657T138.5 539.5T209 437Q251 392 307 369.5T429 347Q491 347 547.5 369.5T649 437T716.5 539.5T739 657T716.5 774.5T649 877Q604 923 547.5 947.5T429 972zM1210 15L917 307L822 347L739 265L779 170L1071 -124z" /> <glyph glyph-name="search-1" unicode="search" horiz-adv-x="1200" d=" M429 230Q341 230 263.5 261.5T127 355Q64 418 32 497T0 658.5T32 819T127 959Q186 1021 263.5 1054.5T429 1088Q514 1088 591.5 1054.5T731 959Q794 897 825.5 819T857 658.5T825.5 497T731 355Q669 293 591.5 261.5T429 230zM429 972Q363 972 307 947.5T209 877Q162 832 138.5 774.5T115 657T138.5 539.5T209 437Q251 392 307 369.5T429 347Q491 347 547.5 369.5T649 437T716.5 539.5T739 657T716.5 774.5T649 877Q604 923 547.5 947.5T429 972zM1210 15L917 307L822 347L739 265L779 170L1071 -124z" /> <glyph glyph-name="send" - unicode="" + unicode="" horiz-adv-x="1200" d=" M12 1039L1187 456L12 -127L270 400L658 447L270 511z" /> <glyph glyph-name="send-1" unicode="send" horiz-adv-x="1200" d=" M12 1039L1187 456L12 -127L270 400L658 447L270 511z" /> <glyph glyph-name="share-alt" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1146 766V186Q1146 78 1072 4.5T890 -69H312Q206 -69 132 4.5T58 186V766Q58 870 132 945T312 1020H890Q998 1020 1072 945T1146 766zM142 186Q142 115 191 65.5T312 16H890Q964 16 1012.5 65.5T1061 186V766Q1061 837 1012.5 886.5T890 936H312Q240 936 191 886.5T142 766V186zM728 292L456 445Q464 467 464 477.5T456 510L728 665Q762 629 808 629T886.5 662T919 739Q919 790 886.5 823T808 856T728.5 823T695 739Q695 720 698 709L434 556Q399 588 350 588Q303 588 270.5 555.5T238 478.5T270.5 399.5T350 365Q399 365 434 400L698 246Q695 236 695 216Q695 166 728.5 133.5T808 101T886.5 133.5T919 216Q919 262 886.5 294.5T808 327T728 292z" /> <glyph glyph-name="share-alt-1" unicode="share-alt" horiz-adv-x="1200" d=" M1146 766V186Q1146 78 1072 4.5T890 -69H312Q206 -69 132 4.5T58 186V766Q58 870 132 945T312 1020H890Q998 1020 1072 945T1146 766zM142 186Q142 115 191 65.5T312 16H890Q964 16 1012.5 65.5T1061 186V766Q1061 837 1012.5 886.5T890 936H312Q240 936 191 886.5T142 766V186zM728 292L456 445Q464 467 464 477.5T456 510L728 665Q762 629 808 629T886.5 662T919 739Q919 790 886.5 823T808 856T728.5 823T695 739Q695 720 698 709L434 556Q399 588 350 588Q303 588 270.5 555.5T238 478.5T270.5 399.5T350 365Q399 365 434 400L698 246Q695 236 695 216Q695 166 728.5 133.5T808 101T886.5 133.5T919 216Q919 262 886.5 294.5T808 327T728 292z" /> <glyph glyph-name="share" - unicode="" + unicode="" horiz-adv-x="1200" d=" M949 272Q1022 272 1072.5 219.5T1123 95.5T1072.5 -25T951 -74T829.5 -25T779 96Q779 118 784 147L374 387Q326 327 251 327Q179 327 127.5 379.5T76 503T127.5 626T251 678Q326 678 374 620L784 859Q779 889 779 911Q779 982 829.5 1031.5T951 1081T1072.5 1031.5T1123 911T1072.5 787.5T951 735T825 788L415 552Q423 518 423 503.5T415 453L825 214Q875 272 949 272z" /> <glyph glyph-name="share-1" unicode="share" horiz-adv-x="1200" d=" M949 272Q1022 272 1072.5 219.5T1123 95.5T1072.5 -25T951 -74T829.5 -25T779 96Q779 118 784 147L374 387Q326 327 251 327Q179 327 127.5 379.5T76 503T127.5 626T251 678Q326 678 374 620L784 859Q779 889 779 911Q779 982 829.5 1031.5T951 1081T1072.5 1031.5T1123 911T1072.5 787.5T951 735T825 788L415 552Q423 518 423 503.5T415 453L825 214Q875 272 949 272z" /> <glyph glyph-name="sheet" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1062 712V407L1061 102Q1056 26 992.5 -26T854 -70H582L311 -69Q236 -63 183.5 -0.5T139 137V492.5V848Q141 926 205 982T347 1030H800zM966 678Q962 682 953 682.5T935 682T917 682Q903 683 876.5 682T828.5 682T789 688Q759 699 746 729T737 794V936H528.5H320Q279 932 254.5 895.5T236 818V463V108Q240 69 274 43.5T347 24H612.5H878Q920 28 946 63.5T966 141V678zM349 787H851V719H349V787zM349 606H851V537H349V606zM349 424H851V355H349V424zM349 241H851V173H349V241z" /> <glyph glyph-name="sheet-1" unicode="sheet" horiz-adv-x="1200" d=" M1062 712V407L1061 102Q1056 26 992.5 -26T854 -70H582L311 -69Q236 -63 183.5 -0.5T139 137V492.5V848Q141 926 205 982T347 1030H800zM966 678Q962 682 953 682.5T935 682T917 682Q903 683 876.5 682T828.5 682T789 688Q759 699 746 729T737 794V936H528.5H320Q279 932 254.5 895.5T236 818V463V108Q240 69 274 43.5T347 24H612.5H878Q920 28 946 63.5T966 141V678zM349 787H851V719H349V787zM349 606H851V537H349V606zM349 424H851V355H349V424zM349 241H851V173H349V241z" /> <glyph glyph-name="shopping-cart" - unicode="" + unicode="" horiz-adv-x="1200" d=" M500 359H1118V259H311V359L136 896H0V996H349V896H1079H1253L1083 495zM526 93Q526 71 517.5 51.5T494.5 17.5T460 -5.5T418 -14T376.5 -5.5T342.5 17.5T319.5 51.5T311 93T319.5 135T342.5 169.5T376.5 192.5T418 201T460 192.5T494.5 169.5T517.5 135T526 93zM1087 93Q1087 71 1078.5 51.5T1055.5 17.5T1021 -5.5T979 -14T937.5 -5.5T903.5 17.5T880.5 51.5T872 93T880.5 135T903.5 169.5T937.5 192.5T979 201T1021 192.5T1055.5 169.5T1078.5 135T1087 93z" /> <glyph glyph-name="shopping-cart-1" unicode="shopping-cart" horiz-adv-x="1200" d=" M500 359H1118V259H311V359L136 896H0V996H349V896H1079H1253L1083 495zM526 93Q526 71 517.5 51.5T494.5 17.5T460 -5.5T418 -14T376.5 -5.5T342.5 17.5T319.5 51.5T311 93T319.5 135T342.5 169.5T376.5 192.5T418 201T460 192.5T494.5 169.5T517.5 135T526 93zM1087 93Q1087 71 1078.5 51.5T1055.5 17.5T1021 -5.5T979 -14T937.5 -5.5T903.5 17.5T880.5 51.5T872 93T880.5 135T903.5 169.5T937.5 192.5T979 201T1021 192.5T1055.5 169.5T1078.5 135T1087 93z" /> <glyph glyph-name="signal" - unicode="" + unicode="" horiz-adv-x="1200" d=" M511 -15Q511 -65 463 -65H402Q356 -65 356 -15V352Q356 405 402 405H463Q511 405 511 352V-15zM177 -15Q177 -65 126 -65H69Q49 -65 33.5 -49T18 -15V228Q18 249 33.5 263.5T69 278H126Q177 278 177 228V-15zM847 -15Q847 -65 799 -65H737Q692 -65 692 -15V609Q692 658 737 658H799Q847 658 847 609V-15zM1022 1049Q1022 1100 1075 1100H1132Q1152 1100 1167 1084T1182 1049V-15Q1182 -33 1167 -49T1132 -65H1075Q1022 -65 1022 -15V1049z" /> <glyph glyph-name="signal-1" unicode="signal" horiz-adv-x="1200" d=" M511 -15Q511 -65 463 -65H402Q356 -65 356 -15V352Q356 405 402 405H463Q511 405 511 352V-15zM177 -15Q177 -65 126 -65H69Q49 -65 33.5 -49T18 -15V228Q18 249 33.5 263.5T69 278H126Q177 278 177 228V-15zM847 -15Q847 -65 799 -65H737Q692 -65 692 -15V609Q692 658 737 658H799Q847 658 847 609V-15zM1022 1049Q1022 1100 1075 1100H1132Q1152 1100 1167 1084T1182 1049V-15Q1182 -33 1167 -49T1132 -65H1075Q1022 -65 1022 -15V1049z" /> <glyph glyph-name="size-extra-large" - unicode="" + unicode="" horiz-adv-x="1200" d=" M118.38089 766.66412H253.69529L368.67379 582.4648199999999L481.30659 766.66412H615.44729L437.11329 488.2129199999999L633.04689 193.33589H493.42969L366.32809 391.61522L238.83399 193.33589H99.999994L295.93359 492.51562zM696.40239 761.97272H812.16209V289.93362H1100V193.33589H696.40239z" /> <glyph glyph-name="size-extra-large-1" unicode="size-extra-large" horiz-adv-x="1200" d=" M118.38089 766.66412H253.69529L368.67379 582.4648199999999L481.30659 766.66412H615.44729L437.11329 488.2129199999999L633.04689 193.33589H493.42969L366.32809 391.61522L238.83399 193.33589H99.999994L295.93359 492.51562zM696.40239 761.97272H812.16209V289.93362H1100V193.33589H696.40239z" /> <glyph glyph-name="size-large" - unicode="" + unicode="" horiz-adv-x="1200" d=" M849.22069 775.6328100000001C920.20349 775.6328100000001 975.58559 760.68051 1015.3672 730.77931C1055.4088 701.13811 1081.1494 660.05921 1092.5898 607.53711L977.92569 586.08401C969.86539 614.16511 954.65379 636.26611 932.29289 652.38671C910.19209 668.7674099999999 882.50199 676.95901 849.22069 676.95901C798.77859 676.95901 758.60619 660.9676099999999 728.70499 628.98631C699.06389 597.0051100000001 684.24409 549.55341 684.24409 486.63081C684.24409 418.76811 699.32309 367.80741 729.48429 333.7461100000001C759.64549 299.94471 799.16879 283.0410100000001 848.05069 283.0410100000001C872.23169 283.0410100000001 896.41269 287.72361 920.59369 297.0840100000001C945.03469 306.70431 965.96399 318.2724100000001 983.38469 331.79301V404.33591H851.16989V500.67191H1100V272.9023100000001C1075.8191 249.50141 1040.7172 228.8313100000001 994.69529 210.8906100000001C948.93349 193.20991 902.52279 184.36721 855.46089 184.36721C795.65849 184.36721 743.52619 196.84761 699.06439 221.8086100000001C654.60259 247.0296100000001 621.19089 282.91121 598.82999 329.4531100000001C576.46909 376.25501 565.28899 427.08701 565.28899 481.94921C565.28899 541.49161 577.76939 594.40571 602.73039 640.68751C627.69139 686.96931 664.22219 722.46111 712.32419 747.16211C748.98559 766.14281 794.61849 775.6328100000001 849.22069 775.6328100000001zM99.999994 761.20121H215.44529V290.4531100000001H502.49599V194.1211100000001H99.999994z" /> <glyph glyph-name="size-large-1" unicode="size-large" horiz-adv-x="1200" d=" M849.22069 775.6328100000001C920.20349 775.6328100000001 975.58559 760.68051 1015.3672 730.77931C1055.4088 701.13811 1081.1494 660.05921 1092.5898 607.53711L977.92569 586.08401C969.86539 614.16511 954.65379 636.26611 932.29289 652.38671C910.19209 668.7674099999999 882.50199 676.95901 849.22069 676.95901C798.77859 676.95901 758.60619 660.9676099999999 728.70499 628.98631C699.06389 597.0051100000001 684.24409 549.55341 684.24409 486.63081C684.24409 418.76811 699.32309 367.80741 729.48429 333.7461100000001C759.64549 299.94471 799.16879 283.0410100000001 848.05069 283.0410100000001C872.23169 283.0410100000001 896.41269 287.72361 920.59369 297.0840100000001C945.03469 306.70431 965.96399 318.2724100000001 983.38469 331.79301V404.33591H851.16989V500.67191H1100V272.9023100000001C1075.8191 249.50141 1040.7172 228.8313100000001 994.69529 210.8906100000001C948.93349 193.20991 902.52279 184.36721 855.46089 184.36721C795.65849 184.36721 743.52619 196.84761 699.06439 221.8086100000001C654.60259 247.0296100000001 621.19089 282.91121 598.82999 329.4531100000001C576.46909 376.25501 565.28899 427.08701 565.28899 481.94921C565.28899 541.49161 577.76939 594.40571 602.73039 640.68751C627.69139 686.96931 664.22219 722.46111 712.32419 747.16211C748.98559 766.14281 794.61849 775.6328100000001 849.22069 775.6328100000001zM99.999994 761.20121H215.44529V290.4531100000001H502.49599V194.1211100000001H99.999994z" /> <glyph glyph-name="size-medium" - unicode="" + unicode="" horiz-adv-x="1200" d=" M99.999994 729.3203H250.67969L341.15619 389.1836L430.61129 729.3203H581.63279V230.6797000000001H488.09369V623.1973L389.11519 230.6797000000001H292.17569L193.53709 623.1973V230.6797000000001H99.999994zM681.97259 729.3203H865.98629C907.48289 729.3203 939.11409 726.1441 960.88279 719.7949C990.13449 711.1781 1015.193 695.8724 1036.0547 673.877C1056.9163 651.8815 1072.7875 624.8986 1083.6719 592.9258C1094.5562 561.1798 1100 521.9503 1100 475.2383C1100 434.1952 1094.8975 398.8205000000001 1084.6934 369.1153000000001C1072.2218 332.8341000000001 1054.4202 303.4685 1031.291 281.0196C1013.8307 264.0128 990.24809 250.7484 960.54289 241.2246C938.32069 234.1952 908.61589 230.6797000000001 871.42769 230.6797000000001H681.97259zM782.65229 644.9649V314.6934H857.82219C885.94019 314.6934 906.23529 316.2805 918.70699 319.4551C935.03349 323.5367 948.52599 330.4526 959.18359 340.2031C970.06789 349.9537000000001 978.91009 365.9399 985.71289 388.1621C992.51559 410.6111 995.91789 441.1114 995.91789 479.6602C995.91789 518.2090000000001 992.51559 547.8007 985.71289 568.4356C978.91009 589.0705 969.38739 605.1698 957.14249 616.7344C944.89759 628.299 929.36379 636.1215 910.54289 640.2031C896.48399 643.3777 868.93369 644.9649 827.89059 644.9649z" /> <glyph glyph-name="size-medium-1" unicode="size-medium" horiz-adv-x="1200" d=" M99.999994 729.3203H250.67969L341.15619 389.1836L430.61129 729.3203H581.63279V230.6797000000001H488.09369V623.1973L389.11519 230.6797000000001H292.17569L193.53709 623.1973V230.6797000000001H99.999994zM681.97259 729.3203H865.98629C907.48289 729.3203 939.11409 726.1441 960.88279 719.7949C990.13449 711.1781 1015.193 695.8724 1036.0547 673.877C1056.9163 651.8815 1072.7875 624.8986 1083.6719 592.9258C1094.5562 561.1798 1100 521.9503 1100 475.2383C1100 434.1952 1094.8975 398.8205000000001 1084.6934 369.1153000000001C1072.2218 332.8341000000001 1054.4202 303.4685 1031.291 281.0196C1013.8307 264.0128 990.24809 250.7484 960.54289 241.2246C938.32069 234.1952 908.61589 230.6797000000001 871.42769 230.6797000000001H681.97259zM782.65229 644.9649V314.6934H857.82219C885.94019 314.6934 906.23529 316.2805 918.70699 319.4551C935.03349 323.5367 948.52599 330.4526 959.18359 340.2031C970.06789 349.9537000000001 978.91009 365.9399 985.71289 388.1621C992.51559 410.6111 995.91789 441.1114 995.91789 479.6602C995.91789 518.2090000000001 992.51559 547.8007 985.71289 568.4356C978.91009 589.0705 969.38739 605.1698 957.14249 616.7344C944.89759 628.299 929.36379 636.1215 910.54289 640.2031C896.48399 643.3777 868.93369 644.9649 827.89059 644.9649z" /> <glyph glyph-name="size-small" - unicode="" + unicode="" horiz-adv-x="1200" d=" M305.95509 745.67579C370.40339 745.67579 418.85489 731.54559 451.31249 703.2910899999999C484.00379 675.03649 501.16829 637.32698 502.80279 590.15819L399.1249900000001 585.6035899999999C394.6883900000001 611.98999 385.11339 630.90578 370.4023900000001 642.3476900000001C355.92479 654.02309 334.09289 659.8593900000001 304.90429 659.8593900000001C274.7816900000001 659.8593900000001 251.19659 653.67289 234.15039 641.2968900000001C223.17549 633.3575900000001 217.68749 622.73188 217.68749 609.42188C217.68749 597.2793899999999 222.82529 586.88979 233.09959 578.24999C246.17609 567.27509 277.93329 555.83079 328.37109 543.92188C378.80889 532.01299 416.05409 519.63788 440.10549 506.79499C464.39039 494.18548 483.30429 476.79079 496.84769 454.60749C510.62469 432.65769 517.51369 405.4537900000001 517.51369 372.99609C517.51369 343.57408 509.33979 316.01988 492.99419 290.33398C476.64859 264.64809 453.53169 245.50009 423.64259 232.89069C393.75349 220.51468 356.50829 214.32619 311.90819 214.32619C246.99289 214.32619 197.13849 229.27109 162.34569 259.16018C127.55299 289.28279 106.77179 333.06479 99.999994 390.50779L200.87499 400.31638C206.94619 366.45769 219.20519 341.58759 237.65239 325.70898C256.33299 309.83048 281.43539 301.89069 312.95899 301.89069C346.35069 301.89069 371.45299 308.89769 388.26559 322.90819C405.31179 337.1521800000001 413.83599 353.7303900000001 413.83599 372.64459C413.83599 384.78698 410.21529 395.06048 402.97659 403.46679C395.97129 412.10668 383.59629 419.5800900000001 365.84959 425.88478C353.7071900000001 430.08799 326.03499 437.56138 282.83599 448.30278C227.26089 462.07979 188.26649 479.00809 165.84959 499.08988C134.32599 527.34439 118.56449 561.78558 118.56449 602.4160899999999C118.56449 628.56899 125.91989 652.9707900000001 140.63089 675.62109C155.57539 698.5048899999999 176.94099 715.89969 204.72849 727.80859C232.74959 739.71758 266.49219 745.67579 305.95509 745.67579zM604.02739 736.9160899999999H759.19339L852.36329 386.65429L944.48239 736.9160899999999H1100V223.43359H1003.6777V627.6347900000001L901.75199 223.43359H801.92579L700.34959 627.6347900000001V223.43359H604.02739z" /> <glyph glyph-name="size-small-1" unicode="size-small" horiz-adv-x="1200" d=" M305.95509 745.67579C370.40339 745.67579 418.85489 731.54559 451.31249 703.2910899999999C484.00379 675.03649 501.16829 637.32698 502.80279 590.15819L399.1249900000001 585.6035899999999C394.6883900000001 611.98999 385.11339 630.90578 370.4023900000001 642.3476900000001C355.92479 654.02309 334.09289 659.8593900000001 304.90429 659.8593900000001C274.7816900000001 659.8593900000001 251.19659 653.67289 234.15039 641.2968900000001C223.17549 633.3575900000001 217.68749 622.73188 217.68749 609.42188C217.68749 597.2793899999999 222.82529 586.88979 233.09959 578.24999C246.17609 567.27509 277.93329 555.83079 328.37109 543.92188C378.80889 532.01299 416.05409 519.63788 440.10549 506.79499C464.39039 494.18548 483.30429 476.79079 496.84769 454.60749C510.62469 432.65769 517.51369 405.4537900000001 517.51369 372.99609C517.51369 343.57408 509.33979 316.01988 492.99419 290.33398C476.64859 264.64809 453.53169 245.50009 423.64259 232.89069C393.75349 220.51468 356.50829 214.32619 311.90819 214.32619C246.99289 214.32619 197.13849 229.27109 162.34569 259.16018C127.55299 289.28279 106.77179 333.06479 99.999994 390.50779L200.87499 400.31638C206.94619 366.45769 219.20519 341.58759 237.65239 325.70898C256.33299 309.83048 281.43539 301.89069 312.95899 301.89069C346.35069 301.89069 371.45299 308.89769 388.26559 322.90819C405.31179 337.1521800000001 413.83599 353.7303900000001 413.83599 372.64459C413.83599 384.78698 410.21529 395.06048 402.97659 403.46679C395.97129 412.10668 383.59629 419.5800900000001 365.84959 425.88478C353.7071900000001 430.08799 326.03499 437.56138 282.83599 448.30278C227.26089 462.07979 188.26649 479.00809 165.84959 499.08988C134.32599 527.34439 118.56449 561.78558 118.56449 602.4160899999999C118.56449 628.56899 125.91989 652.9707900000001 140.63089 675.62109C155.57539 698.5048899999999 176.94099 715.89969 204.72849 727.80859C232.74959 739.71758 266.49219 745.67579 305.95509 745.67579zM604.02739 736.9160899999999H759.19339L852.36329 386.65429L944.48239 736.9160899999999H1100V223.43359H1003.6777V627.6347900000001L901.75199 223.43359H801.92579L700.34959 627.6347900000001V223.43359H604.02739z" /> <glyph glyph-name="slope" - unicode="" + unicode="" horiz-adv-x="1200" d=" M-0.0000062500003 582.58547V-120H1200z M526.52979 1052.260291L933.24816 1079.63828C950.27221 1081.38231 965.8457 1076.81977 979.96864 1065.95063C987.6677 1061.06014 994.36359 1054.762636 1000.0561 1047.0581C1005.7488 1039.353564 1009.303 1030.926485 1010.7192 1021.776787C1012.6267 1012.826027 1012.6124 1004.384135 1010.6762 996.451161C1008.7401 988.518196 1005.3239 981.415866 1000.4276 975.14423C995.53114 968.8725846 989.42373 963.8265082 982.10526 960.00599226C974.78709 956.1855264 966.69925 953.9123959 957.84203 953.1865925L809.3285 942.825687L1200 672.87693L1124.975 567.86814L723.49205 845.45104L772.58777 686.02261C777.38564 668.5189499999999 775.40888 652.56239 766.6575 638.15289C757.90619 623.74344 744.57971 614.6311699999999 726.6782000000001 610.8160799999999C718.01994 609.5989099999999 709.42879 609.9817499999999 700.90494 611.96462C692.38109 613.9475 684.3194100000001 617.26131 676.71974 621.90612C669.12007 626.5509099999999 662.50033 632.30723 656.86045 639.17516C651.2205700000001 646.04309 647.2011 653.85301 644.8022 662.60484z" /> <glyph glyph-name="slope-1" unicode="slope" horiz-adv-x="1200" d=" M-0.0000062500003 582.58547V-120H1200z M526.52979 1052.260291L933.24816 1079.63828C950.27221 1081.38231 965.8457 1076.81977 979.96864 1065.95063C987.6677 1061.06014 994.36359 1054.762636 1000.0561 1047.0581C1005.7488 1039.353564 1009.303 1030.926485 1010.7192 1021.776787C1012.6267 1012.826027 1012.6124 1004.384135 1010.6762 996.451161C1008.7401 988.518196 1005.3239 981.415866 1000.4276 975.14423C995.53114 968.8725846 989.42373 963.8265082 982.10526 960.00599226C974.78709 956.1855264 966.69925 953.9123959 957.84203 953.1865925L809.3285 942.825687L1200 672.87693L1124.975 567.86814L723.49205 845.45104L772.58777 686.02261C777.38564 668.5189499999999 775.40888 652.56239 766.6575 638.15289C757.90619 623.74344 744.57971 614.6311699999999 726.6782000000001 610.8160799999999C718.01994 609.5989099999999 709.42879 609.9817499999999 700.90494 611.96462C692.38109 613.9475 684.3194100000001 617.26131 676.71974 621.90612C669.12007 626.5509099999999 662.50033 632.30723 656.86045 639.17516C651.2205700000001 646.04309 647.2011 653.85301 644.8022 662.60484z" /> <glyph glyph-name="sort-by-alphabet-alt" - unicode="" + unicode="" horiz-adv-x="1200" d=" M908 409H1027L1194 -63H1063L1032 28H902L878 -63H746zM1009 117L970 261L926 117H1009zM769 607L987 870H777V983H1137V888L931 623H1140V509H769V607zM0 62L59 174L158 58L183 4L172 58V1097H237H302V58L292 4L317 58L416 174L475 62L237 -190z" /> <glyph glyph-name="sort-by-alphabet-alt-1" unicode="sort-by-alphabet-alt" horiz-adv-x="1200" d=" M908 409H1027L1194 -63H1063L1032 28H902L878 -63H746zM1009 117L970 261L926 117H1009zM769 607L987 870H777V983H1137V888L931 623H1140V509H769V607zM0 62L59 174L158 58L183 4L172 58V1097H237H302V58L292 4L317 58L416 174L475 62L237 -190z" /> <glyph glyph-name="sort-by-alphabet" - unicode="" + unicode="" horiz-adv-x="1200" d=" M908 986H1027L1194 512H1063L1032 604H902L878 512H746zM1009 693L970 837L926 693H1009zM769 31L987 295H777V410H1137V312L931 49H1140V-64H769V31zM0 62L59 174L158 58L183 4L172 58V1097H237H302V58L292 4L317 58L416 174L475 62L237 -190z" /> <glyph glyph-name="sort-by-alphabet-1" unicode="sort-by-alphabet" horiz-adv-x="1200" d=" M908 986H1027L1194 512H1063L1032 604H902L878 512H746zM1009 693L970 837L926 693H1009zM769 31L987 295H777V410H1137V312L931 49H1140V-64H769V31zM0 62L59 174L158 58L183 4L172 58V1097H237H302V58L292 4L317 58L416 174L475 62L237 -190z" /> <glyph glyph-name="sort-by-attributes-alt" - unicode="" + unicode="" horiz-adv-x="1200" d=" M602 439H999Q1023 439 1040 420.5T1057 378V310Q1057 249 999 249H602Q546 249 546 310V378Q546 439 602 439zM602 123H893Q953 123 953 69V-4Q953 -61 893 -61H602Q546 -61 546 -4V69Q546 123 602 123zM602 749H1199Q1257 749 1257 690V621Q1257 559 1199 559H602Q546 559 546 621V690Q546 749 602 749zM1371 875H602Q546 875 546 931V1003Q546 1059 602 1059H1371Q1427 1059 1427 1003V931Q1427 875 1371 875zM0 130L54 233L145 127L169 76L158 127V1088H218H279V127L270 76L292 127L384 233L439 130L218 -103z" /> <glyph glyph-name="sort-by-attributes-alt-1" unicode="sort-by-attributes-alt" horiz-adv-x="1200" d=" M602 439H999Q1023 439 1040 420.5T1057 378V310Q1057 249 999 249H602Q546 249 546 310V378Q546 439 602 439zM602 123H893Q953 123 953 69V-4Q953 -61 893 -61H602Q546 -61 546 -4V69Q546 123 602 123zM602 749H1199Q1257 749 1257 690V621Q1257 559 1199 559H602Q546 559 546 621V690Q546 749 602 749zM1371 875H602Q546 875 546 931V1003Q546 1059 602 1059H1371Q1427 1059 1427 1003V931Q1427 875 1371 875zM0 130L54 233L145 127L169 76L158 127V1088H218H279V127L270 76L292 127L384 233L439 130L218 -103z" /> <glyph glyph-name="sort-by-attributes" - unicode="" + unicode="" horiz-adv-x="1200" d=" M604 560Q548 560 548 621V689Q548 749 604 749H1000Q1058 749 1058 689V621Q1058 597 1040.5 578.5T1000 560H604zM604 874Q548 874 548 929V1003Q548 1058 604 1058H894Q954 1058 954 1003V929Q954 874 894 874H604zM604 250Q548 250 548 312V379Q548 440 604 440H1199Q1257 440 1257 379V312Q1257 250 1199 250H604zM1371 124Q1426 124 1426 70V-3Q1426 -59 1371 -59H604Q548 -59 548 -3V70Q548 124 604 124H1371zM0 130L54 233L145 127L169 76L158 127V1088H218H279V127L270 76L292 127L384 233L439 130L218 -103z" /> <glyph glyph-name="sort-by-attributes-1" unicode="sort-by-attributes" horiz-adv-x="1200" d=" M604 560Q548 560 548 621V689Q548 749 604 749H1000Q1058 749 1058 689V621Q1058 597 1040.5 578.5T1000 560H604zM604 874Q548 874 548 929V1003Q548 1058 604 1058H894Q954 1058 954 1003V929Q954 874 894 874H604zM604 250Q548 250 548 312V379Q548 440 604 440H1199Q1257 440 1257 379V312Q1257 250 1199 250H604zM1371 124Q1426 124 1426 70V-3Q1426 -59 1371 -59H604Q548 -59 548 -3V70Q548 124 604 124H1371zM0 130L54 233L145 127L169 76L158 127V1088H218H279V127L270 76L292 127L384 233L439 130L218 -103z" /> <glyph glyph-name="sort" - unicode="" + unicode="" horiz-adv-x="1200" d=" M69 79L128 191L227 75L252 21L241 75V1114H306H371V75L361 21L386 75L485 191L544 79L306 -173zM1151 862L1092 750L993 866L969 920L980 866V-173H915H850V866L860 920L836 866L737 750L677 862L915 1114z" /> <glyph glyph-name="sort-1" unicode="sort" horiz-adv-x="1200" d=" M69 79L128 191L227 75L252 21L241 75V1114H306H371V75L361 21L386 75L485 191L544 79L306 -173zM1151 862L1092 750L993 866L969 920L980 866V-173H915H850V866L860 920L836 866L737 750L677 862L915 1114z" /> <glyph glyph-name="star-empty" - unicode="" + unicode="" horiz-adv-x="1200" d=" M490 703L471 668L433 664L186 627L365 451L390 422L384 386L341 136L567 252L598 272L633 252L858 136L817 386L808 422L836 451L1016 627L767 664L730 668L710 701L598 930zM776 733L1172 678L886 397L952 3L598 190L245 3L313 398L27 678L425 738L598 1093z" /> <glyph glyph-name="star-empty-1" unicode="star-empty" horiz-adv-x="1200" d=" M490 703L471 668L433 664L186 627L365 451L390 422L384 386L341 136L567 252L598 272L633 252L858 136L817 386L808 422L836 451L1016 627L767 664L730 668L710 701L598 930zM776 733L1172 678L886 397L952 3L598 190L245 3L313 398L27 678L425 738L598 1093z" /> <glyph glyph-name="star" - unicode="" + unicode="" horiz-adv-x="1200" d=" M775 738L1179 673L887 392L956 -3L599 188L243 1L314 397L21 678L425 738L603 1098z" /> <glyph glyph-name="star-1" unicode="star" horiz-adv-x="1200" d=" M775 738L1179 673L887 392L956 -3L599 188L243 1L314 397L21 678L425 738L603 1098z" /> <glyph glyph-name="stats" - unicode="" + unicode="" horiz-adv-x="1200" d=" M516 -23Q516 -70 471 -70H414Q371 -70 371 -23V851Q371 899 414 899H471Q516 899 516 851V-23zM201 -23Q201 -70 154 -70H100Q81 -70 66.5 -55T52 -23V488Q52 507 66.5 521T100 535H154Q201 535 201 488V-23zM833 -23Q833 -70 786 -70H729Q686 -70 686 -23V670Q686 713 729 713H786Q833 713 833 670V-23zM998 978Q998 1026 1047 1026H1100Q1120 1026 1134 1011.5T1148 978V-23Q1148 -40 1134 -55T1100 -70H1047Q998 -70 998 -23V978z" /> <glyph glyph-name="stats-1" unicode="stats" horiz-adv-x="1200" d=" M516 -23Q516 -70 471 -70H414Q371 -70 371 -23V851Q371 899 414 899H471Q516 899 516 851V-23zM201 -23Q201 -70 154 -70H100Q81 -70 66.5 -55T52 -23V488Q52 507 66.5 521T100 535H154Q201 535 201 488V-23zM833 -23Q833 -70 786 -70H729Q686 -70 686 -23V670Q686 713 729 713H786Q833 713 833 670V-23zM998 978Q998 1026 1047 1026H1100Q1120 1026 1134 1011.5T1148 978V-23Q1148 -40 1134 -55T1100 -70H1047Q998 -70 998 -23V978z" /> <glyph glyph-name="step-backward" - unicode="" + unicode="" horiz-adv-x="1200" d=" M929 263Q992 212 937 158Q871 97 812 155L403 466L812 778Q832 798 872 798T937 774Q992 720 929 669L667 466zM265 875Q287 875 305 857T323 819V113Q323 90 305 73.5T265 57Q207 57 207 113V819Q207 875 265 875z" /> <glyph glyph-name="step-backward-1" unicode="step-backward" horiz-adv-x="1200" d=" M929 263Q992 212 937 158Q871 97 812 155L403 466L812 778Q832 798 872 798T937 774Q992 720 929 669L667 466zM265 875Q287 875 305 857T323 819V113Q323 90 305 73.5T265 57Q207 57 207 113V819Q207 875 265 875z" /> <glyph glyph-name="step-forward" - unicode="" + unicode="" horiz-adv-x="1200" d=" M270 671Q207 722 262 776Q328 837 387 779L796 468L387 156Q367 136 327 136T262 160Q207 214 270 265L532 468zM934 59Q912 59 894 77T876 115V821Q876 844 894 860.5T934 877Q992 877 992 821V115Q992 59 934 59z" /> <glyph glyph-name="step-forward-1" unicode="step-forward" horiz-adv-x="1200" d=" M270 671Q207 722 262 776Q328 837 387 779L796 468L387 156Q367 136 327 136T262 160Q207 214 270 265L532 468zM934 59Q912 59 894 77T876 115V821Q876 844 894 860.5T934 877Q992 877 992 821V115Q992 59 934 59z" /> <glyph glyph-name="stop" - unicode="" + unicode="" horiz-adv-x="1200" d=" M268 796H931V133H268V796z" /> <glyph glyph-name="stop-1" unicode="stop" horiz-adv-x="1200" d=" M268 796H931V133H268V796z" /> <glyph glyph-name="story-banner-section" - unicode="" + unicode="" horiz-adv-x="1200" d=" M943.0039 542.45898L711.60351 361.2285100000001L794.54101 167.71289L559.04296 361.2285100000001L78.386713 135.03711L-0.0000062500003 96.6386700000001V-120H1200V378.95312L1125.8184 429.89062z" /> <glyph glyph-name="story-banner-section-1" unicode="story-banner-section" horiz-adv-x="1200" d=" M943.0039 542.45898L711.60351 361.2285100000001L794.54101 167.71289L559.04296 361.2285100000001L78.386713 135.03711L-0.0000062500003 96.6386700000001V-120H1200V378.95312L1125.8184 429.89062z" /> <glyph glyph-name="story-carousel-section" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 1080L0 963.33398L535.39258 963.33398L535.39258 1080L0 1080zM1018.75 1080C968.9167 1080 926.33334 1062.25 891 1026.75C855.66667 991.25 838 948.83334 838 899.5C838 795.83334 898.16663 656 1018.5 480C1139.4999 656 1200 795.83334 1200 899.5C1200 948.83334 1182.2499 991.25 1146.75 1026.75C1111.2499 1062.25 1068.5833 1080 1018.75 1080zM1019.5 942C1037.5001 942 1052.9167 935.5 1065.75 922.5C1078.5833 909.49999 1085 893.91666 1085 875.75C1085 857.5833299999999 1078.3334 842.5 1065 830.5C1052.6667 817.1666700000001 1037.5001 810.5 1019.5 810.5C1001.5 810.5 986.08331 816.8333299999999 973.25 829.5C960.41668 842.16666 954 857.5833299999999 954 875.75C954 893.91666 960.41668 909.49999 973.25 922.5C986.08331 935.5 1001.5 942 1019.5 942zM0 846.66602L0 729.9980499999999L535.39258 729.9980499999999L535.39258 846.66602L0 846.66602zM0 613.33008L0 496.66211L370.00195 496.66211L370.00195 613.33008L0 613.33008zM0 180L0 -120L1200 -120L1200 180L0 180zM650 130.002L850 130.002L850 -69.998L650 -69.998L650 130.002zM950 130.002L1150 130.002L1150 -69.998L950 -69.998L950 130.002zM50 129.9980000000001L250 129.9980000000001L250 -70.0019999999999L50 -70.0019999999999L50 129.9980000000001zM350 129.9980000000001L550 129.9980000000001L550 -70.0019999999999L350 -70.0019999999999L350 129.9980000000001z" /> <glyph glyph-name="story-carousel-section-1" unicode="story-carousel-section" horiz-adv-x="1200" d=" M0 1080L0 963.33398L535.39258 963.33398L535.39258 1080L0 1080zM1018.75 1080C968.9167 1080 926.33334 1062.25 891 1026.75C855.66667 991.25 838 948.83334 838 899.5C838 795.83334 898.16663 656 1018.5 480C1139.4999 656 1200 795.83334 1200 899.5C1200 948.83334 1182.2499 991.25 1146.75 1026.75C1111.2499 1062.25 1068.5833 1080 1018.75 1080zM1019.5 942C1037.5001 942 1052.9167 935.5 1065.75 922.5C1078.5833 909.49999 1085 893.91666 1085 875.75C1085 857.5833299999999 1078.3334 842.5 1065 830.5C1052.6667 817.1666700000001 1037.5001 810.5 1019.5 810.5C1001.5 810.5 986.08331 816.8333299999999 973.25 829.5C960.41668 842.16666 954 857.5833299999999 954 875.75C954 893.91666 960.41668 909.49999 973.25 922.5C986.08331 935.5 1001.5 942 1019.5 942zM0 846.66602L0 729.9980499999999L535.39258 729.9980499999999L535.39258 846.66602L0 846.66602zM0 613.33008L0 496.66211L370.00195 496.66211L370.00195 613.33008L0 613.33008zM0 180L0 -120L1200 -120L1200 180L0 180zM650 130.002L850 130.002L850 -69.998L650 -69.998L650 130.002zM950 130.002L1150 130.002L1150 -69.998L950 -69.998L950 130.002zM50 129.9980000000001L250 129.9980000000001L250 -70.0019999999999L50 -70.0019999999999L50 129.9980000000001zM350 129.9980000000001L550 129.9980000000001L550 -70.0019999999999L350 -70.0019999999999L350 129.9980000000001z" /> <glyph glyph-name="story-immersive-content" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 1080L0 963.33398L535.39258 963.33398L535.39258 1080L0 1080zM1000.5332 1080C991.39916 1080 983.57119 1076.85738 977.04688 1070.57031C970.52255 1064.28324 967.25977 1056.63066 967.25977 1047.6152299999999L967.25977 912.38477L832.38477 912.38477C824.08109 912.38477 816.6669 909.36037 810.14258 903.31055C803.61826 897.26072 800.35547 889.60814 800.35547 880.35547C800.35547 871.1028 803.61826 863.2748300000001 810.14258 856.86914C816.6669 850.46344 824.08109 847.25977 832.38477 847.25977L967.25977 847.25977L967.25977 712.38477C967.25977 703.1320900000001 970.52255 695.4204 977.04688 689.2519500000001C983.57119 683.08351 991.39916 680 1000.5332 680C1009.6673 680 1017.4972 683.08351 1024.0215 689.2519500000001C1030.5458 695.4204 1033.8086 703.1320900000001 1033.8086 712.38477L1033.8086 847.25977L1167.6152 847.25977C1176.8679 847.25977 1184.5796 850.46344 1190.748 856.86914C1196.9165 863.2748300000001 1200 871.1028 1200 880.35547C1200 889.60814 1196.9165 897.26072 1190.748 903.31055C1184.5796 909.36037 1176.8679 912.38477 1167.6152 912.38477L1033.8086 912.38477L1033.8086 1047.6152299999999C1033.8086 1056.63066 1030.5458 1064.28324 1024.0215 1070.57031C1017.4972 1076.85738 1009.6673 1080 1000.5332 1080zM0 846.66602L0 729.9980499999999L535.39258 729.9980499999999L535.39258 846.66602L0 846.66602zM0 613.33008L0 496.66211L370.00195 496.66211L370.00195 613.33008L0 613.33008zM943.00391 542.45898L711.60352 361.22852L794.54102 167.7129L559.04297 361.22852L78.386719 135.0371L0 96.6387L0 -120L1200 -120L1200 378.95312L1125.8184 429.89062L943.00391 542.45898z" /> <glyph glyph-name="story-immersive-content-1" unicode="story-immersive-content" horiz-adv-x="1200" d=" M0 1080L0 963.33398L535.39258 963.33398L535.39258 1080L0 1080zM1000.5332 1080C991.39916 1080 983.57119 1076.85738 977.04688 1070.57031C970.52255 1064.28324 967.25977 1056.63066 967.25977 1047.6152299999999L967.25977 912.38477L832.38477 912.38477C824.08109 912.38477 816.6669 909.36037 810.14258 903.31055C803.61826 897.26072 800.35547 889.60814 800.35547 880.35547C800.35547 871.1028 803.61826 863.2748300000001 810.14258 856.86914C816.6669 850.46344 824.08109 847.25977 832.38477 847.25977L967.25977 847.25977L967.25977 712.38477C967.25977 703.1320900000001 970.52255 695.4204 977.04688 689.2519500000001C983.57119 683.08351 991.39916 680 1000.5332 680C1009.6673 680 1017.4972 683.08351 1024.0215 689.2519500000001C1030.5458 695.4204 1033.8086 703.1320900000001 1033.8086 712.38477L1033.8086 847.25977L1167.6152 847.25977C1176.8679 847.25977 1184.5796 850.46344 1190.748 856.86914C1196.9165 863.2748300000001 1200 871.1028 1200 880.35547C1200 889.60814 1196.9165 897.26072 1190.748 903.31055C1184.5796 909.36037 1176.8679 912.38477 1167.6152 912.38477L1033.8086 912.38477L1033.8086 1047.6152299999999C1033.8086 1056.63066 1030.5458 1064.28324 1024.0215 1070.57031C1017.4972 1076.85738 1009.6673 1080 1000.5332 1080zM0 846.66602L0 729.9980499999999L535.39258 729.9980499999999L535.39258 846.66602L0 846.66602zM0 613.33008L0 496.66211L370.00195 496.66211L370.00195 613.33008L0 613.33008zM943.00391 542.45898L711.60352 361.22852L794.54102 167.7129L559.04297 361.22852L78.386719 135.0371L0 96.6387L0 -120L1200 -120L1200 378.95312L1125.8184 429.89062L943.00391 542.45898z" /> <glyph glyph-name="story-immersive-section" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 1080V963.33398H535.39258V1080zM0 846.66602V729.9980499999999H535.39258V846.66602zM0 613.33008V496.66211H370.00195V613.33008zM943.00391 542.45898L711.60352 361.22852L794.54102 167.7129L559.04297 361.22852L78.386719 135.0371L0 96.6387V-120H1200V378.95312L1125.8184 429.89062z" /> <glyph glyph-name="story-immersive-section-1" unicode="story-immersive-section" horiz-adv-x="1200" d=" M0 1080V963.33398H535.39258V1080zM0 846.66602V729.9980499999999H535.39258V846.66602zM0 613.33008V496.66211H370.00195V613.33008zM943.00391 542.45898L711.60352 361.22852L794.54102 167.7129L559.04297 361.22852L78.386719 135.0371L0 96.6387V-120H1200V378.95312L1125.8184 429.89062z" /> <glyph glyph-name="story-media-section" - unicode="" + unicode="" horiz-adv-x="1200" d=" M116.00195 1077.62305L116.00195 346.6699200000001L1083.998 346.6699200000001L1083.998 1077.62305L116.00195 1077.62305zM145.73633 1047.0625L1055.0898 1047.0625L1055.0898 771.20117L876.6875 881.05078L690.02539 734.85938L756.92773 578.75781L566.96094 734.85938L145.73633 536.63477L145.73633 1047.0625zM328.68164 942.16992C305.28019 942.16992 285.04386 933.63567 267.97461 916.56641C250.90522 899.49714 242.36914 878.84645 242.36914 854.61914C242.36914 830.3917 250.90522 809.88183 267.97461 793.08789C285.04386 776.2938300000001 305.28019 767.8984399999999 328.68164 767.8984399999999C352.0831 767.8984399999999 372.04195 776.2938300000001 388.56055 793.08789C405.07929 809.88183 413.33789 830.3917 413.33789 854.61914C413.33789 878.84645 405.07929 899.77265 388.56055 917.39258C372.04195 933.91118 352.0831 942.16992 328.68164 942.16992zM0 230.00391L0 113.3359000000001L1200 113.3359000000001L1200 230.00391L0 230.00391zM0.00390625 -3.3320000000001L0.00390625 -120L915.25391 -120L915.25391 -3.3320000000001L0.00390625 -3.3320000000001z" /> <glyph glyph-name="story-media-section-1" unicode="story-media-section" horiz-adv-x="1200" d=" M116.00195 1077.62305L116.00195 346.6699200000001L1083.998 346.6699200000001L1083.998 1077.62305L116.00195 1077.62305zM145.73633 1047.0625L1055.0898 1047.0625L1055.0898 771.20117L876.6875 881.05078L690.02539 734.85938L756.92773 578.75781L566.96094 734.85938L145.73633 536.63477L145.73633 1047.0625zM328.68164 942.16992C305.28019 942.16992 285.04386 933.63567 267.97461 916.56641C250.90522 899.49714 242.36914 878.84645 242.36914 854.61914C242.36914 830.3917 250.90522 809.88183 267.97461 793.08789C285.04386 776.2938300000001 305.28019 767.8984399999999 328.68164 767.8984399999999C352.0831 767.8984399999999 372.04195 776.2938300000001 388.56055 793.08789C405.07929 809.88183 413.33789 830.3917 413.33789 854.61914C413.33789 878.84645 405.07929 899.77265 388.56055 917.39258C372.04195 933.91118 352.0831 942.16992 328.68164 942.16992zM0 230.00391L0 113.3359000000001L1200 113.3359000000001L1200 230.00391L0 230.00391zM0.00390625 -3.3320000000001L0.00390625 -120L915.25391 -120L915.25391 -3.3320000000001L0.00390625 -3.3320000000001z" /> <glyph glyph-name="story-paragraph-section" - unicode="" + unicode="" horiz-adv-x="1200" d=" M294.49233 1005.004845C256.57632 1005.004845 227.09705 995.494475 206.05464 976.474845C185.21077 957.657375 174.78823 934.591145 174.78823 907.275701C174.78823 895.5397909999999 177.27094 884.006684 182.23378 872.676053C187.39512 861.345106 194.93856 850.21473 204.86421 839.2884300000001C186.00545 828.36229 172.10773 814.40053 163.17464 797.40411C154.24154 780.40768 149.77696 761.99754 149.77696 742.16846C149.77696 718.09047 156.62595 696.33903 170.32336 676.91459C184.02077 657.49017 213.50005 633.00532 258.76106 603.46385C304.22059 574.12504 330.71936 555.71173 338.26284 548.22522C345.60784 540.7386799999999 349.28275 532.2415 349.28275 522.73161C349.28275 512.81708 345.41118 504.42026 337.66918 497.54085C329.92715 490.45898 319.50462 486.91992 306.40277 486.91992C291.11724 486.91992 278.4117100000001 491.57284 268.28753 500.88027C258.36187 509.9855299999999 251.61429 523.6420499999999 248.04106 541.85256L166.45216 531.8375C170.81946 498.45178 184.91383 471.74249 208.73542 451.7111C232.55701 431.67971 264.31925 421.66305 304.02191 421.66305C345.31265 421.66305 376.97351 431.78022 399.00847 452.0141C421.04344 472.24782 432.06208 497.34011 432.06208 527.2860499999999C432.06208 541.6521399999999 429.08464 555.20799 423.12925 567.95534C417.17385 580.90486 408.14016 593.0450900000001 396.03086 604.3760500000001C414.09556 617.32556 427.5938300000001 631.6902299999999 436.52694 647.4725599999999C445.65856 663.45736 450.22453 680.86064 450.22453 699.67796C450.22453 717.2815 446.45439 733.26316 438.91087 747.62893C431.5659 762.19718 419.25674 776.86675 401.98608 791.63748C390.86935 801.34969 368.04243 817.5388800000001 333.50113 840.20063C298.95984 862.862358 278.60947 877.226859 272.45558 883.297135C263.32395 892.40223 258.76106 901.912442 258.76106 911.827137C258.76106 919.111187 262.13484 925.585782 268.8843 931.251105C275.63374 937.118905 285.46016 940.053985 298.3635300000001 940.053985C312.25944 940.053985 323.07835 936.109035 330.82035 928.21786C338.76088 920.326697 343.12714 908.894275 343.9212 893.921223L425.80693 902.721099C421.8366700000001 933.071675 408.63647 957.657375 386.20446 976.474845C363.971 995.494475 333.40094 1005.004845 294.49233 1005.004845zM599.99844 1005.004845V888.337122H1199.9969V1005.004845zM251.31549 800.1375L332.60755 740.04425C353.0544 724.86904 365.56019 713.73866 370.126 706.65664C374.69181 699.57507 376.97481 692.69471 376.97481 686.01748C376.97481 679.13792 374.79014 671.9556600000001 370.42283 664.4693C366.25405 657.1850999999999 359.8014 649.4962499999999 351.06686 641.40292L265.9066900000001 700.58714C239.10741 718.99966 225.70746 738.42299 225.70746 758.85918C225.70746 767.35732 228.2885 775.35123 233.44985 782.8376000000001C238.61119 790.32412 244.56605 796.0906 251.31549 800.1375zM599.99844 771.66923V655.00151H1199.9969V771.66923zM599.99844 538.3337799999999V421.6660500000001H1199.9969V538.3337799999999zM-0.00003075 304.99834V188.33061H1200V304.99834zM0.00305625 71.6628799999999V-45.0048000000002L915.25424 -45.0048000000002V71.6628799999999z" /> <glyph glyph-name="story-paragraph-section-1" unicode="story-paragraph-section" horiz-adv-x="1200" d=" M294.49233 1005.004845C256.57632 1005.004845 227.09705 995.494475 206.05464 976.474845C185.21077 957.657375 174.78823 934.591145 174.78823 907.275701C174.78823 895.5397909999999 177.27094 884.006684 182.23378 872.676053C187.39512 861.345106 194.93856 850.21473 204.86421 839.2884300000001C186.00545 828.36229 172.10773 814.40053 163.17464 797.40411C154.24154 780.40768 149.77696 761.99754 149.77696 742.16846C149.77696 718.09047 156.62595 696.33903 170.32336 676.91459C184.02077 657.49017 213.50005 633.00532 258.76106 603.46385C304.22059 574.12504 330.71936 555.71173 338.26284 548.22522C345.60784 540.7386799999999 349.28275 532.2415 349.28275 522.73161C349.28275 512.81708 345.41118 504.42026 337.66918 497.54085C329.92715 490.45898 319.50462 486.91992 306.40277 486.91992C291.11724 486.91992 278.4117100000001 491.57284 268.28753 500.88027C258.36187 509.9855299999999 251.61429 523.6420499999999 248.04106 541.85256L166.45216 531.8375C170.81946 498.45178 184.91383 471.74249 208.73542 451.7111C232.55701 431.67971 264.31925 421.66305 304.02191 421.66305C345.31265 421.66305 376.97351 431.78022 399.00847 452.0141C421.04344 472.24782 432.06208 497.34011 432.06208 527.2860499999999C432.06208 541.6521399999999 429.08464 555.20799 423.12925 567.95534C417.17385 580.90486 408.14016 593.0450900000001 396.03086 604.3760500000001C414.09556 617.32556 427.5938300000001 631.6902299999999 436.52694 647.4725599999999C445.65856 663.45736 450.22453 680.86064 450.22453 699.67796C450.22453 717.2815 446.45439 733.26316 438.91087 747.62893C431.5659 762.19718 419.25674 776.86675 401.98608 791.63748C390.86935 801.34969 368.04243 817.5388800000001 333.50113 840.20063C298.95984 862.862358 278.60947 877.226859 272.45558 883.297135C263.32395 892.40223 258.76106 901.912442 258.76106 911.827137C258.76106 919.111187 262.13484 925.585782 268.8843 931.251105C275.63374 937.118905 285.46016 940.053985 298.3635300000001 940.053985C312.25944 940.053985 323.07835 936.109035 330.82035 928.21786C338.76088 920.326697 343.12714 908.894275 343.9212 893.921223L425.80693 902.721099C421.8366700000001 933.071675 408.63647 957.657375 386.20446 976.474845C363.971 995.494475 333.40094 1005.004845 294.49233 1005.004845zM599.99844 1005.004845V888.337122H1199.9969V1005.004845zM251.31549 800.1375L332.60755 740.04425C353.0544 724.86904 365.56019 713.73866 370.126 706.65664C374.69181 699.57507 376.97481 692.69471 376.97481 686.01748C376.97481 679.13792 374.79014 671.9556600000001 370.42283 664.4693C366.25405 657.1850999999999 359.8014 649.4962499999999 351.06686 641.40292L265.9066900000001 700.58714C239.10741 718.99966 225.70746 738.42299 225.70746 758.85918C225.70746 767.35732 228.2885 775.35123 233.44985 782.8376000000001C238.61119 790.32412 244.56605 796.0906 251.31549 800.1375zM599.99844 771.66923V655.00151H1199.9969V771.66923zM599.99844 538.3337799999999V421.6660500000001H1199.9969V538.3337799999999zM-0.00003075 304.99834V188.33061H1200V304.99834zM0.00305625 71.6628799999999V-45.0048000000002L915.25424 -45.0048000000002V71.6628799999999z" /> <glyph glyph-name="story-title-section" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 1080L0 966.86719L59.919922 966.86719L64.837891 1025.4472700000001L178.86523 1025.4472700000001L178.86523 622.10742L120.73438 611.82227L120.73438 568L305.41211 568L305.41211 611.82227L248.17383 622.10742L248.17383 1025.4472700000001L361.75391 1025.4472700000001L367.11914 966.86719L426.14453 966.86719L426.14453 1080L0 1080zM540.70508 1080L540.70508 963.33203L1200 963.33203L1200 1080L540.70508 1080zM540.70508 846.6640600000001L540.70508 729.99609L1020.2031 729.99609L1020.2031 846.6640600000001L540.70508 846.6640600000001zM943.00391 542.45898L711.60352 361.22852L794.54102 167.7129L559.04297 361.22852L78.386719 135.0371L0 96.6387L0 -120L1200 -120L1200 378.95312L1125.8184 429.89062L943.00391 542.45898z" /> <glyph glyph-name="story-title-section-1" unicode="story-title-section" horiz-adv-x="1200" d=" M0 1080L0 966.86719L59.919922 966.86719L64.837891 1025.4472700000001L178.86523 1025.4472700000001L178.86523 622.10742L120.73438 611.82227L120.73438 568L305.41211 568L305.41211 611.82227L248.17383 622.10742L248.17383 1025.4472700000001L361.75391 1025.4472700000001L367.11914 966.86719L426.14453 966.86719L426.14453 1080L0 1080zM540.70508 1080L540.70508 963.33203L1200 963.33203L1200 1080L540.70508 1080zM540.70508 846.6640600000001L540.70508 729.99609L1020.2031 729.99609L1020.2031 846.6640600000001L540.70508 846.6640600000001zM943.00391 542.45898L711.60352 361.22852L794.54102 167.7129L559.04297 361.22852L78.386719 135.0371L0 96.6387L0 -120L1200 -120L1200 378.95312L1125.8184 429.89062L943.00391 542.45898z" /> <glyph glyph-name="story-webpage-section" - unicode="" + unicode="" horiz-adv-x="1200" d=" M116.00195 1078.81055L116.00195 347.8574200000001L1083.998 347.8574200000001L1083.998 1078.81055L116.00195 1078.81055zM144.54297 1048.25L145.73633 1048.25L1055.0898 1048.25L1055.0898 772.38867L1055.0898 377.54297L144.54297 377.54297L144.54297 1048.25zM656.10742 975.53711C649.8116 975.53711 643.97739 974.05454 638.60742 971.0918C633.23746 968.12906 628.79364 964.05589 625.27539 958.87109C621.75714 953.6863 619.81371 947.94621 619.44336 941.65039C612.40685 909.06026 581.11191 761.66337 525.56055 499.4609400000001C524.07917 495.75751 523.33984 491.86869 523.33984 487.79492C523.33984 481.1287600000001 525.00481 475.01802 528.33789 469.46289C531.67098 463.90775 536.11673 459.46394 541.67188 456.13086C547.22702 452.79778 553.33775 451.13086 560.00391 451.13086C564.81836 451.13086 569.44652 452.0564900000001 573.89062 453.9082C578.33474 455.75992 582.22356 458.35247 585.55664 461.68555C588.88972 465.01863 591.48227 468.90746 593.33398 473.3515599999999C595.1857 477.7956799999999 596.29568 482.42578 596.66602 487.24023L689.4375 923.87305C691.28921 928.6875 692.40114 933.68825 692.77148 938.87305C692.77148 948.87229 689.15917 957.48146 681.9375 964.70312C674.71582 971.9248 666.10667 975.53711 656.10742 975.53711zM632.2207 911.09766C633.33173 910.35697 634.34954 909.61569 635.27539 908.875C636.20124 908.13432 637.21904 907.57933 638.33008 907.20898C637.21904 907.57933 636.10907 908.13432 634.99805 908.875C634.25737 909.61569 633.33173 910.35697 632.2207 911.09766zM461.67773 864.43359C456.86328 864.43359 451.1232 862.58233 444.45703 858.87891L433.3457 850.54492C361.49928 793.88253 314.28035 756.6631600000001 291.68945 738.88672C282.06055 734.81295 275.02418 727.6844100000001 270.58008 717.5C266.13596 707.31558 265.21033 696.85321 267.80273 686.11328C270.39513 675.37335 276.13522 667.41136 285.02344 662.22656C297.61508 653.33834 315.30011 639.91278 338.07617 621.95117C360.85223 603.98957 373.9052 593.52719 377.23828 590.56445C382.05273 586.86103 388.90475 581.58376 397.7929700000001 574.73242C406.68119 567.88109 414.64318 561.58601 421.67969 555.8457C428.71619 550.1054 435.38191 544.64378 441.67773 539.45898C452.04732 532.05214 463.62162 530.47739 476.39844 534.73633C489.17525 538.99527 497.60006 547.04943 501.67383 558.90039C505.37725 568.52929 505.09878 578.43667 500.83984 588.62109C496.72279 598.46622 490.09026 605.44719 480.95508 609.58203L473.34375 615.56445C469.26998 618.52719 466.86177 620.37846 466.12109 621.11914C453.89979 630.00736 436.12259 643.15445 412.79102 660.56055C389.45944 677.96664 372.60982 690.55874 362.24023 698.3359399999999C368.90639 703.15039 386.40513 716.20336 414.73633 737.4980499999999C443.06752 758.79273 464.82573 775.1814899999999 480.00977 786.66211C492.60141 791.8469 500.28493 801.84646 503.0625 816.66016C505.84007 831.4738600000001 502.04537 843.50902 491.67578 852.76758C483.89859 860.54477 474.63837 864.2492500000001 463.89844 863.87891C463.15775 864.2492500000001 462.41841 864.43359 461.67773 864.43359zM738.32227 864.43359C737.58158 864.43359 736.84224 864.2492500000001 736.10156 863.87891C725.36163 864.2492500000001 716.10141 860.54477 708.32422 852.76758C697.95463 843.50902 694.15993 831.4738600000001 696.9375 816.66016C699.71507 801.84646 707.39859 791.8469 719.99023 786.66211C735.17427 775.1814899999999 756.93248 758.79273 785.26367 737.4980499999999C813.59487 716.20336 831.09361 703.15039 837.75977 698.3359399999999C827.39018 690.55874 810.54056 677.96664 787.20898 660.56055C763.87741 643.15445 746.10021 630.00736 733.87891 621.11914L726.65625 615.56445C723.32317 613.34239 721.28755 611.85982 720.54688 611.11914C719.41006 610.1718 718.80883 609.61524 718.73828 609.44336C709.7608 605.29161 703.2292 598.35608 699.1582 588.62109C694.89926 578.43667 694.62275 568.52929 698.32617 558.90039C702.39994 547.04943 710.82475 538.99527 723.60156 534.73633C736.37838 530.47739 747.95268 532.05214 758.32227 539.45898C764.61809 544.64378 771.28381 550.1054 778.32031 555.8457C785.35682 561.58601 793.31881 567.88109 802.20703 574.73242C811.09525 581.58376 817.94727 586.86103 822.76172 590.56445C829.79823 596.48993 839.33301 604.26758 851.36914 613.89648C863.40527 623.52538 874.60893 632.32084 884.97852 640.2832C895.3481 648.24557 905.34766 655.5604 914.97656 662.22656C923.86478 667.41136 929.60487 675.37335 932.19727 686.11328C934.78967 696.85321 933.86404 707.31558 929.41992 717.5C924.97582 727.6844100000001 917.93945 734.81295 908.31055 738.88672C891.2748 752.2190499999999 844.05586 789.43842 766.6543 850.54492C756.65505 859.43314 747.21049 864.0632499999999 738.32227 864.43359zM424.45703 831.6582000000001C424.08669 829.8064899999999 423.90234 827.76892 423.90234 825.54688L423.90234 827.76953L423.90234 829.9921899999999L424.45703 831.6582000000001zM775.54297 831.6582000000001L776.09766 829.9921899999999L776.09766 827.76953L776.09766 825.54688C776.09766 827.76893 775.91332 829.8064899999999 775.54297 831.6582000000001zM423.90234 820.54883L424.45703 816.66016L425.01367 812.77148L426.67969 808.8828100000001L428.3457 805.54883L427.79102 805.54883C427.42067 806.2895100000001 427.05003 807.4014500000001 426.67969 808.8828100000001L426.125 809.4375L425.01367 812.77148C424.64333 814.6232 424.45703 815.91948 424.45703 816.66016C424.08669 818.14153 423.90234 819.4377999999999 423.90234 820.54883zM776.09766 820.54883C776.09766 819.4377999999999 775.91332 818.14153 775.54297 816.66016C775.54297 815.91948 775.35667 814.6232 774.98633 812.77148L773.875 809.4375L773.32031 808.8828100000001C772.94997 807.4014500000001 772.57933 806.2895100000001 772.20898 805.54883L771.6543 805.54883L773.32031 808.8828100000001L774.98633 812.77148L775.54297 816.66016L776.09766 820.54883zM448.3457 786.66211C450.19742 785.92142 452.41933 785.1801399999999 455.01172 784.4394500000001C453.53035 784.8098 452.60276 784.99609 452.23242 784.99609C451.12139 785.36643 449.82707 785.92142 448.3457 786.66211zM751.6543 786.66211C750.17292 785.92142 748.87665 785.36643 747.76562 784.99609C747.3953 784.99609 746.46965 784.8098 744.98828 784.4394500000001C747.58068 785.1801399999999 749.80258 785.92142 751.6543 786.66211zM577.7793 519.45898C578.89032 519.08864 579.81595 518.53365 580.55664 517.79297C579.44561 518.53365 578.51998 519.08864 577.7793 519.45898zM0 231.19141L0 114.5234000000001L1200 114.5234000000001L1200 231.19141L0 231.19141zM0.00390625 -2.1425999999999L0.00390625 -118.8105L915.25391 -118.8105L915.25391 -2.1425999999999L0.00390625 -2.1425999999999z" /> <glyph glyph-name="story-webpage-section-1" unicode="story-webpage-section" horiz-adv-x="1200" d=" M116.00195 1078.81055L116.00195 347.8574200000001L1083.998 347.8574200000001L1083.998 1078.81055L116.00195 1078.81055zM144.54297 1048.25L145.73633 1048.25L1055.0898 1048.25L1055.0898 772.38867L1055.0898 377.54297L144.54297 377.54297L144.54297 1048.25zM656.10742 975.53711C649.8116 975.53711 643.97739 974.05454 638.60742 971.0918C633.23746 968.12906 628.79364 964.05589 625.27539 958.87109C621.75714 953.6863 619.81371 947.94621 619.44336 941.65039C612.40685 909.06026 581.11191 761.66337 525.56055 499.4609400000001C524.07917 495.75751 523.33984 491.86869 523.33984 487.79492C523.33984 481.1287600000001 525.00481 475.01802 528.33789 469.46289C531.67098 463.90775 536.11673 459.46394 541.67188 456.13086C547.22702 452.79778 553.33775 451.13086 560.00391 451.13086C564.81836 451.13086 569.44652 452.0564900000001 573.89062 453.9082C578.33474 455.75992 582.22356 458.35247 585.55664 461.68555C588.88972 465.01863 591.48227 468.90746 593.33398 473.3515599999999C595.1857 477.7956799999999 596.29568 482.42578 596.66602 487.24023L689.4375 923.87305C691.28921 928.6875 692.40114 933.68825 692.77148 938.87305C692.77148 948.87229 689.15917 957.48146 681.9375 964.70312C674.71582 971.9248 666.10667 975.53711 656.10742 975.53711zM632.2207 911.09766C633.33173 910.35697 634.34954 909.61569 635.27539 908.875C636.20124 908.13432 637.21904 907.57933 638.33008 907.20898C637.21904 907.57933 636.10907 908.13432 634.99805 908.875C634.25737 909.61569 633.33173 910.35697 632.2207 911.09766zM461.67773 864.43359C456.86328 864.43359 451.1232 862.58233 444.45703 858.87891L433.3457 850.54492C361.49928 793.88253 314.28035 756.6631600000001 291.68945 738.88672C282.06055 734.81295 275.02418 727.6844100000001 270.58008 717.5C266.13596 707.31558 265.21033 696.85321 267.80273 686.11328C270.39513 675.37335 276.13522 667.41136 285.02344 662.22656C297.61508 653.33834 315.30011 639.91278 338.07617 621.95117C360.85223 603.98957 373.9052 593.52719 377.23828 590.56445C382.05273 586.86103 388.90475 581.58376 397.7929700000001 574.73242C406.68119 567.88109 414.64318 561.58601 421.67969 555.8457C428.71619 550.1054 435.38191 544.64378 441.67773 539.45898C452.04732 532.05214 463.62162 530.47739 476.39844 534.73633C489.17525 538.99527 497.60006 547.04943 501.67383 558.90039C505.37725 568.52929 505.09878 578.43667 500.83984 588.62109C496.72279 598.46622 490.09026 605.44719 480.95508 609.58203L473.34375 615.56445C469.26998 618.52719 466.86177 620.37846 466.12109 621.11914C453.89979 630.00736 436.12259 643.15445 412.79102 660.56055C389.45944 677.96664 372.60982 690.55874 362.24023 698.3359399999999C368.90639 703.15039 386.40513 716.20336 414.73633 737.4980499999999C443.06752 758.79273 464.82573 775.1814899999999 480.00977 786.66211C492.60141 791.8469 500.28493 801.84646 503.0625 816.66016C505.84007 831.4738600000001 502.04537 843.50902 491.67578 852.76758C483.89859 860.54477 474.63837 864.2492500000001 463.89844 863.87891C463.15775 864.2492500000001 462.41841 864.43359 461.67773 864.43359zM738.32227 864.43359C737.58158 864.43359 736.84224 864.2492500000001 736.10156 863.87891C725.36163 864.2492500000001 716.10141 860.54477 708.32422 852.76758C697.95463 843.50902 694.15993 831.4738600000001 696.9375 816.66016C699.71507 801.84646 707.39859 791.8469 719.99023 786.66211C735.17427 775.1814899999999 756.93248 758.79273 785.26367 737.4980499999999C813.59487 716.20336 831.09361 703.15039 837.75977 698.3359399999999C827.39018 690.55874 810.54056 677.96664 787.20898 660.56055C763.87741 643.15445 746.10021 630.00736 733.87891 621.11914L726.65625 615.56445C723.32317 613.34239 721.28755 611.85982 720.54688 611.11914C719.41006 610.1718 718.80883 609.61524 718.73828 609.44336C709.7608 605.29161 703.2292 598.35608 699.1582 588.62109C694.89926 578.43667 694.62275 568.52929 698.32617 558.90039C702.39994 547.04943 710.82475 538.99527 723.60156 534.73633C736.37838 530.47739 747.95268 532.05214 758.32227 539.45898C764.61809 544.64378 771.28381 550.1054 778.32031 555.8457C785.35682 561.58601 793.31881 567.88109 802.20703 574.73242C811.09525 581.58376 817.94727 586.86103 822.76172 590.56445C829.79823 596.48993 839.33301 604.26758 851.36914 613.89648C863.40527 623.52538 874.60893 632.32084 884.97852 640.2832C895.3481 648.24557 905.34766 655.5604 914.97656 662.22656C923.86478 667.41136 929.60487 675.37335 932.19727 686.11328C934.78967 696.85321 933.86404 707.31558 929.41992 717.5C924.97582 727.6844100000001 917.93945 734.81295 908.31055 738.88672C891.2748 752.2190499999999 844.05586 789.43842 766.6543 850.54492C756.65505 859.43314 747.21049 864.0632499999999 738.32227 864.43359zM424.45703 831.6582000000001C424.08669 829.8064899999999 423.90234 827.76892 423.90234 825.54688L423.90234 827.76953L423.90234 829.9921899999999L424.45703 831.6582000000001zM775.54297 831.6582000000001L776.09766 829.9921899999999L776.09766 827.76953L776.09766 825.54688C776.09766 827.76893 775.91332 829.8064899999999 775.54297 831.6582000000001zM423.90234 820.54883L424.45703 816.66016L425.01367 812.77148L426.67969 808.8828100000001L428.3457 805.54883L427.79102 805.54883C427.42067 806.2895100000001 427.05003 807.4014500000001 426.67969 808.8828100000001L426.125 809.4375L425.01367 812.77148C424.64333 814.6232 424.45703 815.91948 424.45703 816.66016C424.08669 818.14153 423.90234 819.4377999999999 423.90234 820.54883zM776.09766 820.54883C776.09766 819.4377999999999 775.91332 818.14153 775.54297 816.66016C775.54297 815.91948 775.35667 814.6232 774.98633 812.77148L773.875 809.4375L773.32031 808.8828100000001C772.94997 807.4014500000001 772.57933 806.2895100000001 772.20898 805.54883L771.6543 805.54883L773.32031 808.8828100000001L774.98633 812.77148L775.54297 816.66016L776.09766 820.54883zM448.3457 786.66211C450.19742 785.92142 452.41933 785.1801399999999 455.01172 784.4394500000001C453.53035 784.8098 452.60276 784.99609 452.23242 784.99609C451.12139 785.36643 449.82707 785.92142 448.3457 786.66211zM751.6543 786.66211C750.17292 785.92142 748.87665 785.36643 747.76562 784.99609C747.3953 784.99609 746.46965 784.8098 744.98828 784.4394500000001C747.58068 785.1801399999999 749.80258 785.92142 751.6543 786.66211zM577.7793 519.45898C578.89032 519.08864 579.81595 518.53365 580.55664 517.79297C579.44561 518.53365 578.51998 519.08864 577.7793 519.45898zM0 231.19141L0 114.5234000000001L1200 114.5234000000001L1200 231.19141L0 231.19141zM0.00390625 -2.1425999999999L0.00390625 -118.8105L915.25391 -118.8105L915.25391 -2.1425999999999L0.00390625 -2.1425999999999z" /> <glyph glyph-name="tag" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1060 852L1038 465L525 -49L140 335L656 848zM909 625Q961 674 909 721Q891 741 863.5 741T818 721Q770 674 818 625Q864 577 909 625z" /> <glyph glyph-name="tag-1" unicode="tag" horiz-adv-x="1200" d=" M1060 852L1038 465L525 -49L140 335L656 848zM909 625Q961 674 909 721Q891 741 863.5 741T818 721Q770 674 818 625Q864 577 909 625z" /> <glyph glyph-name="tags" - unicode="" + unicode="" horiz-adv-x="1205" d=" M165 391L113 446L630 962L1040 966L1032 880L686 877H652L629 854zM1069 408L557 -106L165 280L686 797L1092 802zM839 567Q894 511 951.5 566.5T952 677Q894 733 839 677Q815 657 815 625T839 567z" /> <glyph glyph-name="tags-1" unicode="tags" horiz-adv-x="1205" d=" M165 391L113 446L630 962L1040 966L1032 880L686 877H652L629 854zM1069 408L557 -106L165 280L686 797L1092 802zM839 567Q894 511 951.5 566.5T952 677Q894 733 839 677Q815 657 815 625T839 567z" /> <glyph glyph-name="tasks" - unicode="" + unicode="" horiz-adv-x="1220" d=" M110 1026H1110Q1151 1026 1180.5 996.5T1210 926V826Q1210 785 1180.5 755.5T1110 726H110Q69 726 39.5 755.5T10 826V926Q10 967 39.5 996.5T110 1026zM1110 926H910V826H1110V926zM110 626H1110Q1151 626 1180.5 596.5T1210 526V426Q1210 385 1180.5 355.5T1110 326H110Q69 326 39.5 355.5T10 426V526Q10 567 39.5 596.5T110 626zM1110 526H610V426H1110V526zM110 226H1110Q1151 226 1180.5 196.5T1210 126V26Q1210 -15 1180.5 -44.5T1110 -74H110Q69 -74 39.5 -44.5T10 26V126Q10 167 39.5 196.5T110 226zM1110 126H810V26H1110V126z" /> <glyph glyph-name="tasks-1" unicode="tasks" horiz-adv-x="1220" d=" M110 1026H1110Q1151 1026 1180.5 996.5T1210 926V826Q1210 785 1180.5 755.5T1110 726H110Q69 726 39.5 755.5T10 826V926Q10 967 39.5 996.5T110 1026zM1110 926H910V826H1110V926zM110 626H1110Q1151 626 1180.5 596.5T1210 526V426Q1210 385 1180.5 355.5T1110 326H110Q69 326 39.5 355.5T10 426V526Q10 567 39.5 596.5T110 626zM1110 526H610V426H1110V526zM110 226H1110Q1151 226 1180.5 196.5T1210 126V26Q1210 -15 1180.5 -44.5T1110 -74H110Q69 -74 39.5 -44.5T10 26V126Q10 167 39.5 196.5T110 226zM1110 126H810V26H1110V126z" /> <glyph glyph-name="text-background" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1200 1131V-67H0V1131H1200zM952 943H242V729H361L368 819H516V254L432 239V140H762V239L679 254V819H821L828 729H952V943z" /> <glyph glyph-name="text-background-1" unicode="text-background" horiz-adv-x="1200" d=" M1200 1131V-67H0V1131H1200zM952 943H242V729H361L368 819H516V254L432 239V140H762V239L679 254V819H821L828 729H952V943z" /> <glyph glyph-name="text-colour" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1103 -62H98Q49 -62 49 -16Q49 37 98 37H1103Q1150 37 1150 -16Q1150 -62 1103 -62zM1008 1099V884H895L885 995H669V227L778 207V124H426V207L537 227V995H319L310 884H196V1099H1008z" /> <glyph glyph-name="text-colour-1" unicode="text-colour" horiz-adv-x="1200" d=" M1103 -62H98Q49 -62 49 -16Q49 37 98 37H1103Q1150 37 1150 -16Q1150 -62 1103 -62zM1008 1099V884H895L885 995H669V227L778 207V124H426V207L537 227V995H319L310 884H196V1099H1008z" /> <glyph glyph-name="text-height" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1276 -186L1100 10Q1088 21 1088 40Q1088 53 1104 70Q1136 90 1164 65L1226 -4V891L1164 821Q1136 795 1104 817Q1088 832 1088 848Q1088 866 1100 875L1276 1071L1454 875Q1484 848 1454 817Q1417 788 1390 821L1318 899V-14L1390 65Q1417 97 1454 70Q1484 40 1454 10zM953 1020V767H821L809 898H555V-4L683 -27V-125H270V-27L400 -4V898H145L134 767H0V1020H953z" /> <glyph glyph-name="text-height-1" unicode="text-height" horiz-adv-x="1200" d=" M1276 -186L1100 10Q1088 21 1088 40Q1088 53 1104 70Q1136 90 1164 65L1226 -4V891L1164 821Q1136 795 1104 817Q1088 832 1088 848Q1088 866 1100 875L1276 1071L1454 875Q1484 848 1454 817Q1417 788 1390 821L1318 899V-14L1390 65Q1417 97 1454 70Q1484 40 1454 10zM953 1020V767H821L809 898H555V-4L683 -27V-125H270V-27L400 -4V898H145L134 767H0V1020H953z" /> <glyph glyph-name="text-width" - unicode="" + unicode="" horiz-adv-x="1200" d=" M968 113Q945 141 922 111Q896 86 926 62L990 -1H214L280 62Q309 86 284 111Q259 141 234 113L65 -37L234 -190Q244 -195 259 -195Q270 -195 284 -184Q306 -155 280 -131L223 -77H980L926 -131Q902 -155 922 -184Q933 -195 945 -195Q961 -195 968 -190L1135 -37zM993 1043V835H885L875 942H667V204L772 186V106H434V186L540 204V942H331L323 835H213V1043H993z" /> <glyph glyph-name="text-width-1" unicode="text-width" horiz-adv-x="1200" d=" M968 113Q945 141 922 111Q896 86 926 62L990 -1H214L280 62Q309 86 284 111Q259 141 234 113L65 -37L234 -190Q244 -195 259 -195Q270 -195 284 -184Q306 -155 280 -131L223 -77H980L926 -131Q902 -155 922 -184Q933 -195 945 -195Q961 -195 968 -190L1135 -37zM993 1043V835H885L875 942H667V204L772 186V106H434V186L540 204V942H331L323 835H213V1043H993z" /> <glyph glyph-name="th-large" - unicode="" + unicode="" horiz-adv-x="1200" d=" M48 1022H559V516H48V1022zM641 1022H1151V516H641V1022zM48 438H559V-70H48V438zM641 438H1151V-70H641V438z" /> <glyph glyph-name="th-large-1" unicode="th-large" horiz-adv-x="1200" d=" M48 1022H559V516H48V1022zM641 1022H1151V516H641V1022zM48 438H559V-70H48V438zM641 438H1151V-70H641V438z" /> <glyph glyph-name="th-list" - unicode="" + unicode="" horiz-adv-x="1200" d=" M42 972H156V860H42V972zM331 972H1157V860H331V972zM42 674H156V560H42V674zM331 674H1157V560H331V674zM42 374H156V260H42V374zM331 374H1157V260H331V374zM42 73H156V-39H42V73zM331 73H1157V-39H331V73z" /> <glyph glyph-name="th-list-1" unicode="th-list" horiz-adv-x="1200" d=" M42 972H156V860H42V972zM331 972H1157V860H331V972zM42 674H156V560H42V674zM331 674H1157V560H331V674zM42 374H156V260H42V374zM331 374H1157V260H331V374zM42 73H156V-39H42V73zM331 73H1157V-39H331V73z" /> <glyph glyph-name="th" - unicode="" + unicode="" horiz-adv-x="1200" d=" M35 1022H556V726H35V1022zM644 1022H1165V726H644V1022zM35 626H556V330H35V626zM644 626H1165V330H644V626zM35 227H556V-65H35V227zM644 227H1165V-65H644V227z" /> <glyph glyph-name="th-1" unicode="th" horiz-adv-x="1200" d=" M35 1022H556V726H35V1022zM644 1022H1165V726H644V1022zM35 626H556V330H35V626zM644 626H1165V330H644V626zM35 227H556V-65H35V227zM644 227H1165V-65H644V227z" /> <glyph glyph-name="thumbs-down" - unicode="" + unicode="" horiz-adv-x="1200" d=" M35 899H241V279H35V899zM1165 330Q1165 286 1137 258.5T1065 231H742L793 -8V-26Q793 -39 771 -81L714 -133L373 207Q341 239 341 279V796Q341 840 371.5 869.5T448 899H912Q973 899 1005 840L1158 471Q1162 461 1162 436V330H1165z" /> <glyph glyph-name="thumbs-down-1" unicode="thumbs-down" horiz-adv-x="1200" d=" M35 899H241V279H35V899zM1165 330Q1165 286 1137 258.5T1065 231H742L793 -8V-26Q793 -39 771 -81L714 -133L373 207Q341 239 341 279V796Q341 840 371.5 869.5T448 899H912Q973 899 1005 840L1158 471Q1162 461 1162 436V330H1165z" /> <glyph glyph-name="thumbs-up" - unicode="" + unicode="" horiz-adv-x="1200" d=" M35 628H241V8H35V628zM1162 579V471Q1162 444 1158 435L1005 74Q973 8 912 8H448Q402 8 371.5 37T341 112V628Q341 678 373 701L714 1042L771 990Q793 945 793 932V918L742 678H1065Q1109 678 1137 649T1165 579H1162z" /> <glyph glyph-name="thumbs-up-1" unicode="thumbs-up" horiz-adv-x="1200" d=" M35 628H241V8H35V628zM1162 579V471Q1162 444 1158 435L1005 74Q973 8 912 8H448Q402 8 371.5 37T341 112V628Q341 678 373 701L714 1042L771 990Q793 945 793 932V918L742 678H1065Q1109 678 1137 649T1165 579H1162z" /> <glyph glyph-name="time-current" - unicode="" + unicode="" horiz-adv-x="1200" d=" M536 1080H264V1080L536 808V152L264 -120V-120H536H265L536 152V808L265 1080H536V1080zM664 -120H936V-120L664 152V808L936 1080V1080H664H935L664 808V152L935 -120H664V-120zM536 1080H664H936L664 808V152L936 -120H664H536H264L536 152V808L264 1080H536z" /> <glyph glyph-name="time-current-1" unicode="time-current" horiz-adv-x="1200" d=" M536 1080H264V1080L536 808V152L264 -120V-120H536H265L536 152V808L265 1080H536V1080zM664 -120H936V-120L664 152V808L936 1080V1080H664H935L664 808V152L935 -120H664V-120zM536 1080H664H936L664 808V152L936 -120H664H536H264L536 152V808L264 1080H536z" /> <glyph glyph-name="time-offset" - unicode="" + unicode="" horiz-adv-x="1200" d=" M128 -120H400V-120L128 152V808L400 1080V1080H128H399L128 808V152L399 -120H128zM128 1080H0V-120H128H0V1080H128zM1072 -120H1200V1080H1072H1200V-120H1072zM1072 1080H800V1080L1072 808V152L800 -120V-120H1072H801L1072 152V808L801 1080H1072zM1072 -120H1200V1080H1072H1200V-120H1072zM1072 1080H800V1080L1072 808V152L800 -120V-120H1072H801L1072 152V808L801 1080H1072zM0 1080H128H400L128 808V152L400 -120H128H0V1080zM1072 1080H1200V-120H1072H800L1072 152V808L800 1080H1072z" /> <glyph glyph-name="time-offset-1" unicode="time-offset" horiz-adv-x="1200" d=" M128 -120H400V-120L128 152V808L400 1080V1080H128H399L128 808V152L399 -120H128zM128 1080H0V-120H128H0V1080H128zM1072 -120H1200V1080H1072H1200V-120H1072zM1072 1080H800V1080L1072 808V152L800 -120V-120H1072H801L1072 152V808L801 1080H1072zM1072 -120H1200V1080H1072H1200V-120H1072zM1072 1080H800V1080L1072 808V152L800 -120V-120H1072H801L1072 152V808L801 1080H1072zM0 1080H128H400L128 808V152L400 -120H128H0V1080zM1072 1080H1200V-120H1072H800L1072 152V808L800 1080H1072z" /> <glyph glyph-name="time" - unicode="" + unicode="" horiz-adv-x="1200" d=" M269 826Q131 688 131 495.5T270.5 165T601.5 27T931.5 165T1070 495.5T931.5 825.5T601.5 963T269 826zM1006 900Q1179 733 1179 495.5T1008.5 87T600.5 -84T192 87T21 495.5T192 904T600.5 1075T1006 900zM893 581Q908 536 864 522L616 436H611Q603 431 592 431Q551 431 551 472V867Q551 909 593 909T635 867V535L838 603Q877 616 893 581z" /> <glyph glyph-name="time-1" unicode="time" horiz-adv-x="1200" d=" M269 826Q131 688 131 495.5T270.5 165T601.5 27T931.5 165T1070 495.5T931.5 825.5T601.5 963T269 826zM1006 900Q1179 733 1179 495.5T1008.5 87T600.5 -84T192 87T21 495.5T192 904T600.5 1075T1006 900zM893 581Q908 536 864 522L616 436H611Q603 431 592 431Q551 431 551 472V867Q551 909 593 909T635 867V535L838 603Q877 616 893 581z" /> <glyph glyph-name="tint" - unicode="" + unicode="" horiz-adv-x="1200" d=" M969 310Q969 158 860 49.5T598.5 -59T338.5 49.5T231 310Q231 627 599 1167Q969 627 969 310z" /> <glyph glyph-name="tint-1" unicode="tint" horiz-adv-x="1200" d=" M969 310Q969 158 860 49.5T598.5 -59T338.5 49.5T231 310Q231 627 599 1167Q969 627 969 310z" /> <glyph glyph-name="transfer" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1189 819L893 552Q877 537 852 537Q820 537 807 557Q764 606 808 647L918 745H478V880H932L808 989Q764 1031 806 1080T893 1083zM249 880H406V745H249V880zM19 885H174V749H19V885zM11 186L307 453Q324 470 351 470Q377 470 398 449Q438 395 392 359L288 260H726V124H273L392 17Q438 -22 398 -74Q353 -121 307 -77zM797 260H954V124H797V260zM1027 256H1181V121H1027V256z" /> <glyph glyph-name="transfer-1" unicode="transfer" horiz-adv-x="1200" d=" M1189 819L893 552Q877 537 852 537Q820 537 807 557Q764 606 808 647L918 745H478V880H932L808 989Q764 1031 806 1080T893 1083zM249 880H406V745H249V880zM19 885H174V749H19V885zM11 186L307 453Q324 470 351 470Q377 470 398 449Q438 395 392 359L288 260H726V124H273L392 17Q438 -22 398 -74Q353 -121 307 -77zM797 260H954V124H797V260zM1027 256H1181V121H1027V256z" /> <glyph glyph-name="trash-square" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 1080H1200V-120H0V1080zM109 971V-11H1091V971H109zM846 747Q872 747 872 720T846 693H353Q328 693 328 720T353 747H426V773Q426 801 441.5 820.5T478 840H721Q744 840 759.5 820.5T775 773V747H846zM452 747H748V773Q748 813 721 813H478Q452 813 452 773V747zM833 625L765 120H433L366 625H833zM505 157Q525 161 525 182L484 569Q478 594 458 590Q439 590 439 567L482 176Q482 157 502 157H505zM622 569Q622 590 599.5 590T577 569V179Q577 157 599.5 157T622 179V569zM760 567Q760 590 742 590Q721 594 717 569L675 182Q675 161 695 157H696Q719 157 719 176z" /> <glyph glyph-name="trash-square-1" unicode="trash-square" horiz-adv-x="1200" d=" M0 1080H1200V-120H0V1080zM109 971V-11H1091V971H109zM846 747Q872 747 872 720T846 693H353Q328 693 328 720T353 747H426V773Q426 801 441.5 820.5T478 840H721Q744 840 759.5 820.5T775 773V747H846zM452 747H748V773Q748 813 721 813H478Q452 813 452 773V747zM833 625L765 120H433L366 625H833zM505 157Q525 161 525 182L484 569Q478 594 458 590Q439 590 439 567L482 176Q482 157 502 157H505zM622 569Q622 590 599.5 590T577 569V179Q577 157 599.5 157T622 179V569zM760 567Q760 590 742 590Q721 594 717 569L675 182Q675 161 695 157H696Q719 157 719 176z" /> <glyph glyph-name="trash" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1009 925Q1053 925 1053 880.5T1009 836H189Q147 836 147 880.5T189 925H310V969Q310 1015 336 1047.5T397 1080H801Q840 1080 865.5 1047.5T891 969V925H1009zM353 925H847V969Q847 1035 801 1035H397Q353 1035 353 969V925zM988 721L875 -120H321L210 721H988zM442 -59Q475 -52 475 -17L406 628Q397 669 364 663Q332 663 332 625L403 -27Q403 -59 436 -59H442zM637 628Q637 663 599.5 663T562 628V-22Q562 -59 599.5 -59T637 -22V628zM866 625Q866 663 836 663Q801 669 796 628L726 -17Q726 -52 758 -59H760Q798 -59 798 -27z" /> <glyph glyph-name="trash-1" unicode="trash" horiz-adv-x="1200" d=" M1009 925Q1053 925 1053 880.5T1009 836H189Q147 836 147 880.5T189 925H310V969Q310 1015 336 1047.5T397 1080H801Q840 1080 865.5 1047.5T891 969V925H1009zM353 925H847V969Q847 1035 801 1035H397Q353 1035 353 969V925zM988 721L875 -120H321L210 721H988zM442 -59Q475 -52 475 -17L406 628Q397 669 364 663Q332 663 332 625L403 -27Q403 -59 436 -59H442zM637 628Q637 663 599.5 663T562 628V-22Q562 -59 599.5 -59T637 -22V628zM866 625Q866 663 836 663Q801 669 796 628L726 -17Q726 -52 758 -59H760Q798 -59 798 -27z" /> <glyph glyph-name="unchecked" - unicode="" + unicode="" horiz-adv-x="1200" d=" M871 -68H327Q226 -68 157.5 1T89 171V712Q89 814 157.5 883T327 952H871Q969 952 1040 883T1111 712V171Q1111 70 1040 1T871 -68zM327 872Q260 872 214.5 826.5T169 712V171Q169 101 214.5 56T327 11H871Q940 11 986 56T1032 171V712Q1032 781 986 826.5T871 872H327z" /> <glyph glyph-name="unchecked-1" unicode="unchecked" horiz-adv-x="1200" d=" M871 -68H327Q226 -68 157.5 1T89 171V712Q89 814 157.5 883T327 952H871Q969 952 1040 883T1111 712V171Q1111 70 1040 1T871 -68zM327 872Q260 872 214.5 826.5T169 712V171Q169 101 214.5 56T327 11H871Q940 11 986 56T1032 171V712Q1032 781 986 826.5T871 872H327z" /> <glyph glyph-name="undo" - unicode="" + unicode="" horiz-adv-x="1200" d=" M760 1080L611 945Q755 909 860 804Q936 728 977 628.5T1018 421T977 214T860 38.5T684.5 -79T477 -120V-67Q567 -54 643 14.5T760.5 178T802 367Q802 491 728.5 590.5T538 728L556 530L182 982z" /> <glyph glyph-name="undo-1" unicode="undo" horiz-adv-x="1200" d=" M760 1080L611 945Q755 909 860 804Q936 728 977 628.5T1018 421T977 214T860 38.5T684.5 -79T477 -120V-67Q567 -54 643 14.5T760.5 178T802 367Q802 491 728.5 590.5T538 728L556 530L182 982z" /> <glyph glyph-name="unplug" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1196 1078Q1198 1075 1199 1070.5T1200 1062V1050V1039L997 836L1100 734Q1131 712 1135.5 673T1116 604Q1079 564 1006.5 492.5T918 404Q847 475 705.5 616T494 828L653 988Q672 1010 693.5 1024.5T742.5 1045.5T795 1035Q822 1012 868.5 964.5T926 907L1098 1079H1174Q1190 1084 1196 1078zM479 672L514.5 636.5L550 601L379 431L521 290L691 460L762 389L592 219L662 148L503 -11Q484 -34 462.5 -48.5T413.5 -69.5T361 -59Q334 -36 287.5 11.5T230 69L58 -103Q54 -110 49.5 -114T37.5 -119.5T26.5 -121.5T12 -121.5T0 -121V-20L159 140L56 243Q26 265 21 304T40 372Q77 412 149.5 484T238 572Q273 537 309 502z" /> <glyph glyph-name="unplug-1" unicode="unplug" horiz-adv-x="1200" d=" M1196 1078Q1198 1075 1199 1070.5T1200 1062V1050V1039L997 836L1100 734Q1131 712 1135.5 673T1116 604Q1079 564 1006.5 492.5T918 404Q847 475 705.5 616T494 828L653 988Q672 1010 693.5 1024.5T742.5 1045.5T795 1035Q822 1012 868.5 964.5T926 907L1098 1079H1174Q1190 1084 1196 1078zM479 672L514.5 636.5L550 601L379 431L521 290L691 460L762 389L592 219L662 148L503 -11Q484 -34 462.5 -48.5T413.5 -69.5T361 -59Q334 -36 287.5 11.5T230 69L58 -103Q54 -110 49.5 -114T37.5 -119.5T26.5 -121.5T12 -121.5T0 -121V-20L159 140L56 243Q26 265 21 304T40 372Q77 412 149.5 484T238 572Q273 537 309 502z" /> <glyph glyph-name="upload" - unicode="" + unicode="" horiz-adv-x="1200" d=" M599 793L837 532Q850 516 850 491Q850 465 831 447Q790 409 754 455L666 548V284H543V562L445 455Q406 409 369 447Q321 486 364 532zM267 828Q126 689 126 495.5T266 163T598 24T930 163T1070 495.5T930 828T598 967T267 828zM1015 910Q1184 735 1184 496T1010.5 84.5T599 -88T188 84.5T15 496T188 907T599 1079T1015 910z" /> <glyph glyph-name="upload-1" unicode="upload" horiz-adv-x="1200" d=" M599 793L837 532Q850 516 850 491Q850 465 831 447Q790 409 754 455L666 548V284H543V562L445 455Q406 409 369 447Q321 486 364 532zM267 828Q126 689 126 495.5T266 163T598 24T930 163T1070 495.5T930 828T598 967T267 828zM1015 910Q1184 735 1184 496T1010.5 84.5T599 -88T188 84.5T15 496T188 907T599 1079T1015 910z" /> <glyph glyph-name="usd" - unicode="" + unicode="" horiz-adv-x="1200" d=" M846 688Q821 708 784 723Q768 733 719 753Q695 761 649 770V651L658 647H671L686 642L700 638Q761 620 812 595Q866 574 902 539Q937 514 961 463Q979 420 979 348Q979 271 952 215Q931 162 880 130Q833 92 782 78Q743 64 666 56V-102H563V57Q459 68 382 92Q297 121 221 162L331 385Q340 381 365.5 368T405 344Q409 344 438.5 330.5T485 310Q539 292 577 286V406Q554 409 495 430Q421 458 391 471Q349 500 321 528Q286 558 276 600Q265 638 265 688Q265 767 286 814Q307 866 349 907Q400 951 444 967Q519 998 563 998V1131H666V998Q723 986 747 984Q761 977 786.5 971T828 961L897 930L956 903zM525 733Q525 712 539.5 698T577 674V773Q525 767 525 733zM704 325Q704 344 688 359Q684 361 671 369T649 381V283Q676 286 688 297Q704 310 704 325z" /> <glyph glyph-name="usd-1" unicode="usd" horiz-adv-x="1200" d=" M846 688Q821 708 784 723Q768 733 719 753Q695 761 649 770V651L658 647H671L686 642L700 638Q761 620 812 595Q866 574 902 539Q937 514 961 463Q979 420 979 348Q979 271 952 215Q931 162 880 130Q833 92 782 78Q743 64 666 56V-102H563V57Q459 68 382 92Q297 121 221 162L331 385Q340 381 365.5 368T405 344Q409 344 438.5 330.5T485 310Q539 292 577 286V406Q554 409 495 430Q421 458 391 471Q349 500 321 528Q286 558 276 600Q265 638 265 688Q265 767 286 814Q307 866 349 907Q400 951 444 967Q519 998 563 998V1131H666V998Q723 986 747 984Q761 977 786.5 971T828 961L897 930L956 903zM525 733Q525 712 539.5 698T577 674V773Q525 767 525 733zM704 325Q704 344 688 359Q684 361 671 369T649 381V283Q676 286 688 297Q704 310 704 325z" /> <glyph glyph-name="user" - unicode="" + unicode="" horiz-adv-x="1200" d=" M879 848Q879 729 794 625.5T599.5 522T405.5 625.5T321 848Q321 963 404 1045T600 1127T796 1045T879 848zM38 -70Q38 75 197 207.5T599 340T1001.5 207.5T1161 -70H38z" /> <glyph glyph-name="user-1" unicode="user" horiz-adv-x="1200" d=" M879 848Q879 729 794 625.5T599.5 522T405.5 625.5T321 848Q321 963 404 1045T600 1127T796 1045T879 848zM38 -70Q38 75 197 207.5T599 340T1001.5 207.5T1161 -70H38z" /> <glyph glyph-name="vert-dashed" - unicode="" + unicode="" horiz-adv-x="1200" d=" M536 1080V876H664V1080H536zM536 1080H664V876H536V1080zM536 748V544H664V748H536zM536 748H664V544H536V748zM536 416V212H664V416H536zM536 416H664V212H536V416zM536 84V-120H664V84H536zM536 84H664V-120H536V84zM536 748V544H664V748H536zM536 748H664V544H536V748zM536 416V212H664V416H536zM536 416H664V212H536V416zM536 84V-120H664V84H536zM536 84H664V-120H536V84zM536 416V212H664V416H536zM536 416H664V212H536V416zM536 84V-120H664V84H536zM536 84H664V-120H536V84zM536 84V-120H664V84H536zM536 84H664V-120H536V84zM536 1080H664V876H536V1080zM536 748H664V544H536V748zM536 416H664V212H536V416zM536 84H664V-120H536V84z" /> <glyph glyph-name="vert-dashed-1" unicode="vert-dashed" horiz-adv-x="1200" d=" M536 1080V876H664V1080H536zM536 1080H664V876H536V1080zM536 748V544H664V748H536zM536 748H664V544H536V748zM536 416V212H664V416H536zM536 416H664V212H536V416zM536 84V-120H664V84H536zM536 84H664V-120H536V84zM536 748V544H664V748H536zM536 748H664V544H536V748zM536 416V212H664V416H536zM536 416H664V212H536V416zM536 84V-120H664V84H536zM536 84H664V-120H536V84zM536 416V212H664V416H536zM536 416H664V212H536V416zM536 84V-120H664V84H536zM536 84H664V-120H536V84zM536 84V-120H664V84H536zM536 84H664V-120H536V84zM536 1080H664V876H536V1080zM536 748H664V544H536V748zM536 416H664V212H536V416zM536 84H664V-120H536V84z" /> <glyph glyph-name="viewport-filter" - unicode="" + unicode="" horiz-adv-x="1200" d=" M0 1080L0 729L100 829L100 980L251 980L351 1080L0 1080zM849 1080L949 980L1100 980L1100 829L1200 729L1200 1080L849 1080zM300.58789 880C292.06529 880 284.44122 876.4112700000001 277.71289 869.23438C270.98456 862.05747 267.61914 853.98284 267.61914 845.01172C267.61914 823.03246 278.60862 812.04297 300.58789 812.04297L897.39258 812.04297C920.71751 812.04297 932.38086 823.03246 932.38086 845.01172C932.38086 853.98284 929.01544 862.0574799999999 922.28711 869.23438C915.55878 876.41128 907.26084 880 897.39258 880L300.58789 880zM300.58789 746.10547L533.38867 412.38086L533.38867 80L666.61133 213.2207L666.61133 412.38086L897.39258 746.10547L300.58789 746.10547zM0 231L0 -120L351 -120L251 -20L100 -20L100 131L0 231zM1200 231L1100 131L1100 -20L949 -20L849 -120L1200 -120L1200 231z" /> <glyph glyph-name="viewport-filter-1" unicode="viewport-filter" horiz-adv-x="1200" d=" M0 1080L0 729L100 829L100 980L251 980L351 1080L0 1080zM849 1080L949 980L1100 980L1100 829L1200 729L1200 1080L849 1080zM300.58789 880C292.06529 880 284.44122 876.4112700000001 277.71289 869.23438C270.98456 862.05747 267.61914 853.98284 267.61914 845.01172C267.61914 823.03246 278.60862 812.04297 300.58789 812.04297L897.39258 812.04297C920.71751 812.04297 932.38086 823.03246 932.38086 845.01172C932.38086 853.98284 929.01544 862.0574799999999 922.28711 869.23438C915.55878 876.41128 907.26084 880 897.39258 880L300.58789 880zM300.58789 746.10547L533.38867 412.38086L533.38867 80L666.61133 213.2207L666.61133 412.38086L897.39258 746.10547L300.58789 746.10547zM0 231L0 -120L351 -120L251 -20L100 -20L100 131L0 231zM1200 231L1100 131L1100 -20L949 -20L849 -120L1200 -120L1200 231z" /> <glyph glyph-name="warning-sign" - unicode="" + unicode="" horiz-adv-x="1200" d=" M1298 -84H65Q47 -84 31.5 -76T8 -54T0 -22T10 12L626 1081Q637 1096 651 1105.5T682 1115T713 1105.5T736 1081L1354 12Q1362 -4 1363 -22T1356 -54T1332.5 -76T1298 -84zM114 8H1250L682 991zM622 745Q622 783 659 783H705Q740 783 740 745V318Q740 280 705 280H659Q622 280 622 318V745zM729 114Q720 105 707.5 100T682 95T656 100T634 114Q615 133 615 163T633 213Q643 224 656 229.5T682 235T707.5 229.5T729 213Q748 194 748 163Q748 133 729 114z" /> <glyph glyph-name="warning-sign-1" unicode="warning-sign" horiz-adv-x="1200" d=" M1298 -84H65Q47 -84 31.5 -76T8 -54T0 -22T10 12L626 1081Q637 1096 651 1105.5T682 1115T713 1105.5T736 1081L1354 12Q1362 -4 1363 -22T1356 -54T1332.5 -76T1298 -84zM114 8H1250L682 991zM622 745Q622 783 659 783H705Q740 783 740 745V318Q740 280 705 280H659Q622 280 622 318V745zM729 114Q720 105 707.5 100T682 95T656 100T634 114Q615 133 615 163T633 213Q643 224 656 229.5T682 235T707.5 229.5T729 213Q748 194 748 163Q748 133 729 114z" /> <glyph glyph-name="webpage" - unicode="" + unicode="" horiz-adv-x="1200" d=" M-0.00001125 933.07199V26.9280100000001H1200V933.07199zM35.381539 895.186854H36.860839H1164.1632V553.20859V63.7284199999999H35.381539zM669.5549 805.04654C661.75016 805.04654 654.51765 803.20863 647.86059 799.5358C641.20367 795.86297 635.69468 790.81356 631.33325 784.3860999999999C626.97171 777.9586400000001 624.56252 770.8428 624.10347 763.0380299999999C615.3805 722.63688 576.58489 539.9127100000001 507.71923 214.86703C505.8829 210.27598 504.96629 205.45511 504.96629 200.40496C504.96629 192.1411000000001 507.03034 184.5657700000001 511.1623 177.67921C515.29426 170.7926499999999 520.80548 165.28377 527.69212 161.15184C534.57864 157.0199 542.15392 154.95346 550.41784 154.95346C556.38625 154.95346 562.12359 156.10094 567.63283 158.3964599999999C573.14206 160.6919800000001 577.96303 163.90591 582.09487 168.03784C586.22683 172.16978 589.44081 176.9906600000001 591.73631 182.4999C594.03182 188.00916 595.40786 193.74898 595.86691 199.71733L710.87337 740.99992C713.16888 746.96827 714.54727 753.1675700000001 715.00645 759.59503C715.00645 771.9908399999999 710.52837 782.66341 701.57582 791.61591C692.62326 800.56845 681.95078 805.04654 669.5549 805.04654zM639.94316 725.16259C641.32044 724.24438 642.58218 723.32543 643.73 722.40722C644.87769 721.48901 646.13943 720.80101 647.51683 720.34189C646.13943 720.80101 644.76352 721.48901 643.38611 722.40722C642.46801 723.32543 641.32044 724.24438 639.94316 725.16259zM428.52535 667.3143299999999C422.55706 667.3143299999999 415.44121 665.01937 407.1772900000001 660.4283399999999L393.40289 650.0969C304.33674 579.85398 245.80067 533.71407 217.79531 511.67707C205.85848 506.62693 197.13576 497.78986 191.62652 485.1645C186.11729 472.53914 184.96972 459.5692 188.18345 446.25518C191.39718 432.9411700000001 198.51304 423.07089 209.53151 416.64343C225.14112 405.62493 247.06477 388.9816 275.29972 366.71505C303.53455 344.4485100000001 319.71602 331.47857 323.84798 327.8057300000001C329.81627 323.2147 338.31052 316.6726 349.32912 308.17917C360.3475900000001 299.68575 370.21788 291.8819 378.94085 284.76578C387.66382 277.64968 395.92712 270.87905 403.73186 264.4515800000001C416.58679 255.26951 430.93515 253.31734 446.77423 258.59704C462.61343 263.87673 473.05744 273.86127 478.1075 288.5526C482.69863 300.4893100000001 482.35338 312.77123 477.07361 325.3966000000001C471.96987 337.60136 463.74773 346.25549 452.42305 351.38134L442.98752 358.7976C437.93733 362.47043 434.95195 364.7654 434.03372 365.6836C418.88329 376.7021 396.84534 393.00022 367.92175 414.57812C338.99816 436.156 318.11014 451.76611 305.25522 461.4073100000001C313.51913 467.3756599999999 335.21183 483.55709 370.33329 509.9555800000001C405.45476 536.3540499999999 432.42785 556.6707799999999 451.25119 570.90301C466.86067 577.33046 476.38571 589.72666 479.82903 608.09083C483.27235 626.45499 478.56816 641.3746699999999 465.71323 652.8522800000001C456.07204 662.49346 444.5924 667.08581 431.2783 666.62671C430.36019 667.08581 429.44358 667.3143299999999 428.52535 667.3143299999999zM771.47462 667.3143299999999C770.55639 667.3143299999999 769.63977 667.08581 768.72167 666.62671C755.40757 667.08581 743.92793 662.49346 734.28674 652.8522800000001C721.43181 641.3746699999999 716.72761 626.45499 720.17093 608.09083C723.61425 589.72666 733.13929 577.33046 748.74878 570.90301C767.57212 556.6707799999999 794.54521 536.3540499999999 829.66667 509.9555800000001C864.78814 483.55709 886.4808 467.3756599999999 894.7448 461.4073100000001C881.88982 451.76611 861.0018 436.156 832.07821 414.57812C803.15462 393.00022 781.11668 376.7021 765.96625 365.6836L757.01257 358.7976C752.88061 356.04297 750.35713 354.20506 749.43891 353.2868600000001C748.02964 352.1124700000001 747.28423 351.42251 747.19683 351.20944C736.06765 346.0626200000001 727.97059 337.4648200000001 722.92388 325.3966000000001C717.64423 312.77123 717.30146 300.4893100000001 721.89247 288.5526C726.94253 273.86127 737.38667 263.87673 753.22574 258.59704C769.06481 253.31734 783.41318 255.26951 796.26811 264.4515800000001C804.07285 270.87905 812.33615 277.64968 821.05912 284.76578C829.78209 291.8819 839.65238 299.68575 850.67085 308.17917C861.68945 316.6726 870.1837 323.2147 876.15199 327.8057300000001C884.875 335.1514 896.695 344.79315 911.6159 356.7298600000001C926.5368 368.66656 940.4256 379.57007 953.2806 389.4408C966.1355 399.31155 978.5318 408.37956 990.4685 416.64343C1001.4869 423.07089 1008.6028 432.9411700000001 1011.8165 446.25518C1015.0302 459.5692 1013.8827 472.53914 1008.3734 485.1645C1002.8642 497.78986 994.1415 506.62693 982.2047 511.67707C961.0859 528.2048199999999 902.5499 574.34473 806.59708 650.0969C794.20132 661.1154 782.49309 666.85523 771.47462 667.3143299999999zM382.3838 626.68352C381.92475 624.3879999999999 381.69615 621.86207 381.69615 619.1074699999999V621.86283V624.61821zM817.61617 626.68352L818.30382 624.61821V621.86283V619.1074699999999C818.30382 621.8620900000001 818.07522 624.3879999999999 817.61617 626.68352zM381.69615 612.91151L382.3838 608.09083L383.07392 603.27013L385.13922 598.44944L387.20452 594.31639H386.51687C386.05782 595.2346 385.59827 596.61304 385.13922 598.44944L384.45157 599.13708L383.07392 603.27013C382.61475 605.56566 382.3838 607.17262 382.3838 608.09083C381.92475 609.92724 381.69615 611.5342 381.69615 612.91151zM818.30382 612.91151C818.30382 611.5342 818.07522 609.92724 817.61617 608.09083C817.61617 607.17262 817.38522 605.56566 816.92604 603.27013L815.54839 599.13708L814.86075 598.44944C814.40169 596.61304 813.94215 595.2346 813.4831 594.31639H812.79545L814.86075 598.44944L816.92604 603.27013L817.61617 608.09083zM411.99801 570.90301C414.29352 569.98479 417.04795 569.06585 420.26168 568.1476299999999C418.42535 568.6067499999999 417.27543 568.8376900000001 416.8162500000001 568.8376900000001C415.43898 569.29679 413.83446 569.98479 411.99801 570.90301zM788.00196 570.90301C786.1655 569.98479 784.55851 569.29679 783.18123 568.8376900000001C782.72218 568.8376900000001 781.57474 568.6067499999999 779.73829 568.1476299999999C782.95202 569.06585 785.70645 569.98479 788.00196 570.90301zM572.45355 239.65809C573.83083 239.19899 574.97827 238.51099 575.8965 237.59278C574.51922 238.51099 573.37177 239.19899 572.45355 239.65809z" /> <glyph glyph-name="webpage-1" unicode="webpage" horiz-adv-x="1200" d=" M-0.00001125 933.07199V26.9280100000001H1200V933.07199zM35.381539 895.186854H36.860839H1164.1632V553.20859V63.7284199999999H35.381539zM669.5549 805.04654C661.75016 805.04654 654.51765 803.20863 647.86059 799.5358C641.20367 795.86297 635.69468 790.81356 631.33325 784.3860999999999C626.97171 777.9586400000001 624.56252 770.8428 624.10347 763.0380299999999C615.3805 722.63688 576.58489 539.9127100000001 507.71923 214.86703C505.8829 210.27598 504.96629 205.45511 504.96629 200.40496C504.96629 192.1411000000001 507.03034 184.5657700000001 511.1623 177.67921C515.29426 170.7926499999999 520.80548 165.28377 527.69212 161.15184C534.57864 157.0199 542.15392 154.95346 550.41784 154.95346C556.38625 154.95346 562.12359 156.10094 567.63283 158.3964599999999C573.14206 160.6919800000001 577.96303 163.90591 582.09487 168.03784C586.22683 172.16978 589.44081 176.9906600000001 591.73631 182.4999C594.03182 188.00916 595.40786 193.74898 595.86691 199.71733L710.87337 740.99992C713.16888 746.96827 714.54727 753.1675700000001 715.00645 759.59503C715.00645 771.9908399999999 710.52837 782.66341 701.57582 791.61591C692.62326 800.56845 681.95078 805.04654 669.5549 805.04654zM639.94316 725.16259C641.32044 724.24438 642.58218 723.32543 643.73 722.40722C644.87769 721.48901 646.13943 720.80101 647.51683 720.34189C646.13943 720.80101 644.76352 721.48901 643.38611 722.40722C642.46801 723.32543 641.32044 724.24438 639.94316 725.16259zM428.52535 667.3143299999999C422.55706 667.3143299999999 415.44121 665.01937 407.1772900000001 660.4283399999999L393.40289 650.0969C304.33674 579.85398 245.80067 533.71407 217.79531 511.67707C205.85848 506.62693 197.13576 497.78986 191.62652 485.1645C186.11729 472.53914 184.96972 459.5692 188.18345 446.25518C191.39718 432.9411700000001 198.51304 423.07089 209.53151 416.64343C225.14112 405.62493 247.06477 388.9816 275.29972 366.71505C303.53455 344.4485100000001 319.71602 331.47857 323.84798 327.8057300000001C329.81627 323.2147 338.31052 316.6726 349.32912 308.17917C360.3475900000001 299.68575 370.21788 291.8819 378.94085 284.76578C387.66382 277.64968 395.92712 270.87905 403.73186 264.4515800000001C416.58679 255.26951 430.93515 253.31734 446.77423 258.59704C462.61343 263.87673 473.05744 273.86127 478.1075 288.5526C482.69863 300.4893100000001 482.35338 312.77123 477.07361 325.3966000000001C471.96987 337.60136 463.74773 346.25549 452.42305 351.38134L442.98752 358.7976C437.93733 362.47043 434.95195 364.7654 434.03372 365.6836C418.88329 376.7021 396.84534 393.00022 367.92175 414.57812C338.99816 436.156 318.11014 451.76611 305.25522 461.4073100000001C313.51913 467.3756599999999 335.21183 483.55709 370.33329 509.9555800000001C405.45476 536.3540499999999 432.42785 556.6707799999999 451.25119 570.90301C466.86067 577.33046 476.38571 589.72666 479.82903 608.09083C483.27235 626.45499 478.56816 641.3746699999999 465.71323 652.8522800000001C456.07204 662.49346 444.5924 667.08581 431.2783 666.62671C430.36019 667.08581 429.44358 667.3143299999999 428.52535 667.3143299999999zM771.47462 667.3143299999999C770.55639 667.3143299999999 769.63977 667.08581 768.72167 666.62671C755.40757 667.08581 743.92793 662.49346 734.28674 652.8522800000001C721.43181 641.3746699999999 716.72761 626.45499 720.17093 608.09083C723.61425 589.72666 733.13929 577.33046 748.74878 570.90301C767.57212 556.6707799999999 794.54521 536.3540499999999 829.66667 509.9555800000001C864.78814 483.55709 886.4808 467.3756599999999 894.7448 461.4073100000001C881.88982 451.76611 861.0018 436.156 832.07821 414.57812C803.15462 393.00022 781.11668 376.7021 765.96625 365.6836L757.01257 358.7976C752.88061 356.04297 750.35713 354.20506 749.43891 353.2868600000001C748.02964 352.1124700000001 747.28423 351.42251 747.19683 351.20944C736.06765 346.0626200000001 727.97059 337.4648200000001 722.92388 325.3966000000001C717.64423 312.77123 717.30146 300.4893100000001 721.89247 288.5526C726.94253 273.86127 737.38667 263.87673 753.22574 258.59704C769.06481 253.31734 783.41318 255.26951 796.26811 264.4515800000001C804.07285 270.87905 812.33615 277.64968 821.05912 284.76578C829.78209 291.8819 839.65238 299.68575 850.67085 308.17917C861.68945 316.6726 870.1837 323.2147 876.15199 327.8057300000001C884.875 335.1514 896.695 344.79315 911.6159 356.7298600000001C926.5368 368.66656 940.4256 379.57007 953.2806 389.4408C966.1355 399.31155 978.5318 408.37956 990.4685 416.64343C1001.4869 423.07089 1008.6028 432.9411700000001 1011.8165 446.25518C1015.0302 459.5692 1013.8827 472.53914 1008.3734 485.1645C1002.8642 497.78986 994.1415 506.62693 982.2047 511.67707C961.0859 528.2048199999999 902.5499 574.34473 806.59708 650.0969C794.20132 661.1154 782.49309 666.85523 771.47462 667.3143299999999zM382.3838 626.68352C381.92475 624.3879999999999 381.69615 621.86207 381.69615 619.1074699999999V621.86283V624.61821zM817.61617 626.68352L818.30382 624.61821V621.86283V619.1074699999999C818.30382 621.8620900000001 818.07522 624.3879999999999 817.61617 626.68352zM381.69615 612.91151L382.3838 608.09083L383.07392 603.27013L385.13922 598.44944L387.20452 594.31639H386.51687C386.05782 595.2346 385.59827 596.61304 385.13922 598.44944L384.45157 599.13708L383.07392 603.27013C382.61475 605.56566 382.3838 607.17262 382.3838 608.09083C381.92475 609.92724 381.69615 611.5342 381.69615 612.91151zM818.30382 612.91151C818.30382 611.5342 818.07522 609.92724 817.61617 608.09083C817.61617 607.17262 817.38522 605.56566 816.92604 603.27013L815.54839 599.13708L814.86075 598.44944C814.40169 596.61304 813.94215 595.2346 813.4831 594.31639H812.79545L814.86075 598.44944L816.92604 603.27013L817.61617 608.09083zM411.99801 570.90301C414.29352 569.98479 417.04795 569.06585 420.26168 568.1476299999999C418.42535 568.6067499999999 417.27543 568.8376900000001 416.8162500000001 568.8376900000001C415.43898 569.29679 413.83446 569.98479 411.99801 570.90301zM788.00196 570.90301C786.1655 569.98479 784.55851 569.29679 783.18123 568.8376900000001C782.72218 568.8376900000001 781.57474 568.6067499999999 779.73829 568.1476299999999C782.95202 569.06585 785.70645 569.98479 788.00196 570.90301zM572.45355 239.65809C573.83083 239.19899 574.97827 238.51099 575.8965 237.59278C574.51922 238.51099 573.37177 239.19899 572.45355 239.65809z" /> <glyph glyph-name="wrench" - unicode="" + unicode="" horiz-adv-x="1200" d=" M223 646L414 846L189 1057Q223 1110 372.5 1064T556 930Q604 798 530.5 640T285 468Q214 461 161 492T82 575T41 680.5T23 771T24 811zM1180 99L978 -105L454 421L430 430Q520 476 574 560Q604 606 622 676L651 627z" /> <glyph glyph-name="wrench-1" unicode="wrench" horiz-adv-x="1200" d=" M223 646L414 846L189 1057Q223 1110 372.5 1064T556 930Q604 798 530.5 640T285 468Q214 461 161 492T82 575T41 680.5T23 771T24 811zM1180 99L978 -105L454 421L430 430Q520 476 574 560Q604 606 622 676L651 627z" /> <glyph glyph-name="zoom-in" - unicode="" + unicode="" horiz-adv-x="1200" d=" M429 230Q341 230 263.5 262T127 355Q64 416 32 494.5T0 655.5T32 817.5T127 960Q186 1021 263.5 1052.5T429 1084Q514 1084 591.5 1052.5T731 960Q794 897 825.5 817.5T857 655.5T825.5 494.5T731 355Q669 294 591.5 262T429 230zM429 968Q363 968 307 945.5T209 877Q162 832 138.5 774.5T115 657T138.5 540T209 438Q251 392 307 369.5T429 347Q491 347 547.5 369.5T649 438Q694 483 716.5 540T739 657T716.5 774.5T649 877Q604 923 547.5 945.5T429 968zM1210 11L917 308L822 343L739 264L779 169L1071 -128zM606 627H265Q251 627 243 635.5T235 657Q235 671 243 679T265 687H606Q619 687 627.5 679T636 657Q636 644 627.5 635.5T606 627zM433 459Q420 459 411.5 467T403 485V830Q403 840 411.5 847.5T433 855T455 847.5T464 830V485Q464 475 455 467T433 459z" /> <glyph glyph-name="zoom-in-1" unicode="zoom-in" horiz-adv-x="1200" d=" M429 230Q341 230 263.5 262T127 355Q64 416 32 494.5T0 655.5T32 817.5T127 960Q186 1021 263.5 1052.5T429 1084Q514 1084 591.5 1052.5T731 960Q794 897 825.5 817.5T857 655.5T825.5 494.5T731 355Q669 294 591.5 262T429 230zM429 968Q363 968 307 945.5T209 877Q162 832 138.5 774.5T115 657T138.5 540T209 438Q251 392 307 369.5T429 347Q491 347 547.5 369.5T649 438Q694 483 716.5 540T739 657T716.5 774.5T649 877Q604 923 547.5 945.5T429 968zM1210 11L917 308L822 343L739 264L779 169L1071 -128zM606 627H265Q251 627 243 635.5T235 657Q235 671 243 679T265 687H606Q619 687 627.5 679T636 657Q636 644 627.5 635.5T606 627zM433 459Q420 459 411.5 467T403 485V830Q403 840 411.5 847.5T433 855T455 847.5T464 830V485Q464 475 455 467T433 459z" /> <glyph glyph-name="zoom-out" - unicode="" + unicode="" horiz-adv-x="1200" d=" M429 230Q341 230 263.5 261.5T127 355Q64 418 32 497T0 658.5T32 819T127 959Q186 1021 263.5 1054.5T429 1088Q514 1088 591.5 1054.5T731 959Q794 897 825.5 819T857 658.5T825.5 497T731 355Q669 293 591.5 261.5T429 230zM429 972Q363 972 307 947.5T209 877Q162 832 138.5 774.5T115 657T138.5 539.5T209 437Q251 392 307 369.5T429 347Q491 347 547.5 369.5T649 437T716.5 539.5T739 657T716.5 774.5T649 877Q604 923 547.5 947.5T429 972zM1210 15L917 307L822 347L739 265L779 170L1071 -124zM606 627H265Q251 627 243 635.5T235 657Q235 671 243 679T265 687H606Q619 687 627.5 679T636 657Q636 644 627.5 635.5T606 627z" /> <glyph glyph-name="zoom-out-1" unicode="zoom-out" horiz-adv-x="1200" d=" M429 230Q341 230 263.5 261.5T127 355Q64 418 32 497T0 658.5T32 819T127 959Q186 1021 263.5 1054.5T429 1088Q514 1088 591.5 1054.5T731 959Q794 897 825.5 819T857 658.5T825.5 497T731 355Q669 293 591.5 261.5T429 230zM429 972Q363 972 307 947.5T209 877Q162 832 138.5 774.5T115 657T138.5 539.5T209 437Q251 392 307 369.5T429 347Q491 347 547.5 369.5T649 437T716.5 539.5T739 657T716.5 774.5T649 877Q604 923 547.5 947.5T429 972zM1210 15L917 307L822 347L739 265L779 170L1071 -124zM606 627H265Q251 627 243 635.5T235 657Q235 671 243 679T265 687H606Q619 687 627.5 679T636 657Q636 644 627.5 635.5T606 627z" /> <glyph glyph-name="zoom-to" - unicode="" + unicode="" horiz-adv-x="1200" d=" M484 314Q426 314 374.5 334.5T284 396Q243 438 222 490T201 596.5T222 702.5T284 795Q323 836 374.5 858T484 880Q540 880 591 858T683 795Q725 754 745.5 702.5T766 596.5T745.5 490T683 396Q642 355 591 334.5T484 314zM484 803Q440 803 403 787T339 741Q308 711 292.5 673T277 595.5T292.5 518T339 450Q366 421 403 406T484 391Q525 391 562 406T629 450.5T673.5 518T688 595.5T673.5 673T629 741T562 787T484 803zM999 172L908 80L715 274L688 337L743 391L806 364zM0 1080H351L251 980H100V829L0 729V1080zM849 1080H1200V729L1100 829V980H949zM0 231L100 131V-20H251L351 -120H0V231zM1200 231V-120H849L949 -20H1100V131z" /> <glyph glyph-name="zoom-to-1" unicode="zoom-to" diff --git a/web/client/themes/default/icons/icons.ttf b/web/client/themes/default/icons/icons.ttf index 8161630acdd6bc22c2e95574e8434d7052ff1ed9..e10046693b9d44a54f9926684c135fe15e472fee 100755 GIT binary patch delta 9846 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 BA+!Jh delta 9499 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 H+{iBhiUqfp diff --git a/web/client/themes/default/icons/icons.woff b/web/client/themes/default/icons/icons.woff index e37b372ab147a0bf583132e2710d25c12db2253e..0f9d374870071a41aa5bc9803dd89fe5c2973c18 100755 GIT binary patch delta 47299 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 delta 47176 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 bh#~qIV;QU1hE3Rt6>P?qnVJ6qANJ~9D{6zH diff --git a/web/client/themes/default/icons/icons.woff2 b/web/client/themes/default/icons/icons.woff2 index af934f4f51158969420b9d49f6d91c28b99423e7..2fe713821e0b58aff98396b77ed459091510b1b3 100644 GIT binary patch literal 39432 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ⅈb(yh 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 literal 39364 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≶D`fnU5WIN;1>Oag` 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 U?{oq4c4XVu<&%m;i>JH-1ZT^f`Tzg` diff --git a/web/client/themes/default/less/annotations.less b/web/client/themes/default/less/annotations.less index cea4a3594c..db4382741d 100644 --- a/web/client/themes/default/less/annotations.less +++ b/web/client/themes/default/less/annotations.less @@ -9,89 +9,8 @@ // ************** // Theme // ************** -#ms-components-theme(@theme-vars) { - - .annotations-edit-error { - .color-var(@theme-vars[danger]); - } - - .ms-marker-shape-content, - .ms-marker-icon-content, - #mapstore-annotations-panel { - .background-color-var(@theme-vars[main-bg]); - } - - .ms-marker-selected { - .border-color-var(@theme-vars[focus-color]); - } - - .mapstore-annotations-info-viewer-marker-selected { - .border-color-var(@theme-vars[danger]); - } - - .mapstore-annotations-info-viewer>.annotations-edit-error { - .border-color-var(@theme-vars[main-border-color]); - } - - .ql-disabled { - .background-color-var(@theme-vars[main-variant-bg]); - } - - .mapstore-annotations-info-viewer { - .mapstore-annotations-info-viewer-items { - .geometry-card { - &.ms-selected { - .border-color-var(@theme-vars[focus-color]); - } - &.ms-disabled { - cursor: not-allowed; - .background-color-var(@theme-vars[disabled-bg]); - } - } - } - - .mapstore-annotations-info-viewer-expanded { - .border-right-color-var(@theme-vars[main-border-color]); - - .panel { - .border-color-var(@theme-vars[main-border-color]); - } - - .ms-dragg:first-child { - .border-top-color-var(@theme-vars[main-border-color]); - } - - .ms-dragg+.ms-dragg { - .border-top-color-var(@theme-vars[main-border-color]); - } - - .ms-dragg:last-child { - .border-bottom-color-var(@theme-vars[main-border-color]); - } - } - } - - .ms-annotations-panel { - .ms2-border-layout-content { - .ms-preview { - h4 { - .border-bottom-color-var(@theme-vars[main-border-color]); - } - } - } - } - - .mapstore-annotations-info-viewer .container-fluid .container-fluid .row { - .row:hover { - - input, - select, - .col-xs-5 span { - .color-var(@theme-vars[primary]); - } - } - } +#ms-components-theme(@theme-vars) { .ms-dragg.ms-below .coordinateRow, .ms-dragg.ms-above .coordinateRow { & { @@ -99,7 +18,6 @@ } &:hover { - input, select, .col-xs-5 span { @@ -108,18 +26,6 @@ } } - .mapstore-identify-viewer { - .mapstore-annotations-info-viewer.hover-background:hover { - .background-color-var(@theme-vars[main-bg]); - } - - .mapstore-annotations-info-viewer+.mapstore-annotations-info-viewer { - .mapstore-annotations-info-viewer-buttons { - .border-top-color-var(@theme-vars[main-border-color]); - } - } - } - .ms-over { .coordinateRow { .border-color-var(@theme-vars[primary]); @@ -131,734 +37,332 @@ } } } -} -// ************** -// Layout -// ************** -@annotation-feature-font-size: 13px; -#mapstore-annotations-info-viewer-edit-buttons { - float: right; -} - -.ms-property-picker-overlay { - position: fixed; - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 100%; - top: 0; - left: 0; - z-index: 9999; -} - -.ms-property-picker-cover { - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; -} - -.mapstore-annotations-info-viewer-marker { - float: left; - margin-top: 10px; - margin-bottom: 10px; - margin-right: 5px; - cursor: pointer; -} - -.mapstore-annotations-info-viewer-styler { - min-height: 600px; - .mapstore-switch-panel { - .shadow-soft; - border: none; - padding: 8px; + .ms-style-rules-editor-head, + .coordinates-editor .measure-feature-selector { + .background-color-var(@theme-vars[main-bg]); } - .mapstore-annotations-info-viewer-styler-container { - .ms2-border-layout-content { - overflow: auto; - position: relative; + + .ms-features-editor { + .ms-features-editor-tools { + .ms-features-editor-tools-body { + .border-left-color-var(@theme-vars[main-border-color]); + } } - } - .ms-style { - .Select { - border-radius: 0; - > * { - border-radius: 0; + .coordinates-row-container { + > div + div { + .border-top-color-var(@theme-vars[main-border-color]); } - width: 100%; - margin: 0; } - .Select-menu-outer { - z-index: 2 !important; - .shadow-soft; + + .ms-features-editor-tools-empty { + .border-left-color-var(@theme-vars[main-border-color]); + .glyphicon { + .color-var(@theme-vars[main-border-color]); + } } - .row { - display: flex; - align-items: center; + .ms-features-editor-item { + .border-color-var(@theme-vars[main-border-color]); + input { + .border-bottom-color-var(@theme-vars[main-border-color]); + .color-var(@theme-vars[main-color]); + .background-color-var(@theme-vars[main-bg]); + } + &.selected { + .color-var(@theme-vars[primary-contrast]); + .background-color-var(@theme-vars[primary]); + input { + .color-var(@theme-vars[primary-contrast]); + .background-color-var(@theme-vars[primary]); + } + .glyphicon { + .color-var(@theme-vars[primary-contrast]); + } + } + &:hover:not(.selected) { + .color-var(@theme-vars[main-hover-color]); + .background-color-var(@theme-vars[main-hover-bg]); + input { + .color-var(@theme-vars[main-hover-color]); + .background-color-var(@theme-vars[main-hover-bg]); + } + } } } } -.mapstore-annotations-info-viewer-styler .Select { - clear: both; - margin-top: 10px; - margin-bottom: 10px; - width: 50%; - margin-left: auto; - margin-right: auto; -} +// ************** +// Layout +// ************** -#mapstore-annotations-panel { - margin-bottom: 0; -} -#mapstore-annotations-panel .items-list.row { - margin: 5px 10px; +.ms-dragging { + opacity: 0.5; } -.mapstore-annotations-panel-cards { - height: ~'calc(100% - 50px)'; - overflow: auto; +.ms-over { + box-sizing: border-box; + .coordinateRow { + border: 1px solid transparent; + } + &.ms-dragging { + .coordinateRow { + border: 1px solid transparent; + } + } } -.mapstore-annotations-panel { - height: 100%; -} -.annotations-empty-panel{ - padding: 10px; - font-style: italic; - text-align: center; +.ms-dragg.ms-below .coordinateRow, +.ms-dragg.ms-above .coordinateRow { + &:hover{ + cursor: pointer; + } } -#ms-annotations-panel-card{ - .msSideGrid{ - margin: 0; - width: 100%; + +.coordinateRow { + display: flex; + align-items: center; + box-sizing: border-box; + border: 0; + font-family: @font-family-monospace; + font-size: @font-size-small; + .col-xs-5, .col-xs-1 { + padding: 0; + float: unset; + width: auto; + margin: 0 4px; } - .col-xs-12{ - padding-left: 0; - padding-right: 0; + .coordinate { + flex: 1; } - .mapstore-side-preview{ - align-items: center; + .form-group { + width: 100%; } - .mapstore-annotations-panel-card{ - width: 32px; - height: 32px; - margin: 8px; - display: flex; - align-items: center; - justify-content: center; - font-size: 21px; + .col-xs-5 { + flex: 1; + .form-group { + margin: 4px 0; + } } - .mapstore-side-card-info{ - padding: 0; + .input-group-addon, + input { + font-size: @font-size-small; } - .mapstore-side-card-title{ - font-weight: normal; - margin-bottom: 0; + .degrees { + min-width: 50px; } - .mapstore-annotations-panel-card-title{ - margin-top: 5px; - text-overflow: ellipsis; - width: 150px; - overflow: hidden; + .minutes { + min-width: 45px; } - .mapstore-side-card-desc{ - border-bottom: none; - height: auto; + .seconds { + max-width: 85px; } - .mapstore-annotations-panel-card-description { - margin: 5px 0 0; - text-overflow: ellipsis; - width: 150px; - white-space: nowrap; - overflow: hidden; + .direction-select { + min-width: 40px; + } + .coordinate { + padding: 0 4px; } } - -.mapstore-annotations-panel-card-thumbnail { - float: left; - width: 40px; - height: 100%; - padding-top: 15px; -} - -.extra-marker .marker-selected:after { - font-family: 'mapstore2'; - .glyphicon-record-content(); - position: absolute; - top: -18px; - left: 8px; - font-size: 18px; - color: purple; - text-shadow: 2px 0 0 #fff, -2px 0 0 #fff, 0 2px 0 #fff, 0 -2px 0 #fff, 1px 1px #fff, -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff; -} - -.mapstore-annotations-info-viewer .ql-editor { - max-height: 130px; -} - -#mapstore-annotations-panel .mapstore-annotations-info-viewer { - height: 100%; -} -#mapstore-annotations-panel .ms2-border-layout-body { - height: 100%; -} - -#mapstore-annotations-panel .ms2-border-layout-body { - overflow: hidden !important; -} - -.mapstore-annotations-info-viewer-marker-group { - clear: both; -} - -.mapstore-right-panel .ql-tooltip, #mapstore-annotations-panel .ql-tooltip { - left: 0 !important; - top: 0 !important; +.label-texts { + display: flex; + flex-direction: column; + align-items: center; + font-weight: 600; + padding: 10px; } -.mapstore-right-panel .react-swipeable-view-container > div { +.ms-annotations-editor { position: relative; + width: 100%; height: 100%; + display: flex; + flex-direction: column; } -.mapstore-right-panel .react-swipeable-view-container .panel.panel-default { - max-height: 100% !important; - height: 100%; - position: absolute; -} -.mapstore-right-panel .react-swipeable-view-container .panel.panel-default .panel-body { - height: ~'calc(100% - 60px)'; -} - -.mapstore-right-panel .mapstore-json-viewer, .mapstore-right-panel .mapstore-annotations-info-viewer { - height: 100%; -} - -.mapstore-annotations-panel-card-thumbnail:before { - color: white; - font-size: 16px; - margin-left: 8px; - margin-left: 8px; - display: block; - margin-top: -7px; -} - -.mapstore-annotations-panel .form-group .input-group .input-group-addon { +#ms-annotations-editor-target { position: absolute; - z-index: 2; - right: 0; - border-color: transparent; - background-color: transparent; -} - -.mapstore-annotations-panel .form-group .input-group { width: 100%; - margin-top: 10px; -} - -.extra-marker { - cursor: inherit; -} - -.ms-marker-selected { - border-width: 2px; - border-style: solid; -} - -.mapstore-annotations-info-viewer .annotations-edit-error { - margin-left: 10px; -} - -.mapstore-annotations-info-viewer > .annotations-edit-error { - height: 22px; - border-bottom-width: 1px; - margin-bottom: 10px; + height: 100%; + padding: 8px; + overflow: auto; } -.mapstore-annotations-info-viewer { - font-size: 13px; - .measure-feature-select { - display: flex; - align-items: center; - margin-bottom: 8px; - justify-content: flex-end; +.ms-features-editor { + position: relative; + display: flex; + flex: 1 1 0%; + height: 100%; + .ms-style-rules-editor-head, + .coordinates-editor .measure-feature-selector { + position: sticky; + top: 0; + z-index: 200; + padding: 8px 0; } + .coordinates-row-container { - font-size: @font-size-small; - flex: 1 1 auto; - overflow: hidden auto; - .glyphicon-menu-hamburger{ - font-size: 14px; - display: table-cell; - vertical-align: middle; + > div + div { + margin-top: 8px; + padding-top: 8px; + border-top: 1px solid transparent; } - .coordinateRow.aeronautical{ - span.react-numeric-input{ - width: 100% - } - .input-group-addon { - padding: 4px 6px; - } + } + .coordinateRow { + .input-group-container + .input-group-container { + margin-top: 4px; } } - .mapstore-annotations-info-viewer-items { - padding: 8px; - height: ~'calc(100% - 50px)'; + + .ms-annotations-label-input { + padding: 8px 4px; + } + .ms-features-editor-list { + width: 250px; + position: relative; + display: flex; overflow: auto; - .geometries-toolbar { + height: 100%; + flex-direction: column; + margin-right: 4px; + .ms-features-editor-list-header { display: flex; justify-content: space-between; - align-items: center; - position: sticky; - top: 0; - z-index: 10; } - .geometry-card { - .shadow-soft; - display: flex; + .ms-features-editor-list-body { + flex: 1 1 0%; + overflow: auto; + list-style: none; + margin: 0px; + padding: 4px; position: relative; - width: 100%; - align-items: center; - margin: 8px 0; - padding-right: 8px; - - &:hover { - cursor: pointer; - transition: 0.3s box-shadow; - .shadow-far; - z-index: 1; - } - - &.ms-selected { - border-width: 2px; - border-style: solid; - } - - .geometry-card-preview { - width: @square-btn-medium-size; - height: @square-btn-medium-size; - margin: 8px; - display: flex; - align-items: center; - justify-content: center; - - .glyphicon { - font-size: (@square-btn-medium-size * 2 / 3); - } - } - - .geometry-card-label { - flex: 1; - font-size: @annotation-feature-font-size; - overflow: hidden; - padding: 8px; - - > * { - font-size: @annotation-feature-font-size; - white-space: nowrap; - text-overflow: ellipsis; - overflow-x: hidden; - width: 150px; - } - - > * * { - display: inline-block; - margin: 0; - } - } - } - - .mapstore-annotations-info-viewer-item { - margin-bottom: 10px; - label { - font-size: @annotation-feature-font-size; - } - } - - .mapstore-annotations-info-viewer-description { - .quill { - max-width: 315px; - .ql-toolbar { - font-family: inherit; - - .ql-header { - border-radius: 4px; - border-width: 1px; - border-style: solid; - } - - .ql-formats { - margin-right: 5px; - margin-bottom: 5px; - } - - button { - border-width: 1px; - border-style: solid; - border-radius: 4px; - margin-right: 4px; - } - } - - .ql-container { - min-height: 130px; - font-family: @font-family-base; - font-size: @annotation-feature-font-size; - } - } } } - .mapstore-annotations-info-viewer-expanded { + .ms-features-editor-list-empty { + padding: 0.5rem; + text-align: center; + } + + .ms-features-editor-tools { flex: 1; - order: 2; - border-right-width: 1px; - border-right-style: solid; - display: flex; position: relative; - width: 100%; + display: flex; + overflow: auto; height: 100%; flex-direction: column; - .tab-container{ - flex: 1; - padding-top: 8px; - padding-right: 8px; + margin-right: 4px; + .ms-features-editor-tools-body { + flex: 1 1 0%; + overflow: auto; + list-style: none; + margin: 0px; + padding: 4px; + padding-top: 0; position: relative; - overflow-y: auto; - overflow-x: hidden; - } - .ms-style-manager { - .Select *{ - font-size: inherit !important; - } - .Select-value { - padding-left: 5px !important; - } - .Select-menu-outer { - z-index: 2 !important; - } - .ms-marker-preview canvas { - width: 100%; - } - .input-group-addon { - padding: 5px; - } - .Select-arrow-zone .Select-arrow { - margin-right: -10px; - } - } - .panel-title { - font-size: inherit; - } - .panel { - border-width: 1px; - border-style: solid; - } - .ms-dragg:first-child { - padding-top: 8px; - border-top-width: 1px; - border-top-style: solid; - } - .ms-dragg + .ms-dragg { - padding-top: 8px; - margin-top: 8px; - border-top-width: 1px; - border-top-style: solid; - } - .ms-dragg:last-child { - padding-bottom: 8px; - border-bottom-width: 1px; - border-bottom-style: solid; - } - .coordinateRow.decimal { - input { - min-width: 100px; - } - } - .coordinateRow { - padding-left: 2px; - margin: 0; - .coordinate { - display: flex; - flex: 1; - justify-content: space-between; - flex-wrap: wrap; - > div { - flex: 1; - padding: 4px 0; - margin-right: 2px; - } - .input-group { - width: 100%; - .form-group{ - input#intl-numeric{ - float: unset; - } - .minutes, .degrees { - min-width: 45px; - flex: 1; - display: flex; - } - .seconds { - display: flex; - flex: 1; - min-width: 80px; - } - } - } - } + border-left: 1px solid transparent; } } -} - -.mapstore-annotations-info-viewer-buttons { - min-height: 45px; - box-shadow: none; -} - -// ANNOTATIONS ADDITION -- JAN 2018 -.ms-annotations-panel { - .form-group { - margin: 0; - } - .ms-header { - z-index: 10; - .row { - margin-bottom: 15px; - &:first-child { - padding: 0; - display: flex; - .col-xs-2 { - padding: 0; - width: auto; - } - .col-xs-8 { - flex: 1; - padding: 0; - align-self: center; - text-align: center; - } - } - } - .shadow-soft; - .ms-style-header { - padding: 0; - .col-xs-12 { - padding: 0; - } + .ms-features-editor-tools-empty { + flex: 1 1 0%; + position: relative; + display: flex; + overflow: auto; + height: 100%; + flex-direction: column; + border-left: 1px solid transparent; + align-items: center; + justify-content: center; + padding: 8px; + text-align: center; + .glyphicon { + font-size: 64px; } } - - .ms2-border-layout-content { - .row { - &:first-child { - margin-top: 8px; - } - margin-bottom: 8px; - } - .noTopMargin.row { - &:first-child { - margin-top: 0px; - } - } - - .msSideGrid { - height: ~'calc(100% - 171px)'; - overflow: auto; - .mapstore-side-preview { - display: flex; - & > span { - font-size: @icon-size * 2; - margin: auto; - } - } - .mapstore-side-card-desc { - height: @square-btn-size; - overflow: hidden; - } + .ms-features-editor-item { + cursor: pointer; + display: flex; + align-items: center; + position: relative; + padding: 4px; + margin: 4px 0px; + border: 1px solid transparent; + input { + width: 100%; + border-top: none; + border-right: none; + border-bottom: 1px solid transparent; + border-left: none; + border-image: initial; } - - .ms-preview { - flex: 1; - display: flex; - height: 100%; - flex-direction: column; - h4 { - border-bottom-width: 1px; - border-bottom-style: solid; - } - .ql-editor { - padding-top: 0; - padding-bottom: 0; - } - .row { - &:last-child { - flex: 1; - overflow-y: auto; - margin-bottom: 0; - } - } + .glyphicon { + padding: 0 4px; } - - .ms-edit { - flex: 1; + .btn-group { display: flex; - height: 100%; - flex-direction: column; - .row { - &:last-child { - flex: 1; - overflow-y: auto; - - flex: 1; - display: flex; - flex-direction: column; - - #ms-ann-description-editor { - flex: 1; - display: flex; - .quill { - flex: 1; - display: flex; - flex-direction: column; - .ql-container { - flex: 1; - overflow-y: auto; - } - } - } - } + .btn-default { + border-color: transparent; } } } -} - -// TODO MOVE THIS TO A PROEPR LESS FILE -.ms-thumb-geom { - svg { - margin: auto; - } - width: @square-btn-size; - height: @square-btn-size; -} - - -.mapstore-annotations-info-viewer-items .col-xs-6 .btn-group { - span button:nth-child(2) { - background-color: transparent; - cursor: auto; - } -} - -.mapstore-annotations-info-viewer .container-fluid .container-fluid .row { - .row:hover{ - cursor: pointer; - } -} - -.ms-dragg.ms-below .coordinateRow, .ms-dragg.ms-above .coordinateRow { - &:hover{ - cursor: pointer; - } -} - -.mapstore-identify-viewer { - .mapstore-annotations-info-viewer { - .mapstore-annotations-info-viewer-buttons { - -webkit-box-shadow: none; - box-shadow: none; - } - } - .mapstore-annotations-info-viewer+.mapstore-annotations-info-viewer { - .mapstore-annotations-info-viewer-buttons { - border-top-width: 1px; - border-top-style: solid; - padding-top: 5px; - margin-top: 5px; + .ms-coordinates-editor-radius { + padding: 0 4px !important; // there is an inline style + .form-group { + margin: 0; } } } -.coordinateRow { +.ms-annotations-panel { + .shadow-soft(); + position: absolute; display: flex; - align-items: center; - box-sizing: border-box; - border: 0; - font-family: @font-family-monospace; - .col-xs-5, .col-xs-1 { - padding: 0; - float: unset; - width: auto; - margin: 0 4px; + flex-direction: column; + top: 0px; + left: 0px; + width: 600px; + z-index: 1030; + background: rgb(255, 255, 255); + overflow: auto; + .ms-annotations-panel-header { + display: flex; + align-items: center; + .ms-annotations-title { + flex: 1; + padding: 0px 0.5rem; + font-size: @font-size-large; + text-align: center; + } } - .form-group { - width: 100%; + .ms-annotations-panel-nav { + button { + position: absolute; + right: 0; + margin: 6px; + } } - .col-xs-5 { + .ms-annotations-panel-body { flex: 1; - .form-group { - margin: 4px 0; + position: relative; + .ms-annotations-panel-content { + position: absolute; + width: 100%; + height: 100%; + padding: 8px 16px; + overflow: auto; } } - input { - font-size: @font-size-small; - } - .glyphicon-menu-hamburger { - width: 10px; - overflow: hidden; - } } -.ms-dragging { - opacity: 0.5; -} - -.ms-over { - box-sizing: border-box; - .coordinateRow { - border-width: 1px; - border-style: solid; - } - &.ms-above { - .coordinateRow { - border-bottom-width: 2px; - } - - } - &.ms-below { - .coordinateRow { - border-top-width: 2px; +.ms-annotations-fields.preview { + padding: 8px 0; + .ms-annotations-field { + margin-bottom: 8px; + .ms-annotations-field-label { + font-weight: bold; } - } - &.ms-dragging { - .coordinateRow { - border-width: 1px; - border-style: solid; + iframe { + width: 100%; + aspect-ratio: 16 / 9; } } } - -.modal-dialog-container{ - border: none; -} - -.label-texts { - display: flex; - flex-direction: column; - align-items: center; - font-weight: 600; - padding: 10px; -} - -.marker-container{ - .marker-icon, .marker-shape { - display: flex; - flex-wrap: wrap; - align-items: center; - padding: 4px 0; - } -} diff --git a/web/client/themes/default/less/common.less b/web/client/themes/default/less/common.less index 61922c85b5..c9549d4991 100644 --- a/web/client/themes/default/less/common.less +++ b/web/client/themes/default/less/common.less @@ -332,3 +332,7 @@ div#sync-popover.popover { } } } + +.form-control.intl-numeric { + float: unset; +} diff --git a/web/client/themes/default/less/legacy-annotations.less b/web/client/themes/default/less/legacy-annotations.less new file mode 100644 index 0000000000..cea4a3594c --- /dev/null +++ b/web/client/themes/default/less/legacy-annotations.less @@ -0,0 +1,864 @@ +// +// Copyright 2021, GeoSolutions Sas. +// All rights reserved. +// +// This source code is licensed under the BSD-style license found in the +// LICENSE file in the root directory of this source tree. +// + +// ************** +// Theme +// ************** +#ms-components-theme(@theme-vars) { + + .annotations-edit-error { + .color-var(@theme-vars[danger]); + } + + .ms-marker-shape-content, + .ms-marker-icon-content, + #mapstore-annotations-panel { + .background-color-var(@theme-vars[main-bg]); + } + + .ms-marker-selected { + .border-color-var(@theme-vars[focus-color]); + } + + .mapstore-annotations-info-viewer-marker-selected { + .border-color-var(@theme-vars[danger]); + } + + .mapstore-annotations-info-viewer>.annotations-edit-error { + .border-color-var(@theme-vars[main-border-color]); + } + + .ql-disabled { + .background-color-var(@theme-vars[main-variant-bg]); + } + + .mapstore-annotations-info-viewer { + .mapstore-annotations-info-viewer-items { + .geometry-card { + &.ms-selected { + .border-color-var(@theme-vars[focus-color]); + } + &.ms-disabled { + cursor: not-allowed; + .background-color-var(@theme-vars[disabled-bg]); + } + } + } + + .mapstore-annotations-info-viewer-expanded { + .border-right-color-var(@theme-vars[main-border-color]); + + .panel { + .border-color-var(@theme-vars[main-border-color]); + } + + .ms-dragg:first-child { + .border-top-color-var(@theme-vars[main-border-color]); + } + + .ms-dragg+.ms-dragg { + .border-top-color-var(@theme-vars[main-border-color]); + } + + .ms-dragg:last-child { + .border-bottom-color-var(@theme-vars[main-border-color]); + } + } + } + + .ms-annotations-panel { + .ms2-border-layout-content { + .ms-preview { + h4 { + .border-bottom-color-var(@theme-vars[main-border-color]); + } + } + } + } + + .mapstore-annotations-info-viewer .container-fluid .container-fluid .row { + .row:hover { + + input, + select, + .col-xs-5 span { + .color-var(@theme-vars[primary]); + } + } + } + + .ms-dragg.ms-below .coordinateRow, + .ms-dragg.ms-above .coordinateRow { + & { + .background-color-var(@theme-vars[main-bg]); + } + + &:hover { + + input, + select, + .col-xs-5 span { + .color-var(@theme-vars[primary]); + } + } + } + + .mapstore-identify-viewer { + .mapstore-annotations-info-viewer.hover-background:hover { + .background-color-var(@theme-vars[main-bg]); + } + + .mapstore-annotations-info-viewer+.mapstore-annotations-info-viewer { + .mapstore-annotations-info-viewer-buttons { + .border-top-color-var(@theme-vars[main-border-color]); + } + } + } + + .ms-over { + .coordinateRow { + .border-color-var(@theme-vars[primary]); + } + + &.ms-dragging { + .coordinateRow { + .border-color-var(@theme-vars[main-border-color]); + } + } + } +} +// ************** +// Layout +// ************** +@annotation-feature-font-size: 13px; +#mapstore-annotations-info-viewer-edit-buttons { + float: right; +} + +.ms-property-picker-overlay { + position: fixed; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 9999; +} + +.ms-property-picker-cover { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; +} + +.mapstore-annotations-info-viewer-marker { + float: left; + margin-top: 10px; + margin-bottom: 10px; + margin-right: 5px; + cursor: pointer; +} + +.mapstore-annotations-info-viewer-styler { + min-height: 600px; + .mapstore-switch-panel { + .shadow-soft; + border: none; + padding: 8px; + } + .mapstore-annotations-info-viewer-styler-container { + .ms2-border-layout-content { + overflow: auto; + position: relative; + } + } + + .ms-style { + .Select { + border-radius: 0; + > * { + border-radius: 0; + } + width: 100%; + margin: 0; + } + .Select-menu-outer { + z-index: 2 !important; + .shadow-soft; + } + .row { + display: flex; + align-items: center; + } + } +} + +.mapstore-annotations-info-viewer-styler .Select { + clear: both; + margin-top: 10px; + margin-bottom: 10px; + width: 50%; + margin-left: auto; + margin-right: auto; +} + +#mapstore-annotations-panel { + margin-bottom: 0; +} +#mapstore-annotations-panel .items-list.row { + margin: 5px 10px; +} + +.mapstore-annotations-panel-cards { + height: ~'calc(100% - 50px)'; + overflow: auto; +} + +.mapstore-annotations-panel { + height: 100%; +} +.annotations-empty-panel{ + padding: 10px; + font-style: italic; + text-align: center; +} +#ms-annotations-panel-card{ + .msSideGrid{ + margin: 0; + width: 100%; + } + .col-xs-12{ + padding-left: 0; + padding-right: 0; + } + .mapstore-side-preview{ + align-items: center; + } + .mapstore-annotations-panel-card{ + width: 32px; + height: 32px; + margin: 8px; + display: flex; + align-items: center; + justify-content: center; + font-size: 21px; + } + .mapstore-side-card-info{ + padding: 0; + } + .mapstore-side-card-title{ + font-weight: normal; + margin-bottom: 0; + } + .mapstore-annotations-panel-card-title{ + margin-top: 5px; + text-overflow: ellipsis; + width: 150px; + overflow: hidden; + } + .mapstore-side-card-desc{ + border-bottom: none; + height: auto; + } + .mapstore-annotations-panel-card-description { + margin: 5px 0 0; + text-overflow: ellipsis; + width: 150px; + white-space: nowrap; + overflow: hidden; + } +} + +.mapstore-annotations-panel-card-thumbnail { + float: left; + width: 40px; + height: 100%; + padding-top: 15px; +} + +.extra-marker .marker-selected:after { + font-family: 'mapstore2'; + .glyphicon-record-content(); + position: absolute; + top: -18px; + left: 8px; + font-size: 18px; + color: purple; + text-shadow: 2px 0 0 #fff, -2px 0 0 #fff, 0 2px 0 #fff, 0 -2px 0 #fff, 1px 1px #fff, -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff; +} + +.mapstore-annotations-info-viewer .ql-editor { + max-height: 130px; +} + +#mapstore-annotations-panel .mapstore-annotations-info-viewer { + height: 100%; +} +#mapstore-annotations-panel .ms2-border-layout-body { + height: 100%; +} + +#mapstore-annotations-panel .ms2-border-layout-body { + overflow: hidden !important; +} + +.mapstore-annotations-info-viewer-marker-group { + clear: both; +} + +.mapstore-right-panel .ql-tooltip, #mapstore-annotations-panel .ql-tooltip { + left: 0 !important; + top: 0 !important; +} + +.mapstore-right-panel .react-swipeable-view-container > div { + position: relative; + height: 100%; +} + +.mapstore-right-panel .react-swipeable-view-container .panel.panel-default { + max-height: 100% !important; + height: 100%; + position: absolute; +} +.mapstore-right-panel .react-swipeable-view-container .panel.panel-default .panel-body { + height: ~'calc(100% - 60px)'; +} + +.mapstore-right-panel .mapstore-json-viewer, .mapstore-right-panel .mapstore-annotations-info-viewer { + height: 100%; +} + +.mapstore-annotations-panel-card-thumbnail:before { + color: white; + font-size: 16px; + margin-left: 8px; + margin-left: 8px; + display: block; + margin-top: -7px; +} + +.mapstore-annotations-panel .form-group .input-group .input-group-addon { + position: absolute; + z-index: 2; + right: 0; + border-color: transparent; + background-color: transparent; +} + +.mapstore-annotations-panel .form-group .input-group { + width: 100%; + margin-top: 10px; +} + +.extra-marker { + cursor: inherit; +} + +.ms-marker-selected { + border-width: 2px; + border-style: solid; +} + +.mapstore-annotations-info-viewer .annotations-edit-error { + margin-left: 10px; +} + +.mapstore-annotations-info-viewer > .annotations-edit-error { + height: 22px; + border-bottom-width: 1px; + margin-bottom: 10px; +} + +.mapstore-annotations-info-viewer { + font-size: 13px; + .measure-feature-select { + display: flex; + align-items: center; + margin-bottom: 8px; + justify-content: flex-end; + } + .coordinates-row-container { + font-size: @font-size-small; + flex: 1 1 auto; + overflow: hidden auto; + .glyphicon-menu-hamburger{ + font-size: 14px; + display: table-cell; + vertical-align: middle; + } + .coordinateRow.aeronautical{ + span.react-numeric-input{ + width: 100% + } + .input-group-addon { + padding: 4px 6px; + } + } + } + .mapstore-annotations-info-viewer-items { + padding: 8px; + height: ~'calc(100% - 50px)'; + overflow: auto; + .geometries-toolbar { + display: flex; + justify-content: space-between; + align-items: center; + position: sticky; + top: 0; + z-index: 10; + } + .geometry-card { + .shadow-soft; + display: flex; + position: relative; + width: 100%; + align-items: center; + margin: 8px 0; + padding-right: 8px; + + &:hover { + cursor: pointer; + transition: 0.3s box-shadow; + .shadow-far; + z-index: 1; + } + + &.ms-selected { + border-width: 2px; + border-style: solid; + } + + .geometry-card-preview { + width: @square-btn-medium-size; + height: @square-btn-medium-size; + margin: 8px; + display: flex; + align-items: center; + justify-content: center; + + .glyphicon { + font-size: (@square-btn-medium-size * 2 / 3); + } + } + + .geometry-card-label { + flex: 1; + font-size: @annotation-feature-font-size; + overflow: hidden; + padding: 8px; + + > * { + font-size: @annotation-feature-font-size; + white-space: nowrap; + text-overflow: ellipsis; + overflow-x: hidden; + width: 150px; + } + + > * * { + display: inline-block; + margin: 0; + } + } + } + + .mapstore-annotations-info-viewer-item { + margin-bottom: 10px; + label { + font-size: @annotation-feature-font-size; + } + } + + .mapstore-annotations-info-viewer-description { + .quill { + max-width: 315px; + .ql-toolbar { + font-family: inherit; + + .ql-header { + border-radius: 4px; + border-width: 1px; + border-style: solid; + } + + .ql-formats { + margin-right: 5px; + margin-bottom: 5px; + } + + button { + border-width: 1px; + border-style: solid; + border-radius: 4px; + margin-right: 4px; + } + } + + .ql-container { + min-height: 130px; + font-family: @font-family-base; + font-size: @annotation-feature-font-size; + } + } + } + } + .mapstore-annotations-info-viewer-expanded { + flex: 1; + order: 2; + border-right-width: 1px; + border-right-style: solid; + display: flex; + position: relative; + width: 100%; + height: 100%; + flex-direction: column; + .tab-container{ + flex: 1; + padding-top: 8px; + padding-right: 8px; + position: relative; + overflow-y: auto; + overflow-x: hidden; + } + .ms-style-manager { + .Select *{ + font-size: inherit !important; + } + .Select-value { + padding-left: 5px !important; + } + .Select-menu-outer { + z-index: 2 !important; + } + .ms-marker-preview canvas { + width: 100%; + } + .input-group-addon { + padding: 5px; + } + .Select-arrow-zone .Select-arrow { + margin-right: -10px; + } + } + .panel-title { + font-size: inherit; + } + .panel { + border-width: 1px; + border-style: solid; + } + .ms-dragg:first-child { + padding-top: 8px; + border-top-width: 1px; + border-top-style: solid; + } + .ms-dragg + .ms-dragg { + padding-top: 8px; + margin-top: 8px; + border-top-width: 1px; + border-top-style: solid; + } + .ms-dragg:last-child { + padding-bottom: 8px; + border-bottom-width: 1px; + border-bottom-style: solid; + } + .coordinateRow.decimal { + input { + min-width: 100px; + } + } + .coordinateRow { + padding-left: 2px; + margin: 0; + .coordinate { + display: flex; + flex: 1; + justify-content: space-between; + flex-wrap: wrap; + > div { + flex: 1; + padding: 4px 0; + margin-right: 2px; + } + .input-group { + width: 100%; + .form-group{ + input#intl-numeric{ + float: unset; + } + .minutes, .degrees { + min-width: 45px; + flex: 1; + display: flex; + } + .seconds { + display: flex; + flex: 1; + min-width: 80px; + } + } + } + } + } + } +} + +.mapstore-annotations-info-viewer-buttons { + min-height: 45px; + box-shadow: none; +} + +// ANNOTATIONS ADDITION -- JAN 2018 +.ms-annotations-panel { + .form-group { + margin: 0; + } + .ms-header { + z-index: 10; + .row { + margin-bottom: 15px; + &:first-child { + padding: 0; + display: flex; + .col-xs-2 { + padding: 0; + width: auto; + } + .col-xs-8 { + flex: 1; + padding: 0; + align-self: center; + text-align: center; + } + } + } + .shadow-soft; + + .ms-style-header { + padding: 0; + .col-xs-12 { + padding: 0; + } + } + } + + .ms2-border-layout-content { + .row { + &:first-child { + margin-top: 8px; + } + margin-bottom: 8px; + } + .noTopMargin.row { + &:first-child { + margin-top: 0px; + } + } + + .msSideGrid { + height: ~'calc(100% - 171px)'; + overflow: auto; + .mapstore-side-preview { + display: flex; + & > span { + font-size: @icon-size * 2; + margin: auto; + } + } + .mapstore-side-card-desc { + height: @square-btn-size; + overflow: hidden; + } + } + + .ms-preview { + flex: 1; + display: flex; + height: 100%; + flex-direction: column; + h4 { + border-bottom-width: 1px; + border-bottom-style: solid; + } + .ql-editor { + padding-top: 0; + padding-bottom: 0; + } + .row { + &:last-child { + flex: 1; + overflow-y: auto; + margin-bottom: 0; + } + } + } + + .ms-edit { + flex: 1; + display: flex; + height: 100%; + flex-direction: column; + .row { + &:last-child { + flex: 1; + overflow-y: auto; + + flex: 1; + display: flex; + flex-direction: column; + + #ms-ann-description-editor { + flex: 1; + display: flex; + .quill { + flex: 1; + display: flex; + flex-direction: column; + .ql-container { + flex: 1; + overflow-y: auto; + } + } + } + } + } + } + } +} + +// TODO MOVE THIS TO A PROEPR LESS FILE +.ms-thumb-geom { + svg { + margin: auto; + } + width: @square-btn-size; + height: @square-btn-size; +} + + +.mapstore-annotations-info-viewer-items .col-xs-6 .btn-group { + span button:nth-child(2) { + background-color: transparent; + cursor: auto; + } +} + +.mapstore-annotations-info-viewer .container-fluid .container-fluid .row { + .row:hover{ + cursor: pointer; + } +} + +.ms-dragg.ms-below .coordinateRow, .ms-dragg.ms-above .coordinateRow { + &:hover{ + cursor: pointer; + } +} + +.mapstore-identify-viewer { + .mapstore-annotations-info-viewer { + .mapstore-annotations-info-viewer-buttons { + -webkit-box-shadow: none; + box-shadow: none; + } + } + .mapstore-annotations-info-viewer+.mapstore-annotations-info-viewer { + .mapstore-annotations-info-viewer-buttons { + border-top-width: 1px; + border-top-style: solid; + padding-top: 5px; + margin-top: 5px; + } + } +} + +.coordinateRow { + display: flex; + align-items: center; + box-sizing: border-box; + border: 0; + font-family: @font-family-monospace; + .col-xs-5, .col-xs-1 { + padding: 0; + float: unset; + width: auto; + margin: 0 4px; + } + .form-group { + width: 100%; + } + .col-xs-5 { + flex: 1; + .form-group { + margin: 4px 0; + } + } + input { + font-size: @font-size-small; + } + .glyphicon-menu-hamburger { + width: 10px; + overflow: hidden; + } +} + +.ms-dragging { + opacity: 0.5; +} + +.ms-over { + box-sizing: border-box; + .coordinateRow { + border-width: 1px; + border-style: solid; + } + &.ms-above { + .coordinateRow { + border-bottom-width: 2px; + } + + } + &.ms-below { + .coordinateRow { + border-top-width: 2px; + } + } + &.ms-dragging { + .coordinateRow { + border-width: 1px; + border-style: solid; + } + } +} + +.modal-dialog-container{ + border: none; +} + +.label-texts { + display: flex; + flex-direction: column; + align-items: center; + font-weight: 600; + padding: 10px; +} + +.marker-container{ + .marker-icon, .marker-shape { + display: flex; + flex-wrap: wrap; + align-items: center; + padding: 4px 0; + } +} diff --git a/web/client/themes/default/svg/add-comment.svg b/web/client/themes/default/svg/add-comment.svg new file mode 100644 index 0000000000..5b1fe28ab9 --- /dev/null +++ b/web/client/themes/default/svg/add-comment.svg @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + version="1.1" + viewBox="0 -240 1200 1200" + id="svg6" + sodipodi:docname="add-comment.svg" + inkscape:version="1.1 (c68e22c387, 2021-05-23)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1017" + id="namedview8" + showgrid="false" + inkscape:zoom="0.27812867" + inkscape:cx="253.4798" + inkscape:cy="1163.1307" + inkscape:window-x="3832" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:current-layer="layer2" + showguides="false" + inkscape:pagecheckerboard="0" /> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="glyph"> + <path + id="path823-5" + style="stroke-width:1" + d="M 950 120 C 938.66667 120 928.83333 124 920.5 132 C 912.16667 140 908 149.33333 908 160 L 908 330 L 741 330 C 729.66667 330 720 333.66667 712 341 C 704 348.33333 700 357.83333 700 369.5 C 700 381.16667 704 391 712 399 C 720 407 729.66667 411 741 411 L 908 411 L 908 580 C 908 591.33333 912.16667 600.83333 920.5 608.5 C 928.83333 616.16667 938.66667 620 950 620 C 961.33333 620 971 616.16667 979 608.5 C 987 600.83333 991 591.33333 991 580 L 991 411 L 1160 411 C 1170.6667 411 1180 407 1188 399 C 1196 391 1200 381.16667 1200 369.5 C 1200 357.83333 1196 348.33333 1188 341 C 1180 333.66667 1170.6667 330 1160 330 L 991 330 L 991 160 C 991 149.33333 987 140 979 132 C 971 124 961.33333 120 950 120 z M 78.853516 566 C 57.324992 566 38.79986 573.01073 23.279297 587.0293 C 7.7587341 601.04787 0 618.56979 0 639.59766 L 0 1012.0918 C 0 1033.1197 7.7587341 1051.2688 23.279297 1066.5391 C 38.79986 1081.8092 57.324992 1089.4434 78.853516 1089.4434 L 156.20703 1089.4434 L 156.20703 1320 L 359.72656 1089.4434 L 849.375 1089.4434 C 871.40419 1089.4434 889.92932 1081.8092 904.94922 1066.5391 C 919.96912 1051.2688 927.47852 1033.1197 927.47852 1012.0918 L 927.47852 721.95898 C 923.89748 721.40284 920.30699 720.89255 916.77734 720.07031 C 889.20345 713.70606 863.504 699.25472 843.96094 678.75977 C 824.41007 658.46381 810.70745 632.75142 804.10742 605.39453 C 804.10102 592.26302 804.09444 579.13151 804.08789 566 L 78.853516 566 z " + transform="translate(0,-240)" /> + </g> +</svg> diff --git a/web/client/themes/default/svg/download-comment.svg b/web/client/themes/default/svg/download-comment.svg new file mode 100644 index 0000000000..c299e92f8b --- /dev/null +++ b/web/client/themes/default/svg/download-comment.svg @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + version="1.1" + viewBox="0 -240 1200 1200" + id="svg6" + sodipodi:docname="download-comment.svg" + inkscape:version="1.1 (c68e22c387, 2021-05-23)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1017" + id="namedview8" + showgrid="false" + inkscape:zoom="0.27812867" + inkscape:cx="217.52522" + inkscape:cy="584.26195" + inkscape:window-x="3832" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:current-layer="layer2" + showguides="false" + inkscape:pagecheckerboard="0" /> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="glyph"> + <path + id="path2" + d="M 105 231 C 76.333333 231 51.666667 240.33333 31 259 C 10.333333 277.66667 0 301 0 329 L 0 825 C 0 853 10.333333 877.16667 31 897.5 C 51.666667 917.83333 76.333333 928 105 928 L 208 928 L 208 1235 L 479 928 L 1131 928 C 1160.3333 928 1185 917.83333 1205 897.5 C 1225 877.16667 1235 853 1235 825 L 1235 329 C 1235 304.33333 1225 281.83333 1205 261.5 C 1185 241.16667 1160.3333 231 1131 231 L 105 231 z M 532 322.49219 L 658 322.49219 L 658 607.49219 L 759 497.49219 C 785.66667 466.15886 811.66667 463.49219 837 489.49219 C 869.66667 516.15886 871.33333 545.49219 842 577.49219 L 601 845.49219 L 356 577.49219 C 346.66667 566.15886 342 551.82552 342 534.49219 C 342 517.15886 348.66667 502.15886 362 489.49219 C 390 463.49219 416.33333 466.15886 441 497.49219 L 532 593.49219 L 532 322.49219 z " + transform="translate(0,-240)" /> + </g> +</svg> diff --git a/web/client/translations/data.de-DE.json b/web/client/translations/data.de-DE.json index 6fd2334090..2bea3d6ab8 100644 --- a/web/client/translations/data.de-DE.json +++ b/web/client/translations/data.de-DE.json @@ -29,6 +29,7 @@ "collapse": "Zuklappen", "Links": "Links", "Forbidden": "Verboten", + "height": "Höhe", "layerNameChangeError": { "title": "Namensänderungsfehler", "message": "Die Ebene konnte nicht mit einem geänderten Namen neu geladen werden" @@ -1282,7 +1283,10 @@ }, "geometryError": "Geometriekonfiguration ist ungültig", "annotationSaveGeometryError": "Das Speichern ist aufgrund einer ungültigen Geometrie deaktiviert. Bitte korrigieren Sie dies, um die Anmerkung zu speichern", - "resolveAllErrors": "Bitte beheben Sie alle Validierungsfehler, bevor Sie andere Geometrien bearbeiten" + "resolveAllErrors": "Bitte beheben Sie alle Validierungsfehler, bevor Sie andere Geometrien bearbeiten", + "selectAnnotationFeature": "Wählen Sie im linken Bereich ein Anmerkungsfeature aus, um Koordinaten und Stile zu bearbeiten", + "properties": "Eigenschaften", + "deactivatedMapInteraction": "Die Interaktionen zum Zeichnen von Anmerkungen wurden deaktiviert, da das Plugin '{pluginName}' aktiviert wurde. Bitte schließen Sie das Plugin '{pluginName}', um die Interaktionen zum Zeichnen von Anmerkungen zu aktivieren." }, "user":{ "login": "Login", diff --git a/web/client/translations/data.en-US.json b/web/client/translations/data.en-US.json index c781c30ad2..affe9cbbd5 100644 --- a/web/client/translations/data.en-US.json +++ b/web/client/translations/data.en-US.json @@ -30,6 +30,7 @@ "expand": "Expand", "Links": "Links", "Forbidden": "Forbidden", + "height": "Height", "layerNameChangeError": { "title": "Name change error", "message": "The layer failed to reload with a changed name" @@ -1173,7 +1174,7 @@ "empty": "No annotations yet, click on [+] to add annotations", "add": "New", "filter": "Filter annotations...", - "undo": "Are you sure you want to abandon the annotation editing session?", + "undo": "Are you sure you want to abandon the annotation editing session? Invalid features will be removed after closing", "titleUndoGeom": "The geometry has changed", "undoGeom": "Are you sure to exit without saving? (You will lose any changes)", "confirmGeom": "Confirm", @@ -1243,7 +1244,10 @@ }, "geometryError": "Geometry configuration is invalid", "annotationSaveGeometryError": "Saving is disabled due to invalid geometry, please fix it to save the annotation", - "resolveAllErrors": "Please fix any validation errors before editing other geometries" + "resolveAllErrors": "Please fix any validation errors before editing other geometries", + "selectAnnotationFeature": "Select an annotation feature on the left panel to edit coordinates and styles", + "properties": "Properties", + "deactivatedMapInteraction": "The annotation drawing interactions has been deactivated because the '{pluginName}' plugin has been activated. Please close the '{pluginName}' plugin to activate the annotations drawing interactions" }, "user":{ "login": "Login", diff --git a/web/client/translations/data.es-ES.json b/web/client/translations/data.es-ES.json index d373214f7c..0cc1f54501 100644 --- a/web/client/translations/data.es-ES.json +++ b/web/client/translations/data.es-ES.json @@ -30,6 +30,7 @@ "expand": "Expandir", "Links": "Enlaces", "Forbidden": "Prohibido", + "height": "Altura", "layerNameChangeError": { "title": "Error de cambio de nombre", "message": "La capa no se pudo recargar con un nombre cambiado" @@ -1243,7 +1244,10 @@ }, "geometryError": "La configuración de geometría no es válida", "annotationSaveGeometryError": "El guardado está deshabilitado debido a una geometría no válida, corríjalo para guardar la anotación", - "resolveAllErrors": "Corrija los errores de validación antes de editar otras geometrías" + "resolveAllErrors": "Corrija los errores de validación antes de editar otras geometrías", + "selectAnnotationFeature": "Seleccione una característica de anotación en el panel izquierdo para editar coordenadas y estilos", + "properties": "Propiedades", + "deactivatedMapInteraction": "Las interacciones de dibujo de anotaciones se han desactivado porque el complemento '{pluginName}' ha sido activado. Cierra el complemento '{pluginName}' para activar las interacciones de dibujo de anotaciones" }, "user":{ "login": "Iniciar sesión", diff --git a/web/client/translations/data.fr-FR.json b/web/client/translations/data.fr-FR.json index 8958ca2bc0..204c74f332 100644 --- a/web/client/translations/data.fr-FR.json +++ b/web/client/translations/data.fr-FR.json @@ -30,6 +30,7 @@ "expand": "étendre", "Links": "Liens", "Forbidden": "Interdit", + "height": "Hauteur", "layerNameChangeError": { "title": "Erreur de changement de nom", "message": "Échec du rechargement de la couche avec un nom modifié" @@ -1243,7 +1244,10 @@ }, "geometryError": "La configuration de la géométrie n'est pas valide", "annotationSaveGeometryError": "L'enregistrement est désactivé en raison d'une géométrie non valide, veuillez le corriger pour enregistrer l'annotation", - "resolveAllErrors": "Veuillez corriger les erreurs de validation avant de modifier d'autres géométries" + "resolveAllErrors": "Veuillez corriger les erreurs de validation avant de modifier d'autres géométries", + "selectAnnotationFeature": "Sélectionnez une entité d'annotation sur le panneau de gauche pour modifier les coordonnées et les styles", + "properties": "Propriétés", + "deactivatedMapInteraction": "Les interactions de dessin d'annotations ont été désactivées car le plugin '{pluginName}' a été activé. Veuillez fermer le plugin '{pluginName}' pour activer les interactions de dessin d'annotations" }, "user": { "login": "Connexion", diff --git a/web/client/translations/data.it-IT.json b/web/client/translations/data.it-IT.json index 91f42104fb..73f70e87af 100644 --- a/web/client/translations/data.it-IT.json +++ b/web/client/translations/data.it-IT.json @@ -30,6 +30,7 @@ "expand": "Espandi", "Links": "Collegamenti", "Forbidden": "Vietato", + "height": "Altezza", "layerNameChangeError": { "title": "Errore di modifica del nome", "message": "Il livello non è stato ricaricato con un nome modificato" @@ -1243,7 +1244,10 @@ }, "geometryError": "La configurazione della geometria non è valida", "annotationSaveGeometryError": "Il salvataggio è disabilitato a causa di una geometria non valida, correggilo per salvare l'annotazione", - "resolveAllErrors": "Si prega di correggere gli errori prima di modificare altre geometrie" + "resolveAllErrors": "Si prega di correggere gli errori prima di modificare altre geometrie", + "selectAnnotationFeature": "Selezionare una geometria annotation nel pannello di sinistra per editare coordinate e stili", + "properties": "Proprietà", + "deactivatedMapInteraction": "Le interazioni di disegno delle annotazioni sono state disattivate perchè il '{pluginName}' plugin è stato attivato. Chiudere il '{pluginName}' plugin per attivare le interazioni di disegno delle annotazioni" }, "user":{ "login": "Login", diff --git a/web/client/utils/ControlUtils.js b/web/client/utils/ControlUtils.js index a2009c5f54..a8ff559bf5 100644 --- a/web/client/utils/ControlUtils.js +++ b/web/client/utils/ControlUtils.js @@ -9,7 +9,6 @@ import {setControlProperty} from "../actions/controls"; import Rx from "rxjs"; import {createControlEnabledSelector} from "../selectors/controls"; -import {START_DRAWING} from "../actions/annotations"; import {CHANGE_DRAWING_STATUS} from "../actions/draw"; import {REGISTER_EVENT_LISTENER} from "../actions/map"; import {OPEN_FEATURE_GRID} from "../actions/featuregrid"; @@ -27,7 +26,7 @@ export const shutdownToolOnAnotherToolDrawing = (action$, store, toolName, apply = (state, tool) => Rx.Observable.from([setControlProperty(tool, "enabled", null)]), isActiveCallback = (state, name) => createControlEnabledSelector(name)(state) ) => - action$.ofType(START_DRAWING, CHANGE_DRAWING_STATUS, REGISTER_EVENT_LISTENER, OPEN_FEATURE_GRID) + action$.ofType(CHANGE_DRAWING_STATUS, REGISTER_EVENT_LISTENER, OPEN_FEATURE_GRID) .filter(({type, status, owner, eventName, toolName: name}) => { const isActive = isActiveCallback(store.getState(), toolName); switch (type) { @@ -38,7 +37,6 @@ export const shutdownToolOnAnotherToolDrawing = (action$, store, toolName, case CHANGE_DRAWING_STATUS: return isActive && (status === 'drawOrEdit' || status === 'start') && owner !== toolName; - case START_DRAWING: default: return isActive && toolName !== 'annotations'; } diff --git a/web/client/utils/LayersUtils.js b/web/client/utils/LayersUtils.js index 8270cae194..a251c981f4 100644 --- a/web/client/utils/LayersUtils.js +++ b/web/client/utils/LayersUtils.js @@ -21,6 +21,7 @@ import isNil from 'lodash/isNil'; import get from 'lodash/get'; import { addAuthenticationParameter } from './SecurityUtils'; import { getEPSGCode } from './CoordinatesUtils'; +import { isAnnotationLayer } from '../plugins/Annotations/utils/AnnotationsUtils'; let LayersUtils; @@ -652,6 +653,7 @@ export const saveLayer = (layer) => { layer.tileGrids ? { tileGrids: layer.tileGrids } : {}, layer.tileGridStrategy ? { tileGridStrategy: layer.tileGridStrategy } : {}, layer.tileGridCacheSupport ? { tileGridCacheSupport: layer.tileGridCacheSupport } : {}, + isString(layer.rowViewer) ? { rowViewer: layer.rowViewer } : {}, !isNil(layer.forceProxy) ? { forceProxy: layer.forceProxy } : {}, !isNil(layer.disableFeaturesEditing) ? { disableFeaturesEditing: layer.disableFeaturesEditing } : {}); }; @@ -863,6 +865,12 @@ export const hasWFSService = ({type, search = {}} = {}) => type === 'wfs' // pure WFS layer || (type === 'wms' && search.type === 'wfs'); // WMS backed by WFS (search) +export const getLayerTypeGlyph = (layer) => { + if (isAnnotationLayer(layer)) { + return 'comment'; + } + return ''; +}; LayersUtils = { getGroupByName, diff --git a/web/client/utils/AnnotationsUtils.js b/web/client/utils/LegacyAnnotationsUtils.js similarity index 100% rename from web/client/utils/AnnotationsUtils.js rename to web/client/utils/LegacyAnnotationsUtils.js diff --git a/web/client/utils/MarkerUtils.js b/web/client/utils/MarkerUtils.js index 060f396033..aaf6656705 100644 --- a/web/client/utils/MarkerUtils.js +++ b/web/client/utils/MarkerUtils.js @@ -34,6 +34,7 @@ const loadGlyphs = (font) => { const extraMarkers = { size: [36, 46], + margin: [3, 2], colors: ['red', 'orange-dark', 'orange', 'yellow', 'blue-dark', 'blue', 'cyan', 'purple', 'violet', 'pink', 'green-dark', 'green', 'green-light', 'black'], shapes: ['circle', 'square', 'star', 'penta'], @@ -42,8 +43,15 @@ const extraMarkers = { }; const getOffsets = (color, shape) => { - return [-extraMarkers.colors.indexOf(color) * extraMarkers.size[0] - 2, -extraMarkers.shapes.indexOf(shape) * extraMarkers.size[1]]; + return [ + -extraMarkers.colors.indexOf(color) * extraMarkers.size[0], + -extraMarkers.shapes.indexOf(shape) * extraMarkers.size[1] + ]; }; +const getGlyphOffset = (shape) => { + return ['square', 'penta'].includes(shape) ? 6 : 5; +}; + const MarkerUtils = { extraMarkers: { ...extraMarkers, @@ -51,16 +59,17 @@ const MarkerUtils = { markerToDataUrl: ({ iconColor, iconShape, iconGlyph }) => { if (MarkerUtils.extraMarkers.images) { let canvas = document.createElement('canvas'); + const margin = extraMarkers.margin; const size = extraMarkers.size; - canvas.width = size[0]; - canvas.height = size[1]; - // const c = document.getElementById("container"); - // c.insertBefore(canvas, c.children[0]) + const width = size[0] - (margin[0] * 2); + const height = size[1] - (margin[1] * 2); + canvas.width = width; + canvas.height = height; const ctx = canvas.getContext("2d"); if (iconShape) { const offSet = getOffsets(iconColor, iconShape); - ctx.drawImage(extraMarkers.images[0], 4, 31, 35, 16); // shadowImage - ctx.drawImage(extraMarkers.images[1], Math.abs(offSet[0]), Math.abs(offSet[1]), size[0], size[1], 0, 0, size[0], size[1]); // iconImage + ctx.drawImage(extraMarkers.images[0], 0, 0, width, height); // shadowImage + ctx.drawImage(extraMarkers.images[1], Math.abs(offSet[0]), Math.abs(offSet[1]), size[0], size[1], -margin[0], -margin[1], size[0], size[1]); // iconImage } if (iconGlyph) { // glyph @@ -68,7 +77,7 @@ const MarkerUtils = { ctx.fillStyle = "rgb(255,255,255)"; ctx.textBaseline = "middle"; ctx.textAlign = "center"; - ctx.fillText((MarkerUtils.getGlyphs("fontawesome"))[iconGlyph] || '', (size[0] / 2) - 2, (size[1] / 2) - 7); + ctx.fillText((MarkerUtils.getGlyphs("fontawesome"))[iconGlyph] || '', (width / 2), (height / 2) - getGlyphOffset(iconShape)); } const data = canvas.toDataURL("image/png"); canvas = null; diff --git a/web/client/utils/MeasureUtils.js b/web/client/utils/MeasureUtils.js index 2e5a611407..e13f9fae0f 100644 --- a/web/client/utils/MeasureUtils.js +++ b/web/client/utils/MeasureUtils.js @@ -33,6 +33,9 @@ export const defaultUnitOfMeasure = { }; export const measureIcons = { + [MeasureTypes.LENGTH]: '1-measure-length', + [MeasureTypes.AREA]: '1-measure-area', + [MeasureTypes.BEARING]: '1-measure-bearing', [MeasureTypes.POLYLINE_DISTANCE_3D]: 'polyline-3d', [MeasureTypes.AREA_3D]: 'polygon-3d', [MeasureTypes.POINT_COORDINATES]: 'point-coordinates', @@ -82,6 +85,22 @@ export const mapUomAreaToLength = { sqnm: { value: 'nm', label: 'nm' } }; +export const mapUomLabels = { + ft: 'ft', + m: 'm', + km: 'km', + mi: 'mi', + nm: 'nm', + sqft: 'ft²', + sqm: 'm²', + sqkm: 'km²', + sqmi: 'mi²', + sqnm: 'nm²', + deg: '°', + rad: 'rad', + percentage: '%' +}; + export function degToDms(deg) { // convert decimal deg to minutes and seconds var d = Math.floor(deg); diff --git a/web/client/utils/MeasurementUtils.js b/web/client/utils/MeasurementUtils.js index f0297fa976..4baff5ee96 100644 --- a/web/client/utils/MeasurementUtils.js +++ b/web/client/utils/MeasurementUtils.js @@ -6,27 +6,172 @@ * LICENSE file in the root directory of this source tree. */ -import {round, flatten, startCase, uniq, get} from 'lodash'; +import { round, flatten, uniq, get, isEqual } from 'lodash'; import uuidv1 from 'uuid/v1'; - -import {getStartEndPointsForLinestring, DEFAULT_ANNOTATIONS_STYLES} from '../utils/AnnotationsUtils'; -import {convertUom, getFormattedBearingValue, validateFeatureCoordinates, MeasureTypes, defaultUnitOfMeasure} from './MeasureUtils'; -import {transformLineToArcs} from './CoordinatesUtils'; +import turfArea from '@turf/area'; +import { + createAnnotationId, + ANNOTATIONS +} from '../plugins/Annotations/utils/AnnotationsUtils'; +import { + convertUom, + getFormattedBearingValue, + MeasureTypes, + defaultUnitOfMeasure, + mapUomLabels +} from './MeasureUtils'; +import { + calculateDistance, + transformLineToArcs, + calculateAzimuth +} from './CoordinatesUtils'; export const MEASURE_TYPE = 'Measure'; const getFormattedValue = (uom, value) => ({ - "length": round(convertUom(value, "m", uom.length.label) || 0, 2) + " " + uom.length.label, - "area": round(convertUom(value, "sqm", uom.area.label) || 0, 2) + " " + uom.area.label, - "bearing": getFormattedBearingValue(round(value || 0, 6)).toString() + [MeasureTypes.LENGTH]: round(convertUom(value, "m", uom.length.label) || 0, 2) + " " + uom.length.label, + [MeasureTypes.AREA]: round(convertUom(value, "sqm", uom.area.label) || 0, 2) + " " + uom.area.label, + [MeasureTypes.BEARING]: getFormattedBearingValue(round(value || 0, 6)).toString() }); -const getMeasurementProps = (features) =>{ - const geomTypes = uniq(features.map(f=> get(f, "properties.values[0].type", ''))); - if (geomTypes.length > 1) { - return {title: 'Multiple Measurement', iconGlyph: 'geometry-collection'}; +const computeSegments = (coordinates, feature, options = {}) => { + if (coordinates.length <= 2) { + return []; + } + return coordinates.reduce((acc, coord, idx) => { + if (coordinates[idx + 1] && !isEqual(coord, coordinates[idx + 1])) { + const arc = transformLineToArcs([ + coord, + coordinates[idx + 1] + ]); + const pointCoordinates = arc[Math.floor(arc.length / 2)]; + if (!pointCoordinates) { + return acc; + } + const value = calculateDistance([ + coord, + coordinates[idx + 1] + ], options.lengthFormula); + const convertedValue = (feature.properties.lengthTargetUom + ? convertUom(value, 'm', feature.properties.lengthTargetUom) + : value) || 0; + const uomLabel = mapUomLabels[feature.properties.lengthTargetUom || 'm']; + const id = uuidv1(); + return [ + ...acc, + { + type: 'Feature', + id, + geometry: { + type: 'Point', + coordinates: pointCoordinates + }, + properties: { + type: 'segment', + label: `${options.formatNumber(round(convertedValue, 2))} ${uomLabel}`, + id, + measureId: feature.id || feature.properties.id + } + } + ]; + } + return acc; + }, []); +}; + +export const computeFeatureMeasurement = (feature, options = { formatNumber: n => n }) => { + if (feature.properties.measureType === MeasureTypes.LENGTH) { + const value = calculateDistance(feature.geometry.coordinates, options.lengthFormula); + const convertedValue = (feature.properties.lengthTargetUom + ? convertUom(value, 'm', feature.properties.lengthTargetUom) + : value) || 0; + const uomLabel = mapUomLabels[feature.properties.lengthTargetUom || 'm']; + const segments = computeSegments(feature.geometry.coordinates, feature, options); + return [ + { + ...feature, + properties: { + ...feature?.properties, + length: value, + label: `${options.formatNumber(round(convertedValue, 2))} ${uomLabel}` + } + }, + ...segments + ]; } - return {title: MEASURE_TYPE + ' ' + startCase(geomTypes[0]), iconGlyph: '1-measure-' + geomTypes[0]}; + if (feature.properties.measureType === MeasureTypes.AREA) { + const coordinates = feature.geometry.coordinates[0] + .filter((coords, idx) => idx < (feature.geometry.coordinates[0].length - 1)); + const length = calculateDistance(coordinates, options.lengthFormula); + const convertedLengthValue = (feature.properties.lengthTargetUom + ? convertUom(length, 'm', feature.properties.lengthTargetUom) + : length) || 0; + const lengthUomLabel = mapUomLabels[feature.properties.lengthTargetUom || 'm']; + const lengthLabel = `${options.formatNumber(round(convertedLengthValue, 2))} ${lengthUomLabel}`; + // result different from ol getArea + const area = turfArea(feature); + const convertedAreaValue = (feature.properties.areaTargetUom + ? convertUom(area, 'sqm', feature.properties.areaTargetUom) + : area) || 0; + const areaUomLabel = mapUomLabels[feature.properties.areaTargetUom || 'sqm']; + const areaLabel = `${options.formatNumber(round(convertedAreaValue, 2))} ${areaUomLabel}`; + const segments = computeSegments(coordinates, feature, options); + return [ + { + ...feature, + properties: { + ...feature?.properties, + length, + area, + label: `${areaLabel}\n${lengthLabel}` + } + }, + ...segments + ]; + } + if (feature.properties.measureType === MeasureTypes.BEARING) { + const vertices = feature.geometry.coordinates.reduce((acc, coords, idx) => { + const nextCoords = feature.geometry.coordinates[idx + 1]; + if (nextCoords) { + const value = calculateAzimuth( + coords, + nextCoords, + 'EPSG:4326'); + const id = uuidv1(); + return [ + ...acc, + { + type: 'Feature', + id, + geometry: { + type: 'Point', + coordinates: nextCoords + }, + properties: { + type: 'segment', + bearing: value, + label: getFormattedBearingValue(round(value || 0, 6), { + measureTrueBearing: options.trueBearing, + fractionDigits: options.bearingFractionDigits + }).toString(), + id, + measureId: feature.id || feature.properties.id + } + } + ]; + } + return acc; + }, []); + return [{ + ...feature, + properties: { + ...feature?.properties, + bearings: vertices.map(({ properties }) => properties.bearing), + label: vertices.map(({ properties }) => properties.label).join(' | ') + } + }, ...vertices]; + } + return [feature]; }; export const getGeomTypeSelected = (features = []) =>{ @@ -38,118 +183,6 @@ export const getGeomTypeSelected = (features = []) =>{ })); }; -const STYLE_TEXT_LABEL = { - offsetY: 1, - fontSize: '10', - fontSizeUom: 'px', - fontFamily: 'Courier New', - font: "10px Courier New", - textAlign: 'center', - color: '#000000', - opacity: 1, - fillColor: '#000000', - fillOpacity: 1 -}; - -const STYLE_TEXT_LABEL_BIGGER = { - offsetY: -15, - fontSize: '13', - fontSizeUom: 'px', - fontFamily: 'Courier New', - font: "13px Courier New", - textAlign: 'center', - color: '#000000', - opacity: 1, - fillColor: '#000000', - fillOpacity: 1 -}; - -const convertGeometryToGeoJSON = (feature, uom, measureValueStyle) => { - const actualMeasureValueStyle = measureValueStyle || STYLE_TEXT_LABEL_BIGGER; - const isBearing = !!feature.properties?.values?.find(val=>val.type === 'bearing'); - return [{ - type: 'Feature', - geometry: { - type: feature.geometry.type, - coordinates: validateFeatureCoordinates(feature.geometry), - textLabels: feature.geometry.textLabels - }, - properties: { - id: uuidv1(), - isValidFeature: true, - // Transform only the linestring of type not bearing - geometryGeodesic: feature.geometry.type === 'LineString' && !isBearing ? {type: "LineString", coordinates: transformLineToArcs(feature.geometry.coordinates)} : null, - useGeodesicLines: feature.geometry.type === 'LineString' && !isBearing, - values: feature.properties?.values || [] - }, - style: [{ - ...DEFAULT_ANNOTATIONS_STYLES[feature.geometry.type], - type: feature.geometry.type, - id: uuidv1(), - geometry: feature.geometry.type === 'LineString' && !isBearing ? "lineToArc" : null, - title: `${feature.geometry.type} Style`, - filtering: true - }].concat(feature.geometry.type === "LineString" ? getStartEndPointsForLinestring() : []) - }, ...feature.properties.values.map(({value, formattedValue, type, position}) => ({ - type: 'Feature', - geometry: { - type: 'Point', - coordinates: position - }, - properties: { - valueText: formattedValue || getFormattedValue(uom, value)[type], - isText: true, - isValidFeature: true, - id: uuidv1() - }, - style: { - ...actualMeasureValueStyle, - id: uuidv1(), - filtering: true, - title: "Text Style", - type: "Text" - } - }))]; -}; - -export const convertMeasuresToAnnotation = (geometricFeatures, textLabels, uom, id, description, measureValueStyle) => { - const measureProps = getMeasurementProps(geometricFeatures); - return { - type: "FeatureCollection", - features: [ - ...flatten(geometricFeatures.map(feature => convertGeometryToGeoJSON(feature, uom, measureValueStyle))), - ...textLabels.filter(textLabel => !!textLabel).map(({text, position}) => ({ - type: 'Feature', - geometry: { - type: 'Point', - coordinates: position - }, - properties: { - valueText: text, - isValidFeature: true, - isText: true, - id: uuidv1() - }, - style: { - ...STYLE_TEXT_LABEL, - id: uuidv1(), - filtering: true, - title: "Text Style", - type: "Text" - } - })) - ], - properties: { - id, - description, - type: MEASURE_TYPE, - title: measureProps.title, - iconGlyph: measureProps.iconGlyph - }, - style: {} - }; -}; - const getMeasureType = (feature) => { if (feature?.properties?.measureType) { return feature.properties.measureType; @@ -181,6 +214,7 @@ const parseProperties = (values = [], uom) => { ...acc, [`${value.type}`]: value.value, [`${value.type}Uom`]: unit, + [`${value.type}TargetUom`]: uom[value.type]?.unit, label: value.formattedValue ? value.formattedValue : uom @@ -190,8 +224,7 @@ const parseProperties = (values = [], uom) => { }, {}); }; -export const convertMeasuresToGeoJSON = (geometricFeatures, textLabels = [], uom) => { - +const convertMeasureToFeatureCollection = (geometricFeatures, textLabels = [], uom) => { const features = flatten(geometricFeatures.map((feature, idx) => { // textLabels inside the feature geometry are not updated based on the selected format // so we need the global textLabels properties for 2D measurement @@ -267,7 +300,244 @@ export const convertMeasuresToGeoJSON = (geometricFeatures, textLabels = [], uom })) ]; })); + return { + type: 'FeatureCollection', + features + }; +}; + +export const convertMeasuresToAnnotation = (geometricFeatures, textLabels, uom, id, description) => { + const { features } = convertMeasureToFeatureCollection(geometricFeatures, textLabels, uom); + const annotationsFeatures = features + .reduce((acc, feature) => { + const newFeature = { + ...feature, + id: feature.properties.id, + properties: { + ...feature.properties, + ...(feature?.properties?.measureType + && { + annotationType: feature.geometry.type, + name: feature?.properties?.measureType + }) + } + }; + if (feature?.properties?.measureType === MeasureTypes.BEARING) { + return [...acc, ...computeFeatureMeasurement(newFeature)]; + } + return [...acc, newFeature]; + }, []); + const rules = annotationsFeatures.reduce((acc, feature) => { + if (feature.properties.annotationType) { + return [ + ...acc, + ...(![MeasureTypes.POINT_COORDINATES].includes(feature.properties.measureType) ? [{ + ruleId: uuidv1(), + name: 'Start position', + filter: ['==', 'id', feature.properties.id], + symbolizers: [ + { + symbolizerId: uuidv1(), + kind: 'Mark', + msGeometry: { + name: 'startPoint' + }, + wellKnownName: 'Circle', + color: '#008000', + fillOpacity: 1, + radius: 3, + rotate: 0, + msBringToFront: true, + msHeightReference: 'none' + } + ] + }] : []), + ...(![MeasureTypes.POINT_COORDINATES].includes(feature.properties.measureType) ? [{ + ruleId: uuidv1(), + name: 'End position', + filter: ['==', 'id', feature.properties.id], + symbolizers: [ + { + symbolizerId: uuidv1(), + kind: 'Mark', + msGeometry: { + name: 'endPoint' + }, + wellKnownName: 'Circle', + color: '#ff0000', + fillOpacity: 1, + radius: 3, + rotate: 0, + msBringToFront: true, + msHeightReference: 'none' + } + ] + }] : []), + ...([MeasureTypes.BEARING].includes(feature.properties.measureType) ? [{ + ruleId: uuidv1(), + name: '', + filter: ['==', 'id', feature.properties.id], + mandatory: true, + symbolizers: [ + { + symbolizerId: uuidv1(), + kind: 'Line', + color: '#ffcc33', + width: 3, + opacity: 1, + cap: 'round', + join: 'round', + msClampToGround: false + } + ] + }] : []), + ...([MeasureTypes.LENGTH].includes(feature.properties.measureType) ? [{ + ruleId: uuidv1(), + name: '', + filter: ['==', 'id', feature.properties.id], + mandatory: true, + symbolizers: [ + { + symbolizerId: uuidv1(), + kind: 'Line', + msGeometry: { + name: 'lineToArc' + }, + color: '#FF9548', + width: 3, + opacity: 1, + cap: 'round', + join: 'round', + msClampToGround: false + } + ] + }] : []), + ...([MeasureTypes.AREA].includes(feature.properties.measureType) ? [{ + ruleId: uuidv1(), + name: 'Area measurement', + filter: ['==', 'id', feature.properties.id], + mandatory: true, + symbolizers: [ + { + symbolizerId: uuidv1(), + kind: 'Fill', + color: '#ffffff', + fillOpacity: 0.5, + outlineColor: '#33A8FF', + outlineOpacity: 1, + outlineWidth: 3, + msClassificationType: 'both', + msClampToGround: false + } + ] + }] : []), + ...([MeasureTypes.AREA, MeasureTypes.LENGTH].includes(feature.properties.measureType) ? [{ + ruleId: uuidv1(), + name: 'Segment labels', + filter: ['==', 'measureId', feature.properties.id], + mandatory: true, + symbolizers: [ + { + symbolizerId: uuidv1(), + kind: 'Text', + color: '#000000', + size: 10, + fontStyle: 'italic', + fontWeight: 'normal', + haloColor: '#444444', + haloWidth: 0.5, + allowOverlap: true, + offset: [0, 0], + msBringToFront: true, + msHeightReference: 'none', + label: '{{label}}', + font: ['Arial'], + opacity: 1 + } + ] + }] : []), + ...([MeasureTypes.AREA, MeasureTypes.LENGTH].includes(feature.properties.measureType) ? [{ + ruleId: uuidv1(), + name: 'Measurement label', + filter: ['==', 'id', feature.properties.id], + mandatory: true, + symbolizers: [ + { + symbolizerId: uuidv1(), + kind: 'Text', + color: '#000000', + size: 13, + fontStyle: 'normal', + fontWeight: 'bold', + haloColor: '#FFFFFF', + haloWidth: 3, + allowOverlap: true, + anchor: 'bottom', + msBringToFront: true, + msHeightReference: 'none', + label: '{{label}}', + font: ['Arial'], + opacity: 1, + offset: [0, 0], + msGeometry: { + name: 'endPoint' + } + } + ] + }] : []), + ...([MeasureTypes.BEARING].includes(feature.properties.measureType) ? [{ + ruleId: uuidv1(), + name: 'Segment labels', + filter: ['==', 'measureId', feature.properties.id], + mandatory: true, + symbolizers: [ + { + symbolizerId: uuidv1(), + kind: 'Text', + color: '#000000', + size: 13, + fontStyle: 'normal', + fontWeight: 'bold', + haloColor: '#FFFFFF', + haloWidth: 3, + allowOverlap: true, + anchor: 'bottom', + msBringToFront: true, + msHeightReference: 'none', + label: '{{label}}', + font: ['Arial'], + opacity: 1, + offset: [0, 0], + msGeometry: { + name: 'endPoint' + } + } + ] + }] : []) + ]; + } + return acc; + }, []); + return { + id: createAnnotationId(`${id}`), + type: 'vector', + title: MEASURE_TYPE, + description, + features: annotationsFeatures, + rowViewer: ANNOTATIONS, + style: { + format: 'geostyler', + body: { + name: '', + rules + } + } + }; +}; + +export const convertMeasuresToGeoJSON = (geometricFeatures, textLabels = [], uom) => { + const { features } = convertMeasureToFeatureCollection(geometricFeatures, textLabels, uom); const measureTypes = uniq(features.map(feature => feature?.properties?.measureType).filter(measureType => !!measureType)); return { @@ -482,7 +752,7 @@ export const convertMeasuresToGeoJSON = (geometricFeatures, textLabels = [], uom haloColor: '#FFFFFF', haloWidth: 3, allowOverlap: true, - offset: [0, -12], + anchor: 'bottom', msBringToFront: true, msHeightReference: 'none', label: '{{label}}', diff --git a/web/client/utils/PrintUtils.js b/web/client/utils/PrintUtils.js index 26dcbfb1fa..5d33b61b57 100644 --- a/web/client/utils/PrintUtils.js +++ b/web/client/utils/PrintUtils.js @@ -11,7 +11,6 @@ import { reproject, getUnits, reprojectGeoJson, normalizeSRS } from './Coordinat import {addAuthenticationParameter} from './SecurityUtils'; import { calculateExtent, getGoogleMercatorScales, getResolutionsForProjection, getScales, reprojectZoom } from './MapUtils'; import { optionsToVendorParams } from './VendorParamsUtils'; -import { annotationsToPrint } from './AnnotationsUtils'; import { colorToHexStr } from './ColorUtils'; import { getLayerConfig } from './TileConfigProvider'; import { extractValidBaseURL } from './TileProviderUtils'; @@ -47,10 +46,6 @@ export const getGeomType = function(layer) { layer.features && layer.features[0].features && layer.features[0].style && layer.features[0].style.type ? layer.features[0].style.type : undefined; }; -export const isAnnotationLayer = (layer) => { - return layer.id === "annotations" || layer.name === "Measurements"; -}; - /** * Utility functions for thumbnails * @memberof utils @@ -598,11 +593,9 @@ export const specCreators = { }, geoJson: reprojectGeoJson({ type: "FeatureCollection", - features: (isAnnotationLayer(layer) || !layer.style) - ? annotationsToPrint(layer.features) - : layer?.style?.format === 'geostyler' && layer?.style?.body - ? printStyleParser.writeStyle(layer.style.body, true)({ layer, spec }) - : layer.features.map( f => ({...f, properties: {...f.properties, ms_style: f && f.geometry && f.geometry.type && f.geometry.type.replace("Multi", "") || 1}})) + features: layer?.style?.format === 'geostyler' && layer?.style?.body + ? printStyleParser.writeStyle(layer.style.body, true)({ layer, spec }) + : layer.features.map( f => ({...f, properties: {...f.properties, ms_style: f && f.geometry && f.geometry.type && f.geometry.type.replace("Multi", "") || 1}})) }, "EPSG:4326", spec.projection) diff --git a/web/client/utils/VectorStyleUtils.js b/web/client/utils/VectorStyleUtils.js index c890df3f49..41ebf42a22 100644 --- a/web/client/utils/VectorStyleUtils.js +++ b/web/client/utils/VectorStyleUtils.js @@ -407,6 +407,7 @@ function msStyleToSymbolizer(style, feature) { rotate: 0, msHeightReference: 'none', msBringToFront: true, + anchor: 'bottom', // only needed for get feature info marker ...(style.leaderLine && { msLeaderLineColor: '#333333', diff --git a/web/client/utils/__tests__/AnnotationsUtils-test.js b/web/client/utils/__tests__/LegacyAnnotationsUtils-test.js similarity index 99% rename from web/client/utils/__tests__/AnnotationsUtils-test.js rename to web/client/utils/__tests__/LegacyAnnotationsUtils-test.js index 9fdc11e4db..ab2ffc6c0e 100644 --- a/web/client/utils/__tests__/AnnotationsUtils-test.js +++ b/web/client/utils/__tests__/LegacyAnnotationsUtils-test.js @@ -47,7 +47,7 @@ import { getGeometryType, getGeometryGlyphInfo, modifySelectedInEdited -} from '../AnnotationsUtils'; +} from '../LegacyAnnotationsUtils'; const featureCollection = { features: [{ diff --git a/web/client/utils/__tests__/MarkerUtils-test.js b/web/client/utils/__tests__/MarkerUtils-test.js index 0c3b90abeb..60bec715ef 100644 --- a/web/client/utils/__tests__/MarkerUtils-test.js +++ b/web/client/utils/__tests__/MarkerUtils-test.js @@ -23,9 +23,9 @@ describe('Test the MarkerUtils', () => { MarkerUtils.extraMarkers.images[1] = old; }); it('extraMarker offsets', () => { - expect(MarkerUtils.extraMarkers.getOffsets(MarkerUtils.extraMarkers.colors[0], MarkerUtils.extraMarkers.shapes[0])).toEqual([-2, 0]); - expect(MarkerUtils.extraMarkers.getOffsets(MarkerUtils.extraMarkers.colors[1], MarkerUtils.extraMarkers.shapes[0])).toEqual([-(MarkerUtils.extraMarkers.size[0] + 2), 0]); - expect(MarkerUtils.extraMarkers.getOffsets(MarkerUtils.extraMarkers.colors[1], MarkerUtils.extraMarkers.shapes[1])).toEqual([-(MarkerUtils.extraMarkers.size[0] + 2), -MarkerUtils.extraMarkers.size[1]]); + expect(MarkerUtils.extraMarkers.getOffsets(MarkerUtils.extraMarkers.colors[0], MarkerUtils.extraMarkers.shapes[0])).toEqual([-0, -0]); + expect(MarkerUtils.extraMarkers.getOffsets(MarkerUtils.extraMarkers.colors[1], MarkerUtils.extraMarkers.shapes[0])).toEqual([-(MarkerUtils.extraMarkers.size[0]), 0]); + expect(MarkerUtils.extraMarkers.getOffsets(MarkerUtils.extraMarkers.colors[1], MarkerUtils.extraMarkers.shapes[1])).toEqual([-(MarkerUtils.extraMarkers.size[0]), -MarkerUtils.extraMarkers.size[1]]); }); it('extraMarker matches', () => { diff --git a/web/client/utils/__tests__/MeasurementUtils-test.js b/web/client/utils/__tests__/MeasurementUtils-test.js index 592db623f7..2a26646f6b 100644 --- a/web/client/utils/__tests__/MeasurementUtils-test.js +++ b/web/client/utils/__tests__/MeasurementUtils-test.js @@ -28,6 +28,7 @@ const testUom = { describe('MeasurementUtils', () => { const features = [{ type: "Feature", + id: 'measure-01', geometry: { type: "LineString", coordinates: [ @@ -42,6 +43,7 @@ describe('MeasurementUtils', () => { ] }, properties: { + id: 'measure-01', values: [ { value: 2456862.991, @@ -56,38 +58,33 @@ describe('MeasurementUtils', () => { } }]; it('convertMeasuresToAnnotation with LineString', () => { - const geoJson = convertMeasuresToAnnotation(features, [], testUom, 'id'); - - expect(geoJson).toBeTruthy(); - expect(geoJson.type).toBe('FeatureCollection'); - expect(geoJson.properties).toBeTruthy(); - expect(geoJson.properties.id).toBe('id'); - expect(geoJson.properties.title).toBe('Measure Length'); - expect(geoJson.properties.type).toBe('Measure'); - expect(geoJson.properties.iconGlyph).toBe('1-measure-length'); - expect(geoJson.features).toBeTruthy(); - expect(geoJson.features.length).toBe(2); - expect(geoJson.features[0].type).toBe('Feature'); - expect(geoJson.features[0].geometry).toBeTruthy(); - expect(geoJson.features[0].geometry.type).toBe('LineString'); - expect(geoJson.features[0].geometry.coordinates).toEqual(features[0].geometry.coordinates); - expect(geoJson.features[0].properties).toBeTruthy(); - expect(geoJson.features[0].properties.geometryGeodesic).toBeTruthy(); - expect(geoJson.features[0].properties.id).toBeTruthy(); - expect(geoJson.features[0].properties.id.length).toBe(36); - expect(geoJson.features[0].properties.useGeodesicLines).toBe(true); - expect(geoJson.features[0].properties.isValidFeature).toBe(true); - expect(geoJson.features[0].style).toBeTruthy(); - expect(geoJson.features[1].type).toBe('Feature'); - expect(geoJson.features[1].geometry).toBeTruthy(); - expect(geoJson.features[1].geometry.type).toBe('Point'); - expect(geoJson.features[1].geometry.coordinates).toEqual(features[0].properties.values[0].position); - expect(geoJson.features[1].properties).toBeTruthy(); - expect(geoJson.features[1].properties.id).toBeTruthy(); - expect(geoJson.features[1].properties.id.length).toBe(36); - expect(geoJson.features[1].properties.isText).toBe(true); - expect(geoJson.features[1].properties.isValidFeature).toBe(true); - expect(geoJson.features[1].properties.valueText).toBe(features[0].properties.values[0].formattedValue); + const layer = convertMeasuresToAnnotation(features, [], testUom, 'id'); + expect(layer).toBeTruthy(); + expect(layer.id).toBe('annotations:id'); + expect(layer.type).toBe('vector'); + expect(layer.title).toBe('Measure'); + expect(layer.rowViewer).toBe('annotations'); + expect(layer.features.length).toBe(1); + expect(layer.features[0].type).toBe('Feature'); + expect(layer.features[0].geometry).toBeTruthy(); + expect(layer.features[0].geometry.type).toBe('LineString'); + expect(layer.features[0].geometry.coordinates).toEqual(features[0].geometry.coordinates); + const { id, ...properties } = layer.features[0].properties; + expect(properties).toEqual({ + label: '2,456,862.99 m', + geodesic: true, + length: 2456862.991, + lengthUom: 'm', + lengthTargetUom: 'm', + type: 'measurement', + measureType: 'length', + annotationType: 'LineString', + name: 'length' + }); + expect(layer.style.body.rules.length).toBe(5); + expect(layer.style.body.rules.map(({ symbolizers }) => symbolizers[0].kind)).toEqual([ + 'Mark', 'Mark', 'Line', 'Text', 'Text' + ]); }); it('getGeomTypeSelected', ()=>{ @@ -611,6 +608,7 @@ describe('MeasurementUtils', () => { geodesic: true, length: 1953.316, lengthUom: 'm', + lengthTargetUom: 'm', type: 'measurement', measureType: MeasureTypes.LENGTH }); @@ -799,8 +797,10 @@ describe('MeasurementUtils', () => { geodesic: false, length: 7614.5289999999995, lengthUom: 'm', + lengthTargetUom: 'm', area: 1644850.6921266892, areaUom: 'sqm', + areaTargetUom: 'sqm', type: 'measurement', measureType: MeasureTypes.AREA }); @@ -872,6 +872,7 @@ describe('MeasurementUtils', () => { geodesic: false, bearing: 311.0662463199936, bearingUom: 'deg', + bearingTargetUom: 'deg', type: 'measurement', measureType: MeasureTypes.BEARING }); diff --git a/web/client/utils/__tests__/PrintUtils-test.js b/web/client/utils/__tests__/PrintUtils-test.js index 053372a526..8de7f02c66 100644 --- a/web/client/utils/__tests__/PrintUtils-test.js +++ b/web/client/utils/__tests__/PrintUtils-test.js @@ -141,9 +141,10 @@ const featureLine = { ] }, "properties": { + "id": "feature-1", "serial_num": "12C324776" }, - "id": 0 + "id": "feature-1" }; const featureCollection = { @@ -189,17 +190,33 @@ const annotationsVectorLayer = { "type": "vector", "visibility": true, "group": "Local shape", - "id": "annotations", - "name": "web2014all_mv", + "id": "annotations:1", + "title": "Annotations", "hideLoading": true, - "features": [featureCollection], + "features": featureCollection?.features, + "rowViewer": "annotations", "style": { - "weight": 3, - "radius": 10, - "opacity": 1, - "fillOpacity": 0.1, - "color": "rgb(0, 0, 255)", - "fillColor": "rgb(0, 0, 255)" + "format": "geostyler", + "body": { + "name": "Annotations", + "rules": [ + { + "filter": ["==", "id", featureCollection?.features?.[0]?.id], + "name": "", + "symbolizers": [ + { + "kind": "Line", + "color": 'rgb(0, 0, 255)', + "width": 3, + "opacity": 1, + "cap": "round", + "join": "round", + "msClampToGround": true + } + ] + } + ] + } } }; @@ -210,14 +227,29 @@ const measurementVectorLayer = { "id": "aaa", "name": "Measurements", "hideLoading": true, - "features": [featureCollection], + "features": featureCollection?.features, "style": { - "weight": 3, - "radius": 10, - "opacity": 1, - "fillOpacity": 0.1, - "color": "rgb(0, 0, 255)", - "fillColor": "rgb(0, 0, 255)" + "format": "geostyler", + "body": { + "name": "Annotations", + "rules": [ + { + "filter": ["==", "id", featureCollection?.features?.[0]?.id], + "name": "", + "symbolizers": [ + { + "kind": "Line", + "color": 'rgb(0, 0, 255)', + "width": 3, + "opacity": 1, + "cap": "round", + "join": "round", + "msClampToGround": true + } + ] + } + ] + } } }; let vector2 = { ...vectorLayer }; diff --git a/web/client/utils/cesium/ModifyGeoJSONInteraction.js b/web/client/utils/cesium/ModifyGeoJSONInteraction.js index 8ffde32ce3..f30211f8ec 100644 --- a/web/client/utils/cesium/ModifyGeoJSONInteraction.js +++ b/web/client/utils/cesium/ModifyGeoJSONInteraction.js @@ -54,6 +54,10 @@ function featureToCartesianCoordinates(geometryType, feature) { } } +function updateCoordinatesHeight(coordinates) { + return coordinates.map(([lng, lat, height]) => [lng, lat, height === undefined ? 0 : height]); +} + function updateFeatureCoordinates(feature, updateCallback) { if (feature?.geometry === null) { return feature; @@ -65,7 +69,7 @@ function updateFeatureCoordinates(feature, updateCallback) { ...feature, geometry: { type: 'Point', - coordinates: [feature.geometry.coordinates].reduce(updateCallback, [])[0] + coordinates: updateCoordinatesHeight([feature.geometry.coordinates].reduce(updateCallback, []))[0] } }; case 'LineString': @@ -73,7 +77,7 @@ function updateFeatureCoordinates(feature, updateCallback) { ...feature, geometry: { type: 'LineString', - coordinates: feature.geometry.coordinates.reduce(updateCallback, []) + coordinates: updateCoordinatesHeight(feature.geometry.coordinates.reduce(updateCallback, [])) } }; case 'Polygon': @@ -81,7 +85,7 @@ function updateFeatureCoordinates(feature, updateCallback) { ...feature, geometry: { type: 'Polygon', - coordinates: [feature.geometry.coordinates[0].reduce(updateCallback, [])] + coordinates: [updateCoordinatesHeight(feature.geometry.coordinates[0].reduce(updateCallback, []))] } }; default: @@ -230,14 +234,24 @@ class CesiumModifyGeoJSONInteraction { radius, clampToGround: true })); + // add a transparent line to improve interaction this._staticPrimitivesCollection.add(createEllipsePolylinePrimitive({ ...this._style?.lineDrawing, + dashLength: undefined, + opacity: 0.01, coordinates: coordinates[coordinates.length - 1], radius, allowPicking: true, id: newFeature?.id, geodesic: true })); + this._staticPrimitivesCollection.add(createEllipsePolylinePrimitive({ + ...this._style?.lineDrawing, + coordinates: coordinates[coordinates.length - 1], + radius, + allowPicking: false, + geodesic: true + })); } else { this._staticPrimitivesCollection.add(createCylinderPrimitive({ ...this._style?.areaDrawing, @@ -268,8 +282,11 @@ class CesiumModifyGeoJSONInteraction { if (coordinates.length > 1) { coordinates.forEach((position, idx) => { if (coordinates[idx + 1]) { + // add a transparent line to improve interaction this._staticPrimitivesCollection.add(createPolylinePrimitive({ ...this._style?.lineDrawing, + dashLength: undefined, + opacity: 0.01, coordinates: [ position, coordinates[idx + 1] @@ -278,6 +295,15 @@ class CesiumModifyGeoJSONInteraction { id: `${newFeature?.id}:${idx}:segment`, geodesic })); + this._staticPrimitivesCollection.add(createPolylinePrimitive({ + ...this._style?.lineDrawing, + coordinates: [ + position, + coordinates[idx + 1] + ], + allowPicking: false, + geodesic + })); } this._staticBillboardCollection.add({ id: `${newFeature?.id}:${idx}:vertex`, @@ -300,8 +326,11 @@ class CesiumModifyGeoJSONInteraction { })); coordinates.forEach((position, idx) => { if (coordinates[idx + 1]) { + // add a transparent line to improve interaction this._staticPrimitivesCollection.add(createPolylinePrimitive({ ...this._style?.lineDrawing, + dashLength: undefined, + opacity: 0.01, coordinates: [ position, coordinates[idx + 1] @@ -310,6 +339,15 @@ class CesiumModifyGeoJSONInteraction { id: `${newFeature?.id}:${idx}:segment`, geodesic })); + this._staticPrimitivesCollection.add(createPolylinePrimitive({ + ...this._style?.lineDrawing, + coordinates: [ + position, + coordinates[idx + 1] + ], + allowPicking: false, + geodesic + })); } this._staticBillboardCollection.add({ id: `${newFeature?.id}:${idx}:vertex`, diff --git a/web/client/utils/mapinfo/vector.js b/web/client/utils/mapinfo/vector.js index 9fb4683e6d..096ab90eab 100644 --- a/web/client/utils/mapinfo/vector.js +++ b/web/client/utils/mapinfo/vector.js @@ -9,11 +9,24 @@ import { Observable } from 'rxjs'; import isObject from 'lodash/isObject'; import { getCurrentResolution } from '../MapUtils'; +import { isAnnotationLayer } from '../../plugins/Annotations/utils/AnnotationsUtils'; import isNil from 'lodash/isNil'; export default { buildRequest: (layer, props) => { - const { features = [] } = props?.point?.intersectedFeatures?.find(({ id }) => id === layer.id) || {}; + const { features: layerIntersectedFeatures = [] } = props?.point?.intersectedFeatures?.find(({ id }) => id === layer.id) || {}; + const title = isObject(layer.title) + ? layer.title[props?.currentLocale] || layer.title.default + : layer.title; + const features = isAnnotationLayer(layer) && layerIntersectedFeatures.length > 0 + ? [{ + type: 'Feature', + geometry: null, + properties: { + ...layer + } + }] + : layerIntersectedFeatures; return { request: { features: [...features], @@ -23,9 +36,7 @@ export default { }, metadata: { fields: layer.features?.[0]?.properties && Object.keys(layer.features[0].properties) || [], - title: isObject(layer.title) - ? layer.title[props?.currentLocale] || layer.title.default - : layer.title, + title, resolution: isNil(props?.map?.resolution) ? props?.map?.zoom && getCurrentResolution(props.map.zoom, 0, 21, 96) : props.map.resolution, @@ -35,10 +46,7 @@ export default { viewer: layer.viewer, layerId: layer.id }, - // this will force to use the getIdentifyFlow - // instead of the getVectorInfo action - // when a layer is not an annotation - url: layer.id === 'annotations' ? undefined : 'client' + url: 'client' }; }, getIdentifyFlow: (layer, baseURL, { features = [] } = {}) => { diff --git a/web/client/utils/openlayers/DrawGeometryInteraction.js b/web/client/utils/openlayers/DrawGeometryInteraction.js index 4cf282b612..bf7a0a1f75 100644 --- a/web/client/utils/openlayers/DrawGeometryInteraction.js +++ b/web/client/utils/openlayers/DrawGeometryInteraction.js @@ -21,7 +21,7 @@ import CircleStyle from 'ol/style/Circle'; import Fill from 'ol/style/Fill'; import Stroke from 'ol/style/Stroke'; import tinycolor from 'tinycolor2'; - +import { never } from 'ol/events/condition'; import { transformLineToArcs, reproject } from '../CoordinatesUtils'; import { generateEditingStyle } from '../DrawUtils'; @@ -228,6 +228,7 @@ class OpenLayersDrawGeometryInteraction { type: geometryType, maxPoints: coordinatesLength, stopClick: true, + freehandCondition: never, geometryFunction: geometryFunction ? geometryFunction({ map: this._map, onDrawing }) : undefined, style: (olFeature) => { const olGeometryType = olFeature.getGeometry().getType(); diff --git a/web/client/utils/openlayers/ModifyGeoJSONInteraction.js b/web/client/utils/openlayers/ModifyGeoJSONInteraction.js index a8ed960659..3407c972bf 100644 --- a/web/client/utils/openlayers/ModifyGeoJSONInteraction.js +++ b/web/client/utils/openlayers/ModifyGeoJSONInteraction.js @@ -20,13 +20,13 @@ import Circle from 'ol/geom/Circle'; import Polygon, { circular } from 'ol/geom/Polygon'; import Point from 'ol/geom/Point'; import LineString from 'ol/geom/LineString'; -import MultiLineString from 'ol/geom/MultiLineString'; import {getDistance} from 'ol/sphere'; import {transform} from 'ol/proj'; import { transformLineToArcs, reproject } from '../CoordinatesUtils'; import { GeometryCollection } from 'ol/geom'; import DrawHole from './hole/DrawHole'; import tinycolor from 'tinycolor2'; +import { never } from 'ol/events/condition'; import { generateEditingStyle, featureToModifyProperties as defaultFeatureToModifyProperties, @@ -80,6 +80,28 @@ function toOLFeature({ return olFeature; } +function updateCoordinatesHeight(coordinates) { + const hasHeight = coordinates.find(coords => coords[2] !== undefined); + if (hasHeight) { + return coordinates.map(([lng, lat, height]) => [lng, lat, height === undefined ? 0 : height]); + } + return coordinates; +} + +function updateGeometryHeight(geometry) { + const geometryType = geometry?.type; + if (geometryType === 'Point') { + return { type: 'Point', coordinates: updateCoordinatesHeight([geometry.coordinates])[0] }; + } + if (geometryType === 'LineString') { + return { type: 'LineString', coordinates: updateCoordinatesHeight(geometry.coordinates) }; + } + if (geometryType === 'Polygon') { + return { type: 'Polygon', coordinates: geometry.coordinates.map(updateCoordinatesHeight) }; + } + return geometry; +} + function toGeoJSONFeature({ map, olFeature: _olFeature, @@ -106,7 +128,7 @@ function toGeoJSONFeature({ return { ...feature, - geometry, + geometry: updateGeometryHeight(geometry), properties: modifyPropertiesToFeatureProperties(properties, feature) }; } @@ -245,6 +267,7 @@ class OpenLayersModifyGeoJSONInteraction { this._draw = new Draw({ type: 'LineString', stopClick: true, + freehandCondition: never, style: (olFeature) => { const [lineFeature] = source.getFeatures(); const { geodesic } = lineFeature.get('@properties') || {}; @@ -504,7 +527,6 @@ class OpenLayersModifyGeoJSONInteraction { }), ...(geodesic ? [ new Style({ - geometry: new MultiLineString(olFeature.getGeometry().getCoordinates().map((coordinates) => transformCoordinatesToGeodesic(map, coordinates))), stroke: lineDrawingStyle }) ] : []),