From 4ba3f1c713e44ddc425d79f9aa5b3db9415c6ce0 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 20 May 2021 13:38:45 +0200 Subject: [PATCH 001/322] first layout to show instruction --- src/App.module.css | 13 +++++++ src/App.tsx | 21 ++++++++++- src/Converters.ts | 1 + src/sidebar/instructions/Instructions.tsx | 2 +- src/turnNavigation/TurnNavigation.module.css | 25 +++++++++++++ src/turnNavigation/TurnNavigation.tsx | 37 ++++++++++++++++++++ 6 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 src/turnNavigation/TurnNavigation.module.css create mode 100644 src/turnNavigation/TurnNavigation.tsx diff --git a/src/App.module.css b/src/App.module.css index 0440fafd..e493f746 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -36,6 +36,19 @@ pointer-events: all; /* we want all the content to behave normally*/ } +.turnNavigation { + grid-column: 1 / span 1; + grid-row: 1 / span 1; + z-index: 500; + max-height: 13%; + + margin: 0.5rem; + padding: 0.5rem; + background-color: white; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.3); + border-radius: 0.1rem; +} + .mapOptions { grid-column: 3 / span 1; grid-row: 1 / span 1; diff --git a/src/App.tsx b/src/App.tsx index 08dc8f40..7ff29c8e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,6 @@ import React, { useEffect, useState } from 'react' import Sidebar from '@/sidebar/Sidebar' +import TurnNavigation from '@/turnNavigation/TurnNavigation' import styles from './App.module.css' import { getApiInfoStore, getErrorStore, getMapOptionsStore, getQueryStore, getRouteStore } from '@/stores/Stores' import MapComponent from '@/map/Map' @@ -46,7 +47,25 @@ export default function App() { } const bbox = chooseBoundingBox(info.bbox, useInfoBbox, route.selectedPath.bbox) - + const turnNavigation = true + if(turnNavigation && route.selectedPath.instructions.length > 0) + return ( +
+
+ +
+
+ +
+
+ ) + return (
diff --git a/src/Converters.ts b/src/Converters.ts index a6c4f9d8..58834c97 100644 --- a/src/Converters.ts +++ b/src/Converters.ts @@ -5,6 +5,7 @@ export function milliSecondsToText(seconds: number) { const minutes = Math.floor((seconds % 3600000) / 60000) const hourText = hours > 0 ? hours + ' h' : '' + if(minutes == 0) return hourText return hourText + ' ' + minutes + ' min' } diff --git a/src/sidebar/instructions/Instructions.tsx b/src/sidebar/instructions/Instructions.tsx index 3abbc4dd..b6503d5a 100644 --- a/src/sidebar/instructions/Instructions.tsx +++ b/src/sidebar/instructions/Instructions.tsx @@ -43,7 +43,7 @@ const Line = function ({ instruction, index }: { instruction: Instruction; index ) } -function getSignName(sign: number, index: number) { +export function getSignName(sign: number, index: number) { if (index === 0) return markerIconGreen switch (sign) { diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css new file mode 100644 index 00000000..b7e3e3bc --- /dev/null +++ b/src/turnNavigation/TurnNavigation.module.css @@ -0,0 +1,25 @@ +.turnInfo { + display: flex; + flex-direction: row; + padding: 0.5rem; +} + +.turnSign img { + max-height: 2rem; +} +.turnSign { + flex-direction: column; +} + +.turnText { + padding: 0.5rem; + flex-direction: column; +} + +.arrival div { + padding: 0.5rem; +} +.arrival { + display: flex; + flex-direction: row; +} \ No newline at end of file diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx new file mode 100644 index 00000000..235360b7 --- /dev/null +++ b/src/turnNavigation/TurnNavigation.tsx @@ -0,0 +1,37 @@ +import React from 'react' +import { Path, Instruction } from '@/api/graphhopper' +import { metersToText, milliSecondsToText } from '@/Converters' +import { getSignName } from '@/sidebar/instructions/Instructions' +import styles from '@/turnNavigation/TurnNavigation.module.css' + +type TurnNavigationProps = { + path: Path +} + +export default function ({ path }: TurnNavigationProps) { + const instructionIndex: number = 0 + const nextInstruction: Instruction = path.instructions[instructionIndex] + const arrivalDate = new Date() + arrivalDate.setMilliseconds(arrivalDate.getSeconds() + path.time) + const min = arrivalDate.getMinutes() + return ( + <> +
+
+
+ {'turn +
+
{metersToText(nextInstruction.distance)}
+
+
{nextInstruction.text}
+
+
+
+ {arrivalDate.getHours() + ':' + (min > 10 ? min : '0' + min)} Uhr +
+
{milliSecondsToText(path.time)}
+
{metersToText(path.distance)}
+
+ + ) +} From ddfc64d5fd24ee8d86dcc54c4902c468f6b4e9a0 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 20 May 2021 14:02:10 +0200 Subject: [PATCH 002/322] find instruction based on location --- src/App.tsx | 6 +-- src/Converters.ts | 8 ++- src/turnNavigation/TurnNavigation.module.css | 9 +++- src/turnNavigation/TurnNavigation.tsx | 56 ++++++++++++++++++-- 4 files changed, 68 insertions(+), 11 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 7ff29c8e..23b5b8eb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -48,7 +48,7 @@ export default function App() { const bbox = chooseBoundingBox(info.bbox, useInfoBbox, route.selectedPath.bbox) const turnNavigation = true - if(turnNavigation && route.selectedPath.instructions.length > 0) + if (turnNavigation && route.selectedPath.instructions.length > 0) return (
@@ -61,11 +61,11 @@ export default function App() { />
- +
) - + return (
diff --git a/src/Converters.ts b/src/Converters.ts index 58834c97..79fe72d3 100644 --- a/src/Converters.ts +++ b/src/Converters.ts @@ -9,10 +9,14 @@ export function milliSecondsToText(seconds: number) { return hourText + ' ' + minutes + ' min' } -const distanceFormat = new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }) +const distanceFormatPrecise = new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }) +const distanceFormat = new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }) export function metersToText(meters: number) { if (meters < 1000) return Math.floor(meters) + ' m' - return distanceFormat.format(meters / 1000) + ' km' + if(meters < 5000) + return distanceFormatPrecise.format(meters / 1000) + ' km' + else + return distanceFormat.format(meters / 1000) + ' km' } export function coordinateToText(coord: Coordinate): string { diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index b7e3e3bc..2d0c3b16 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -8,6 +8,8 @@ max-height: 2rem; } .turnSign { + font-size: smaller; + min-width: 20%; flex-direction: column; } @@ -22,4 +24,9 @@ .arrival { display: flex; flex-direction: row; -} \ No newline at end of file +} + +.arrival_date { + font-size: larger; + font-weight: bold; +} diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 235360b7..e72f2cdd 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -3,14 +3,20 @@ import { Path, Instruction } from '@/api/graphhopper' import { metersToText, milliSecondsToText } from '@/Converters' import { getSignName } from '@/sidebar/instructions/Instructions' import styles from '@/turnNavigation/TurnNavigation.module.css' +import { Coordinate } from '@/stores/QueryStore' type TurnNavigationProps = { path: Path + currentLocation: Coordinate } -export default function ({ path }: TurnNavigationProps) { - const instructionIndex: number = 0 +export default function ({ path, currentLocation }: TurnNavigationProps) { + const { instructionIndex, distanceNext } = getCurrentInstruction(path.instructions, currentLocation) + if (instructionIndex < 0) return <>Cannot find instruction + const nextInstruction: Instruction = path.instructions[instructionIndex] + + // TODO better approximation via estimating taken time const arrivalDate = new Date() arrivalDate.setMilliseconds(arrivalDate.getSeconds() + path.time) const min = arrivalDate.getMinutes() @@ -21,13 +27,13 @@ export default function ({ path }: TurnNavigationProps) {
{'turn
-
{metersToText(nextInstruction.distance)}
+
{metersToText(distanceNext)}
{nextInstruction.text}
-
- {arrivalDate.getHours() + ':' + (min > 10 ? min : '0' + min)} Uhr +
+ {arrivalDate.getHours() + ':' + (min > 10 ? min : '0' + min)} Uhr
{milliSecondsToText(path.time)}
{metersToText(path.distance)}
@@ -35,3 +41,43 @@ export default function ({ path }: TurnNavigationProps) { ) } + +function getCurrentInstruction( + instructions: Instruction[], + currentLocation: Coordinate +): { instructionIndex: number; distanceNext: number } { + var instructionIndex = -1 + var smallestDist = Number.MAX_VALUE + var distanceNext = 10.0 + // find instruction nearby and very simple method (pick first point) + for (var instrIdx = 0; instrIdx < instructions.length; instrIdx++) { + const points: number[][] = instructions[instrIdx].points + + for (var pIdx = 0; pIdx < points.length; pIdx++) { + const p: number[] = points[pIdx] + const dist = distCalc(p[1], p[0], currentLocation.lat, currentLocation.lng) + if (dist < smallestDist) { + smallestDist = dist + // use next instruction or finish + instructionIndex = instrIdx + 1 < instructions.length ? instrIdx + 1 : instrIdx + + const last: number[] = points[points.length - 1] + distanceNext = Math.round(distCalc(last[1], last[0], currentLocation.lat, currentLocation.lng)) + } + } + } + return { instructionIndex, distanceNext } +} + +function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: number): number { + const sinDeltaLat: number = Math.sin(toRadians(toLat - fromLat) / 2) + const sinDeltaLon: number = Math.sin(toRadians(toLng - fromLng) / 2) + const normedDist: number = + sinDeltaLat * sinDeltaLat + + sinDeltaLon * sinDeltaLon * Math.cos(toRadians(fromLat)) * Math.cos(toRadians(toLat)) + return 6371000 * 2 * Math.asin(Math.sqrt(normedDist)) +} + +function toRadians(deg: number): number { + return (deg * Math.PI) / 180.0 +} From 1c8516d37503f81a5f3a08c1e6d4e21d18508829 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 20 May 2021 17:18:06 +0200 Subject: [PATCH 003/322] store current location and update instruction via fake coordinates --- src/App.module.css | 4 +- src/App.tsx | 15 +++++- src/actions/Actions.ts | 8 +++ src/index.tsx | 7 +++ src/stores/LocationStore.ts | 51 ++++++++++++++++++++ src/stores/Stores.ts | 5 ++ src/turnNavigation/TurnNavigation.module.css | 2 +- src/turnNavigation/TurnNavigation.tsx | 9 +++- 8 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 src/stores/LocationStore.ts diff --git a/src/App.module.css b/src/App.module.css index e493f746..15ac711e 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -40,8 +40,8 @@ grid-column: 1 / span 1; grid-row: 1 / span 1; z-index: 500; - max-height: 13%; - + max-height: 7em; + margin: 0.5rem; padding: 0.5rem; background-color: white; diff --git a/src/App.tsx b/src/App.tsx index 23b5b8eb..56b7b53d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,7 +2,14 @@ import React, { useEffect, useState } from 'react' import Sidebar from '@/sidebar/Sidebar' import TurnNavigation from '@/turnNavigation/TurnNavigation' import styles from './App.module.css' -import { getApiInfoStore, getErrorStore, getMapOptionsStore, getQueryStore, getRouteStore } from '@/stores/Stores' +import { + getApiInfoStore, + getErrorStore, + getMapOptionsStore, + getQueryStore, + getRouteStore, + getLocationStore, +} from '@/stores/Stores' import MapComponent from '@/map/Map' import { Bbox } from '@/api/graphhopper' import MapOptions from '@/map/MapOptions' @@ -11,6 +18,7 @@ export default function App() { const [query, setQuery] = useState(getQueryStore().state) const [info, setInfo] = useState(getApiInfoStore().state) const [route, setRoute] = useState(getRouteStore().state) + const [location, setLocation] = useState(getLocationStore().state) const [error, setError] = useState(getErrorStore().state) const [mapOptions, setMapOptions] = useState(getMapOptionsStore().state) const [useInfoBbox, setUseInfoBbox] = useState(true) @@ -21,12 +29,14 @@ export default function App() { const onRouteChanged = () => setRoute(getRouteStore().state) const onErrorChanged = () => setError(getErrorStore().state) const onMapOptionsChanged = () => setMapOptions(getMapOptionsStore().state) + const onLocationChanged = () => setLocation(getLocationStore().state) getQueryStore().register(onQueryChanged) getApiInfoStore().register(onInfoChanged) getRouteStore().register(onRouteChanged) getErrorStore().register(onErrorChanged) getMapOptionsStore().register(onMapOptionsChanged) + getLocationStore().register(onLocationChanged) return () => { getQueryStore().deregister(onQueryChanged) @@ -34,6 +44,7 @@ export default function App() { getRouteStore().deregister(onRouteChanged) getErrorStore().deregister(onErrorChanged) getMapOptionsStore().deregister(onMapOptionsChanged) + getLocationStore().deregister(onLocationChanged) } }) @@ -61,7 +72,7 @@ export default function App() { />
- +
) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index b77b4f06..31c3849c 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -11,6 +11,14 @@ export class InfoReceived implements Action { } } +export class LocationUpdate implements Action { + readonly coordinate: Coordinate + + constructor(coordinate: Coordinate) { + this.coordinate = coordinate + } +} + export class SetPoint implements Action { readonly point: QueryPoint diff --git a/src/index.tsx b/src/index.tsx index 006b4640..be119b81 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -5,6 +5,7 @@ import App from '@/App' import { getApiInfoStore, getErrorStore, + getLocationStore, getMapOptionsStore, getQueryStore, getRouteStore, @@ -18,6 +19,10 @@ import QueryStore from '@/stores/QueryStore' import { ApiImpl } from '@/api/Api' import ErrorStore from '@/stores/ErrorStore' import MapOptionsStore from '@/stores/MapOptionsStore' +import LocationStore from '@/stores/LocationStore' + +const locationStore = new LocationStore() +locationStore.initFake() // set up state management const api = new ApiImpl() @@ -28,6 +33,7 @@ setStores({ infoStore: new ApiInfoStore(), errorStore: new ErrorStore(), mapOptionsStore: new MapOptionsStore(), + locationStore: locationStore, }) // register stores at dispatcher to receive actions @@ -36,6 +42,7 @@ Dispatcher.register(getRouteStore()) Dispatcher.register(getApiInfoStore()) Dispatcher.register(getErrorStore()) Dispatcher.register(getMapOptionsStore()) +Dispatcher.register(getLocationStore()) api.infoWithDispatch() // get infos about the api as soon as possible diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts new file mode 100644 index 00000000..2d5edd83 --- /dev/null +++ b/src/stores/LocationStore.ts @@ -0,0 +1,51 @@ +import { Coordinate } from '@/stores/QueryStore' +import Store from '@/stores/Store' +import { LocationUpdate } from '@/actions/Actions' +import Dispatcher, { Action } from '@/stores/Dispatcher' + +export interface LocationStoreState { + coordinate: Coordinate +} + +export default class LocationStore extends Store { + + protected getInitialState(): LocationStoreState { + return { + coordinate: {lat: 0, lng: 0} + } + } + + reduce(state: LocationStoreState, action: Action): LocationStoreState { + if(action instanceof LocationUpdate) { + return { + ...state, + coordinate: action.coordinate, + } + } + return state + } + + // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car + public initFake() { + // TODO randomize a route + const latlon: number[][] = [ + [51.439291,14.245254], + [51.438989,14.245405], + [51.438694,14.245577], + [51.438668,14.246092], + [51.438226,14.246972], + [51.436795,14.24592], + [51.435029,14.243259], + [51.435203,14.241006], + [51.434788,14.238882], + [51.434146,14.237745], + [51.433959,14.235985], + [51.43322,14.234999]] + var currentIndex: number = 0; + setInterval(() => { + Dispatcher.dispatch(new LocationUpdate({lat: latlon[currentIndex][0], lng: latlon[currentIndex][1] })) + currentIndex++ + currentIndex %= latlon.length + }, 3000); + } +} diff --git a/src/stores/Stores.ts b/src/stores/Stores.ts index 0060fa08..9944127a 100644 --- a/src/stores/Stores.ts +++ b/src/stores/Stores.ts @@ -3,12 +3,14 @@ import RouteStore from '@/stores/RouteStore' import ApiInfoStore from '@/stores/ApiInfoStore' import ErrorStore from '@/stores/ErrorStore' import MapOptionsStore from '@/stores/MapOptionsStore' +import LocationStore from '@/stores/LocationStore' let queryStore: QueryStore let routeStore: RouteStore let infoStore: ApiInfoStore let errorStore: ErrorStore let mapOptionsStore: MapOptionsStore +let locationStore: LocationStore interface StoresInput { queryStore: QueryStore @@ -16,6 +18,7 @@ interface StoresInput { infoStore: ApiInfoStore errorStore: ErrorStore mapOptionsStore: MapOptionsStore + locationStore: LocationStore } export const setStores = function (stores: StoresInput) { @@ -24,6 +27,7 @@ export const setStores = function (stores: StoresInput) { infoStore = stores.infoStore errorStore = stores.errorStore mapOptionsStore = stores.mapOptionsStore + locationStore = stores.locationStore } export const getQueryStore = () => queryStore @@ -31,3 +35,4 @@ export const getRouteStore = () => routeStore export const getApiInfoStore = () => infoStore export const getErrorStore = () => errorStore export const getMapOptionsStore = () => mapOptionsStore +export const getLocationStore = () => locationStore diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 2d0c3b16..f6761703 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -24,9 +24,9 @@ .arrival { display: flex; flex-direction: row; + font-size: larger; } .arrival_date { - font-size: larger; font-weight: bold; } diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index e72f2cdd..3126fd33 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, { useEffect } from 'react' import { Path, Instruction } from '@/api/graphhopper' import { metersToText, milliSecondsToText } from '@/Converters' import { getSignName } from '@/sidebar/instructions/Instructions' @@ -12,6 +12,13 @@ type TurnNavigationProps = { export default function ({ path, currentLocation }: TurnNavigationProps) { const { instructionIndex, distanceNext } = getCurrentInstruction(path.instructions, currentLocation) + + console.log('update ' + currentLocation) + // useEffect(() => { + // mapWrapper.fitBounds(bbox) + // }, [currentLocation]) + + // TODO too far from route - recalculate? if (instructionIndex < 0) return <>Cannot find instruction const nextInstruction: Instruction = path.instructions[instructionIndex] From bb425062add5a4fa9372773ec3028a9497e3e615 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 20 May 2021 17:32:07 +0200 Subject: [PATCH 004/322] show current location --- src/App.tsx | 2 ++ src/map/Map.tsx | 18 ++++++++---------- src/map/Mapbox.ts | 38 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 56b7b53d..d69c1243 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -69,6 +69,7 @@ export default function App() { selectedPath={route.selectedPath} bbox={bbox} mapStyle={mapOptions.selectedStyle} + currentLocation={location.coordinate} />
@@ -86,6 +87,7 @@ export default function App() { selectedPath={route.selectedPath} bbox={bbox} mapStyle={mapOptions.selectedStyle} + currentLocation={{ lat: 0, lng: 0 }} // no state update if navigation disabled />
diff --git a/src/map/Map.tsx b/src/map/Map.tsx index 7548e573..d4ddeafb 100644 --- a/src/map/Map.tsx +++ b/src/map/Map.tsx @@ -1,4 +1,4 @@ -import { QueryPoint } from '@/stores/QueryStore' +import { QueryPoint, Coordinate } from '@/stores/QueryStore' import React, { useEffect, useRef, useState } from 'react' import styles from '@/map/Map.module.css' import Mapbox from '@/map/Mapbox' @@ -13,23 +13,20 @@ type MapProps = { queryPoints: QueryPoint[] bbox: Bbox mapStyle: StyleOption + currentLocation: Coordinate } -export default function({ selectedPath, paths, queryPoints, bbox, mapStyle }: MapProps) { +export default function ({ selectedPath, paths, queryPoints, bbox, mapStyle, currentLocation }: MapProps) { const mapContainerRef: React.RefObject = useRef(null) const [map, setMap] = useState(null) useEffect(() => { if (map) map.remove() - const mapWrapper = new Mapbox( - mapContainerRef.current!, - mapStyle, - () => { - setMap(mapWrapper) - Dispatcher.dispatch(new MapIsLoaded()) - } - ) + const mapWrapper = new Mapbox(mapContainerRef.current!, mapStyle, () => { + setMap(mapWrapper) + Dispatcher.dispatch(new MapIsLoaded()) + }) mapWrapper.fitBounds(bbox) return () => map?.remove() }, [mapStyle]) @@ -37,6 +34,7 @@ export default function({ selectedPath, paths, queryPoints, bbox, mapStyle }: Ma useEffect(() => map?.showPathDetails(selectedPath), [selectedPath, map]) useEffect(() => map?.drawMarkers(queryPoints), [queryPoints, map]) useEffect(() => map?.fitBounds(bbox), [bbox, map]) + useEffect(() => map?.showCurrentLocation(currentLocation), [currentLocation, map]) return
} diff --git a/src/map/Mapbox.ts b/src/map/Mapbox.ts index 77535a0a..f91b9d61 100644 --- a/src/map/Mapbox.ts +++ b/src/map/Mapbox.ts @@ -1,7 +1,7 @@ import { coordinateToText } from '@/Converters' -import { GeoJSONSource, GeoJSONSourceRaw, LineLayer, LngLatBounds, Map, MapMouseEvent, Marker, Style } from 'mapbox-gl' +import { GeoJSONSource, GeoJSONSourceRaw, CircleLayer, LineLayer, LngLatBounds, Map, MapMouseEvent, Marker, Style } from 'mapbox-gl' import 'mapbox-gl/dist/mapbox-gl.css' -import { QueryPoint } from '@/stores/QueryStore' +import { QueryPoint, Coordinate } from '@/stores/QueryStore' import Dispatcher from '@/stores/Dispatcher' import { SetPoint, SetSelectedPath } from '@/actions/Actions' import { Popup } from '@/map/Popup' @@ -16,9 +16,13 @@ import 'leaflet.heightgraph/src/heightgraph.css' const selectedPathSourceKey = 'selectedPathSource' const selectedPathLayerKey = 'selectedPathLayer' + const pathsSourceKey = 'pathsSource' const pathsLayerKey = 'pathsLayer' +const currentLocationSourceKey = 'currentLocationSource' +const currentLocationLayerKey = 'currentLocationLayer' + // have this right here for now. Not sure if this needs to be abstracted somewhere else const mediaQuery = window.matchMedia('(max-width: 640px)') @@ -99,6 +103,23 @@ export default class Mapbox { this.drawSelectedPath(selectedPath) } + showCurrentLocation(location: Coordinate) { + if(location.lat === 0 && location.lng == 0) + return; + + // console.log("NOW change location on map ", coordinate) + const featureCollection: FeatureCollection = { + type: 'FeatureCollection', + features: [{ + type: 'Feature', + properties: {}, + geometry: { type: "Point", coordinates: [location.lng, location.lat] } + }] + } + + this.setGeoJsonSource(currentLocationSourceKey, featureCollection) + } + showPathDetails(selectedPath: Path) { if (selectedPath.points.coordinates.length === 0) return @@ -337,6 +358,19 @@ export default class Mapbox { 'line-width': 8 } }) + + this.map.addSource(currentLocationSourceKey, source) + this.map.addLayer({ + id: currentLocationLayerKey, + type: 'circle', + source: currentLocationSourceKey, + paint: { + 'circle-color': '#385af5', + 'circle-radius': 8, + 'circle-stroke-color': 'white', + 'circle-stroke-width': 4 + } + } as CircleLayer) } private static getPadding() { From 253e75c6772335b1390cf29ca49c048dcab77f0f Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 20 May 2021 17:59:09 +0200 Subject: [PATCH 005/322] zoom to current location --- src/map/Mapbox.ts | 4 +++- src/turnNavigation/TurnNavigation.tsx | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/map/Mapbox.ts b/src/map/Mapbox.ts index f91b9d61..1b574e06 100644 --- a/src/map/Mapbox.ts +++ b/src/map/Mapbox.ts @@ -107,7 +107,6 @@ export default class Mapbox { if(location.lat === 0 && location.lng == 0) return; - // console.log("NOW change location on map ", coordinate) const featureCollection: FeatureCollection = { type: 'FeatureCollection', features: [{ @@ -118,6 +117,9 @@ export default class Mapbox { } this.setGeoJsonSource(currentLocationSourceKey, featureCollection) + + // TODO NOW when the bbox handling is merged, then this is better done via updating the bbox in the TurnNavigation + this.fitBounds([location.lng-0.001, location.lat-0.001, location.lng+0.001, location.lat+0.001]) } showPathDetails(selectedPath: Path) { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 3126fd33..4a24a739 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -11,6 +11,8 @@ type TurnNavigationProps = { } export default function ({ path, currentLocation }: TurnNavigationProps) { + if (currentLocation.lat == 0 && currentLocation.lng == 0) return Searching GPS... + const { instructionIndex, distanceNext } = getCurrentInstruction(path.instructions, currentLocation) console.log('update ' + currentLocation) From 8f17953d0084ce40391c257f91fd3004d3accf4e Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 20 May 2021 20:51:02 +0200 Subject: [PATCH 006/322] make it easy to start and end navigation --- src/App.tsx | 7 +-- src/actions/Actions.ts | 5 +- src/index.tsx | 5 +- src/map/Map.tsx | 7 ++- src/map/Mapbox.ts | 9 ++- src/sidebar/Sidebar.module.css | 4 ++ src/sidebar/Sidebar.tsx | 12 ++++ src/sidebar/start_turn_navigation.png | Bin 0 -> 1935 bytes .../start_turn_navigation_disabled.png | Bin 0 -> 4735 bytes src/stores/LocationStore.ts | 52 +++++++++++++++++- src/turnNavigation/TurnNavigation.module.css | 4 ++ src/turnNavigation/TurnNavigation.tsx | 12 ++-- src/turnNavigation/end_turn_navigation.png | Bin 0 -> 18527 bytes 13 files changed, 94 insertions(+), 23 deletions(-) create mode 100644 src/sidebar/start_turn_navigation.png create mode 100644 src/sidebar/start_turn_navigation_disabled.png create mode 100644 src/turnNavigation/end_turn_navigation.png diff --git a/src/App.tsx b/src/App.tsx index d69c1243..ccec7d5d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -58,8 +58,7 @@ export default function App() { } const bbox = chooseBoundingBox(info.bbox, useInfoBbox, route.selectedPath.bbox) - const turnNavigation = true - if (turnNavigation && route.selectedPath.instructions.length > 0) + if (location.turnNavigation) return (
@@ -69,7 +68,7 @@ export default function App() { selectedPath={route.selectedPath} bbox={bbox} mapStyle={mapOptions.selectedStyle} - currentLocation={location.coordinate} + location={location} />
@@ -87,7 +86,7 @@ export default function App() { selectedPath={route.selectedPath} bbox={bbox} mapStyle={mapOptions.selectedStyle} - currentLocation={{ lat: 0, lng: 0 }} // no state update if navigation disabled + location={location} />
diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 31c3849c..2e37127a 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -11,11 +11,14 @@ export class InfoReceived implements Action { } } +// TODO identical to LocationStoreState? export class LocationUpdate implements Action { readonly coordinate: Coordinate + readonly turnNavigation: boolean - constructor(coordinate: Coordinate) { + constructor(coordinate: Coordinate, turnNavigation: boolean) { this.coordinate = coordinate + this.turnNavigation = turnNavigation } } diff --git a/src/index.tsx b/src/index.tsx index be119b81..f1bf3d15 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -21,9 +21,6 @@ import ErrorStore from '@/stores/ErrorStore' import MapOptionsStore from '@/stores/MapOptionsStore' import LocationStore from '@/stores/LocationStore' -const locationStore = new LocationStore() -locationStore.initFake() - // set up state management const api = new ApiImpl() const queryStore = new QueryStore(api) @@ -33,7 +30,7 @@ setStores({ infoStore: new ApiInfoStore(), errorStore: new ErrorStore(), mapOptionsStore: new MapOptionsStore(), - locationStore: locationStore, + locationStore: new LocationStore(), }) // register stores at dispatcher to receive actions diff --git a/src/map/Map.tsx b/src/map/Map.tsx index d4ddeafb..37cc1f02 100644 --- a/src/map/Map.tsx +++ b/src/map/Map.tsx @@ -6,6 +6,7 @@ import Dispatcher from '@/stores/Dispatcher' import { ClearPoints, MapIsLoaded, SetPoint } from '@/actions/Actions' import { Bbox, Path } from '@/api/graphhopper' import { StyleOption } from '@/stores/MapOptionsStore' +import { LocationStoreState } from '@/stores/LocationStore' type MapProps = { selectedPath: Path @@ -13,10 +14,10 @@ type MapProps = { queryPoints: QueryPoint[] bbox: Bbox mapStyle: StyleOption - currentLocation: Coordinate + location: LocationStoreState } -export default function ({ selectedPath, paths, queryPoints, bbox, mapStyle, currentLocation }: MapProps) { +export default function ({ selectedPath, paths, queryPoints, bbox, mapStyle, location }: MapProps) { const mapContainerRef: React.RefObject = useRef(null) const [map, setMap] = useState(null) @@ -34,7 +35,7 @@ export default function ({ selectedPath, paths, queryPoints, bbox, mapStyle, cur useEffect(() => map?.showPathDetails(selectedPath), [selectedPath, map]) useEffect(() => map?.drawMarkers(queryPoints), [queryPoints, map]) useEffect(() => map?.fitBounds(bbox), [bbox, map]) - useEffect(() => map?.showCurrentLocation(currentLocation), [currentLocation, map]) + useEffect(() => map?.showCurrentLocation(location), [location, map]) return
} diff --git a/src/map/Mapbox.ts b/src/map/Mapbox.ts index 1b574e06..d706e2d6 100644 --- a/src/map/Mapbox.ts +++ b/src/map/Mapbox.ts @@ -2,6 +2,7 @@ import { coordinateToText } from '@/Converters' import { GeoJSONSource, GeoJSONSourceRaw, CircleLayer, LineLayer, LngLatBounds, Map, MapMouseEvent, Marker, Style } from 'mapbox-gl' import 'mapbox-gl/dist/mapbox-gl.css' import { QueryPoint, Coordinate } from '@/stores/QueryStore' +import { LocationStoreState } from '@/stores/LocationStore' import Dispatcher from '@/stores/Dispatcher' import { SetPoint, SetSelectedPath } from '@/actions/Actions' import { Popup } from '@/map/Popup' @@ -103,9 +104,13 @@ export default class Mapbox { this.drawSelectedPath(selectedPath) } - showCurrentLocation(location: Coordinate) { + showCurrentLocation(locationState: LocationStoreState) { + if(!locationState.turnNavigation) + return + + const location = locationState.coordinate if(location.lat === 0 && location.lng == 0) - return; + return const featureCollection: FeatureCollection = { type: 'FeatureCollection', diff --git a/src/sidebar/Sidebar.module.css b/src/sidebar/Sidebar.module.css index 224ebd45..edb0a6c5 100644 --- a/src/sidebar/Sidebar.module.css +++ b/src/sidebar/Sidebar.module.css @@ -145,3 +145,7 @@ This is not a very nice duplication but I have to stop now... .errorMessageCloseBtn svg { width: 100%; } + +.navicon { + max-width: 57px; +} diff --git a/src/sidebar/Sidebar.tsx b/src/sidebar/Sidebar.tsx index 052334a6..14b2f4b3 100644 --- a/src/sidebar/Sidebar.tsx +++ b/src/sidebar/Sidebar.tsx @@ -13,6 +13,9 @@ import Cross from './times-solid.svg' import Header from '@/sidebar/header.png' import { ApiInfo, Path } from '@/api/graphhopper' import { ErrorStoreState } from '@/stores/ErrorStore' +import { getLocationStore } from '@/stores/Stores' +import startNavigation from '@/sidebar/start_turn_navigation.png' +import startNavigationDisabled from '@/sidebar/start_turn_navigation_disabled.png' type SidebarProps = { query: QueryStoreState @@ -29,6 +32,15 @@ export default function ({ query, route, info, error }: SidebarProps) {
{!error.isDismissed && } + +
getLocationStore().initFake()}> + {route.selectedPath.instructions.length > 0 ? ( + + ) : ( + + )} +
+ EX>4Tx04R}tkv&MmKpe$iTT6>n6wDyvkfAzR5EXIMDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1lefMBD_G^=Y2&~)3( zq>^GTzamCn5r%+1L=l&nWz0%a8ouM}9s$1IC3u$qxj#pbTCf-p5Q%4)VcNvaEL z!FiupU}ae)J|`YE>4LKlt6PRh$_2l4409{Ngwt!$4#gXx1I)``B@sCqU>KxYFDHjRr9NNqW7l z#gBmAZQ$a%ttorJeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00n1BL_t(&-nE*)i(N$&$3JuPT!Ip@@kc~(A8$d|LJMWH z#%RPs1yO7S!6I6SSo$y6r?Cntv{10I5JZF&79v3-5iuBr%_>4LQB1Q*Fl@|@Mb2Gk z=gp6E?%W-C?7nyJ%$%9;Ip6c0AI^JESe$d6_kN2)DZMk~S^RtWU1LwR-*}K=1#Jh` zk{g7zKlP*mqcl9$pu^t)w0)KAQn_aMJvVcu`nl)fKwA2#g-Fs}hoVuN`I;BRgANBj z)TOgAIkwyFMqFD;XK~db#XReVKDF<5L&!iAhqY(9zm`eSrWU8oleOSBbh=N%WMgb5 z&%NJi8!dI_z28y}Z~=H6Se5^isOKiF^lr(;E0Ukj17}kVYR!!) zTSHqW7DZAUP{|7fxfS4P`T1+-+&S<4W-3o=yeXcP(5CR+u2i{ZxRDKKz+qr2pToec zmBBUcnq|wHN=Y@`tD9Km2#Tw~Az+Vu4gm*p-ZTco_BM1iSFo^M7}pWfGvFyfurJ$a z);wb<+I^dymc3GcbGkH|h>0N9qu7^iG<&Aikj{`vP$%LTp&qpy;z7qfii?S67vAf#wiNnBx@h{Z==m0fPY{qvpzv*t8O#hEuvB z`AIV&L0*hwF)n>XK@MT`fdn{ zG1D$-G-+wyHmu)SD%S$M0mV5Ll#0#DDkuAH^BzvrXbXySOly&NB`~@X^J6QDMNM1d z4OL7I$xj(|vp9ldBvnvJ+m?u_s(5mh6YIs2Mr}cJuXU#&t9Y~`J@Z>>rO_IjE%E)o z;;~kWK4YU8qM2QxD7?$I3Q0-3K;rENiq-XIjTEaXL`yco-p$x3rq-K#hpv{oQqEE6 z#w9UgH&BexoHoh2oHi_xlFaOi5yeg53~&nAu%a3FQ+Y@as0FMCg2+EfW?fnaU zAQM%zInmF2g?L~_6t{q1f#bl-zz||BxS9alkbIx55 za`_&35qK21HDcPYoOA2m`%TqCUPC$s6mJ0MfMdW*z`Zs1(ZrLWdN=SK@E-7s#AFuD zVxJn)$;9Gcz^A~QzyqQ+JFELE20Ig0{RFs}ip|Re!X}P@U5hU6Wly4zC5>i4Ytww3 zuH8)1zOP-RTlb($#{^n8wC?g*jsb?ezoRdVXOv^Ow&l+Gkh^~BQ!UMgv-PMibN!{L zZA6HKg002ovPDHLkV1m!wlV<<` literal 0 HcmV?d00001 diff --git a/src/sidebar/start_turn_navigation_disabled.png b/src/sidebar/start_turn_navigation_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..464e485fc4945ce77efc18a4367739f13ee5f51d GIT binary patch literal 4735 zcmV-_5`gWAP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+ND@qaxAG1{AU%j1jL)=@Qk=SxXYhRLATw0oMXpy zg$s(JK*~%Buv!2A-!}i?=aK{yVlJtsWbq3%RM$``_WYXO#Rk3W&)54-Ufa#{g+r5P z&+}N)ZC_}2=FA?sw)? zOMdUd{f_R-E%ndv7JPOoCdmQ!;B3yRqF$U08MsXvx`$H`Vn5@2d^V4+4mP>v#aq3X zW2NVx_=Ym#j%W14ThxR1xQk*8PYfu739$TvzLtHW`GU=({N`tV;?|YJ3*FD!m4W&6 z;)4v*y6yf0d+AwfyZQJ+;@5O5r|&Gv;W@E;u?TdR7pKeH-`=zAy^eP+B)FWeQx8wX zD3yD5iaRGRfs~}tkG&b$99oLX54is+*GNs8jva~W}z{cQ~%P5^2V4ZCR zTvRtaNe{eayX>o#ClK|73Km5o9$@W1wY2K0M>dWX;aE$pwKdGyFmg+#p?^b5cis2UV^2Nz(ra%6@)=>okwzY6)X}D! zej<)%nt7I4XIru$r4?2*E3LfBs;g~iZTlT|+-c`scHQmC+GX|A^$XVIvgVX2_RCM! z(34kp#KkR7?%tUD z6>lbmKl0{&%A6r}|B*T6&8+y2w=YhcV~!0UV(sXHL4j8qX3kuYJ=1Ozk5fNFEUg)a!&;Im z27@Upl`&nyaGa^vh7$O2L7%l{1Z|X+YTzPPv6N*%Rf_NplDo%Ktzr8}W*S(*cox~S zF0|U*VsLFv*Ptzcjqq=l7-BfulOw1KQ^Mi{M#TK!6&9fk%~lW|UK4aw}t0t{B6 zt0idAD9hN~Z-Fil4RcW)BZDC9DYEh@1{JW5^|9UnV|>6MYCs$8asV~?n+m9kShS{2 zd%~2u81)FIs2~On3d(5olsAp0`QYv^-kDD?kf5;UPNknF&BkULI$|hDr&t>by}0Rt z{@8|~1sodI@TSAXBY0rGg31>}JY+28wv6K|m5G|uKE_*32Tj4oeo+_T@RctAT$+!< zjW-Ex=n%V;bwn6XgJT&Vlq~yB+QuVf2tBqUwWtS_*u#fgW9vyR?8b0Y7dX8ZaK+eL z`E4nhr!>PWCk83CY1DxbtVl55YN`1NwHs9@%~a0}(6XFT1;nfX?u=(7(L~sco$Lt+ z^8XBxpOxmD7dMMyJdCJd(Ei19pu35Knqq3e-UFo}kRyB{5bB!%Yj(altNz}iKbKB1 zAbU_BmN|sHApz^4S&+LmRmC@Zs;<`L=kop?e&*NKe1oS^K+99o&;$S&l`hh?FfHl!r-#3!CG*#8{KL|4Z4C0D66%inUyMPW`*Ps% zsk}z$7XfI#d!fnY=b;RY`Y{cUC=Peb->qWf>n-g_J1d^MHkuo3yK;{&5BG zAt~ra*=CB-|E6Hag(a=^g}s|=xpSwwV%EKp+gPy&yvxVCh3{}!*b#fC;Y`QLq@E20 z&fc9F%W~t6tsW06Rn3A2YGgV;Z#v&{bT!)~(-T zpK8V^%aZ;wj>&s_B$3WIR?mZ*kVjRo1*Ge_=SM zuPk$&<`5EC#1bTkP*6n)W!Q+(s*_?NMf-6d|Dfxa$fc001V)YpRG>k2{osG_yIU(i zIpHOR<3Q-eaXyBD&Rw8UbDZyE$7!4Z!Drw~Z}}^AVCIwbT1$%_0lnM6#dS+l_JGSB zVBpD+P1%)#G=+Q~ct4|W$^!kjK=+#0TXP?$4?vo_O5OkmhrmdIve$jy-PPXPzh|2L z{Qx{+a*?JbJgNWy00v@9M??Vs0RI60puMM)00009a7bBm001r{001r{0eGc9b^rhX z2XskIMF-^t6c8&Db1rc10000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht z7XSbVc}YY;RA}C%n`?I4It+vXl6LH->*)S>*CrN;`@?`T8i90rn{#-aIF6`KgBL+Y zfBpI;W_B3-74OCG#~6pvdzUeW`YR5_YnqwzrB$DAsj8@|sj8Gx_EBqS!n(_rQRm9NxQ`Nz0zVUzn zP>^rH#uysroQ(_=Ed$kVGqB7|888$KMaLMsdJa?wRB0Y_#Vjl`6b$nnV<4!OQbKJR zW9+`k<~vn#=64K9aJ#8G;0|SG#lcDd^YavuAtJ-fOjQTop!?=-rVgfI*6zPjN?BTB z`%ZvyfRi5vG{O;J5s?az1x(gdbp)h?iYq!$?NCltrT4y@rikpI_#S^9AQ5I|rl_X> zjDUpztC>}RRlI)@>8jdAr2Cu0t!ucNVTJ~v3T7>lcBYUk)%X?tko->)1)Bq2;(H$o zrrJfMo7pBJn@80R6y04n2}C<6s)_mWkSAx#5hN#j3^XS|GixGpp%H3|n`jr22L!0N zu`PTw-Vgumy&IV3A=S*(Y%{Y&^*HFjLt(&BD*&$|^5(Bse;*+?5&0yA1#>5wW%y_B z9hFiMv6Y&Q&6Fz{3^<93m?}`k0K7S5yj}?M0pN;7L8KP&-KcmDX$2LXD!DS%iRqpa z{lrWI?(XB};MM2ut|CJ2P;RQ`W@~7+kt0#9@YxKs&7vw-GxRXhRN+w+&GarJKYZN% zJ%s!qQ^j;LLQyIb0`OE6gvt!sCTT-wg*Zi1O!nxDsN%bb`~)=-@{j+GLbQ#5)Dap2 z(<$2G7Z(U-c1|I)Du>E71#=A*+eF2H{Na$1n>UEKMsS;_mM~kah`tJ5zdx*1{r86g zqD@RO4Mv<3G2v50y#eG;AMgGiLl#hR^YI8!7-71KK?p0NxaU&Jp;&mSBrll~6^r{~ z0~OI!-vN{%!&C>rJv<<7o-a35tq_o6{!nuV4ReKiwG48lq9!VqiHbKe)fr?>a%PMN zDLO)RR1?a+gNwOOs)$%y1shUPCMvQo-YBZR!^j{F(#eMp1l`Om>f6F<@{$Z9?S9XH zW3D<;F*8*JM9`Z*5P@=TB#;Ojiq=fcOhN8dwM<1S+YXEQg^Cze?+GYJ*9$;y4)q5H zf?ixr%%LYWu@8i4r2V6cS=vCrA4xHQ=Bf+G7@y#q8_aLmPT@uuwnC;$trsdrUd#f{ zJ%PJH{mPKB5<$q{K5l5XX4Vol4Ho;mn%Dqni-5CIu_P*DoqC@DUIDT|<@12Q`3=|j zYc;WkMaWkXb>@q&RLlUeKxfDg0{vfVQuT9&#M}r8cNS4sDk9+3Kii-~AmESLgS!8V zntt!QkCvH=Sm8_}>IxD85wb1<*9;Ub;R4G!Y>a8v0AHFbI`Sef;%WnLjsY7ru@san zlxMG#YuzBFV83W&YWhlLSF@0*u2vdYqs~;E0cy4n0p2gdt*I>AH6hKr!Fvi<%bQQ_U=`U0Fp15i!WjL!^EG>hH{`jG^(k?fwCnSB-Lu-M{a-0XR5H&8_=`;Z z5TE*>E`ToP&5zR3P~dEtMbV4kQJ_EYg8p0*AWP@KOZsF@X9m0)x0 zP`i?PtNhrgdO^UA04?dh8CgqBuG14gZ3NrsZ`n6v=S&+{?3AcW0$M@6tmWV7X0bul z;l?$2cqM6UWuLDTK&9aJOd+(#uCtb7a$)wrk^pYhtJ%O@OJa&G@off8?}tqGkWLzz z>MZbRQkLOOd{Pd?_Yd8-BvrJ;$1AzOgZwmG`pvfNPiF?Ww$$W3jD)eGA7EzKUc~O( zcOWs@vnxE3G_x8K8Ko`iNtx{NcQDaEKIvz&=a{t@GoQRnAR9e6w1|W{Y#=azIHmVgU8OW z#aRICLGYSXP+Owrh|^toV4_8<0M4cvXnEtQ#Q@dkJ)WdaRCE1Dwp@;`e;II7?vwyE^r}&#?lmwMwhC z@-fO2C`>F1CD9}^$iqBz(l|N1eB5ZAD2Wd*1q>w(qiFnrA680d#sZihP^Mf4OdB-H z`I>xJ_!ls*(SITw0bARZG(X6GngI9vWaMR*z=aFQr)gn*~5x zYpunBB=ggU3MYgOwhxS-JXRI6$@%{^`190Ao5Au@>U3=ebU10P$$ukyPh^{16<7cO N002ovPDHLkV1n@1)s6rF literal 0 HcmV?d00001 diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 2d5edd83..4d15649e 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -4,13 +4,18 @@ import { LocationUpdate } from '@/actions/Actions' import Dispatcher, { Action } from '@/stores/Dispatcher' export interface LocationStoreState { + turnNavigation: boolean coordinate: Coordinate } export default class LocationStore extends Store { + private watchId : any + private interval: any + protected getInitialState(): LocationStoreState { return { + turnNavigation: false, coordinate: {lat: 0, lng: 0} } } @@ -18,7 +23,7 @@ export default class LocationStore extends Store { reduce(state: LocationStoreState, action: Action): LocationStoreState { if(action instanceof LocationUpdate) { return { - ...state, + turnNavigation: action.turnNavigation, coordinate: action.coordinate, } } @@ -42,10 +47,51 @@ export default class LocationStore extends Store { [51.433959,14.235985], [51.43322,14.234999]] var currentIndex: number = 0; - setInterval(() => { - Dispatcher.dispatch(new LocationUpdate({lat: latlon[currentIndex][0], lng: latlon[currentIndex][1] })) + + Dispatcher.dispatch(new LocationUpdate({lat: latlon[currentIndex][0], lng: latlon[currentIndex][1] }, true)) + + this.interval = setInterval(() => { currentIndex++ currentIndex %= latlon.length + Dispatcher.dispatch(new LocationUpdate({lat: latlon[currentIndex][0], lng: latlon[currentIndex][1] }, true)) }, 3000); } + + public initReal() { + if (!navigator.geolocation) { + console.log("location not supported. In firefox I had to set geo.enabled=true in about:config") + } else { + console.log("location init") + + // force calling clearWatch can help to find GPS fix more reliable in android firefox + if(this.watchId) + navigator.geolocation.clearWatch(this.watchId) + + var success = (pos: any) => { + console.log("location success handler start") + Dispatcher.dispatch(new LocationUpdate({lat: pos.coords.latitude, lng: pos.coords.longitude }, true)) + } + var options = { enableHighAccuracy: false, timeout: 5000, maximumAge: 5000 } + this.watchId = navigator.geolocation.watchPosition(success, function(err) { console.log("location watch error", err);}, options) + } + + // TODO NOW + // if(!this.noSleep) { + // this.noSleep = new NoSleep(); + // this.noSleep.enable() + // } + } + + public stop() { + if(this.interval) + clearInterval(this.interval); + + if(this.watchId) + navigator.geolocation.clearWatch(this.watchId) + + // directly writing the state does not work: this.state.turnNavigation = false + Dispatcher.dispatch(new LocationUpdate({lat: 0, lng: 0 }, false)) + + console.log("stopped location updates") + } } diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index f6761703..4a8aa274 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -30,3 +30,7 @@ .arrival_date { font-weight: bold; } + +.navicon { + max-height: 20px; +} diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 4a24a739..c51d7e0c 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,9 +1,11 @@ -import React, { useEffect } from 'react' +import React from 'react' import { Path, Instruction } from '@/api/graphhopper' import { metersToText, milliSecondsToText } from '@/Converters' import { getSignName } from '@/sidebar/instructions/Instructions' import styles from '@/turnNavigation/TurnNavigation.module.css' import { Coordinate } from '@/stores/QueryStore' +import endNavigation from '@/turnNavigation/end_turn_navigation.png' +import { getLocationStore } from '@/stores/Stores' type TurnNavigationProps = { path: Path @@ -15,11 +17,6 @@ export default function ({ path, currentLocation }: TurnNavigationProps) { const { instructionIndex, distanceNext } = getCurrentInstruction(path.instructions, currentLocation) - console.log('update ' + currentLocation) - // useEffect(() => { - // mapWrapper.fitBounds(bbox) - // }, [currentLocation]) - // TODO too far from route - recalculate? if (instructionIndex < 0) return <>Cannot find instruction @@ -46,6 +43,9 @@ export default function ({ path, currentLocation }: TurnNavigationProps) {
{milliSecondsToText(path.time)}
{metersToText(path.distance)}
+
getLocationStore().stop()}> + +
) diff --git a/src/turnNavigation/end_turn_navigation.png b/src/turnNavigation/end_turn_navigation.png new file mode 100644 index 0000000000000000000000000000000000000000..2c81bcc39bf0d1b5e1389ec65982ec22b7b1d62f GIT binary patch literal 18527 zcmV()K;OTKP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+NHf|mfScJt@$6TcuOFNc{!MPPVbMorF#I+C;bi-~Z=v|L6bwAD^4QTui0rmh;8`VvFtW{H0#!f89R%E80i< zUuf_5{I6ekU*EX-QqWJHf7bkdee?C3pTFO)&-ZmYUr#??sO|R~hO!Wzy9{Bf&0fdep7?I->-+?q?f-w+t=Oi z-|*?r;x?K7xS|rj-uV9Iidu}n-gN!`?|D{zo_+4F$ILC~_ohB~;+=`|Swl)-zn1w^ z_%HGIVt*QcD&{iLv31RB@MrqwZ$$j~=$G&Qaemuhrk`A6y!T!BeBTqP>uVKRw0i~# zJ?f8t?h;y92>%WfRSA6cejfK;i?{b}_I}e>-g$X`^!B`%=U4vgANMyu^q>Abk8H_% z_u7m<0={L2T!tj4kNg-i@Xvdw$qxAQ=U0V%1sf1yvSY5?V86zBiIM!bZUqx`;O7#b zkC1&?=lAtOk@rqqj1P$5%048Y{Z;O}c+Wvr1l0Xi?-1{S1bj;O;v(;ep&=WLfVX!1 zPVx4$ce>Bl@sda)g&Yd9X`v&m7!&$aVnv5~3MrLyXwboX9yIa5;r-nJU+FI+K_w2lK&#v?Hov)00gb_y?d6ZE{8-1ca zGtM;gEVIrw`?^>qhiga_4 zNwQh~>OSAmg}D8l9{(k~Z^`{na&tNUN4ed9D>*08{r{Al$<6KbLvDYN+EUn_Cb46M zI@2p)eH&kQXJoRTM^Pk|@T^w!4}aHZuj?7*X^4%N-6_x220u~r+@TD)dTJZnbM%}@=C^MBAi@}{jAx{>m*1JU9nT7PZVz`lM&R}Pl=$14 zV}-uM>SI2;USVQ%;+nh~R}}ZNqg@YIY`1pZ&lsDZPRlNMhPcYJ zVh{RPLt*&sln6?Z5LcGYU=AG)L3?Jt$?Me?U3s{NRl~IVMWhdxx*t2hEuZX1SWjQ2 zU#Z}Bd(H!C=GwSPekRA=M_C!?Uvij}3r|QojmNi%RyBQ+08zaswWr=(#oRUQFc*5a z?kA2BxpLq3JxX??@)o@=pJJ~$rFo$llR#1Y8Y^>PV@fYpF8i{Z&x4b@>N7cQ&RT*U zW4JupGdz+A=<_6ih0Kj@&VKGON}W&PuVLoZQy#uAPM%|psL7G(^u5isU3z$lu#0Xh z;BS%UoK-=I3-q&eB!0DZkHl3I$b1gHa8VpOih!X$A@G*XJ)vy`);N?_b}pB%+jEz@ zEKpzQSHCNo@ysI2e$c&Y%9}3)mNBM{>MgD)W1COLwlns$Mw@%*^y~+lY5M^wEOg&A z1#wG5>lhL#-#q8V$2BUE7B$^%J=1DmKExFt!-L<4fVCSmh;IBSkV{v|a z-ysR0O`qHnb^vbHiBNC>qv84z+E@I;kw3LQ=;k!_92Xalb4U+{icB~iEC-|ze zji@7sId56eT8kUx6vM_X6pZ7-XOEHd1n(4XoVyHoi(c`@C>iPphUA2O@A1K%w{dT% z!%8@Xf#(Ubkm6C##}N}6ZXXxF0SNnigqea_I+?s#bY*Wz&V9_8vwN=}GL z_vB8(Xv@V-(BS&I-4GfwWwhul+JXv6f6K;WnkL~E@?K!J^>8PH13}X`u~N}&^MUCu z*b_GJ;Atgjydgd=W@*{L?{g{{AA}o6)Xzczc-1iz?^!oqbz-z0SDEeC(cxA2!R^sE z%mt;}vu=5;jGis?;`r>TZ}2)CEY^slxl45jnsdZkbN5%lZF4+?Dg0iF%irtqrQwq1 z)c~URTsX~|7I)4+B7~993|DNI&dAF=Zw_KMF1tq4;&>^da7LKIgL)Dhurq`>A5>$> zy>Mfd6RD3J3Q+_t<~JXLVB_ww2Xmn~Bs^T1+z)PeX3#{*8;?_-f}qV!b(}Vi`-yX) z**LIyulrJnMb*dc0eKz}upzieIsggoNa)FOm4sFNNWsq$*?l062kdYIBDnP}2TY{G z`xe>s(=*6`YXklczy?mU-2ehY_8p`qD5>Hro>|v^4Ug%%`vhKjmG(L;t{z`E=338? z#PD8~dyu@-u0G)vpMmqWXfn*rUCrI{3|SGSDCFUu zc)87s!$I13Q6iEfyp#uX@G=5f61EfYl+ADC?epdo@YC%AD56B65|FvSQt(@Tb8lXL z>niR!LIZ4|gA!X67F zr;T5HAs;{$$JLKNGRQaIfYZ_eeS!d7jKnx$EkL%^pN119fC)};-f$!-r_^}56EDAG z)%_z@5rx|yLNCX;@GMUN&LGAmDCS+)J?dTvHF!fnw_RD$wSd{TrEe54?K3F30%TL@ z=ro8Ndj#kDTCsVLnSw22!=uM~$1H}o5>Y7O6F#Vq(DhV;fydtw{&pQbVu^U3 z>X6`k1my5jPbRK|{pUcd0r;zmNP0XMu?u&=IRo7EZ=3|z0?Hxgf$>+l(d@tl41z01 z>xCH7wek8rftQj7Awbb6ULJf*9B#Z0t}uYW_HqmMw(!F^i;_D~KX$>2j=P&%b2A9@Wy`JveDqu5ZGy5xfRb-WNkJIDzds@;%g^I(Yo0bXIny<8SW#K=lo z*e4(X;Vt~3<0cX2G_P|EW7ZB3=x;d9Ex)Uc72C&}|t^!$kw%`>G z1&<-r@m##(z7vr)z>;sgR)#!4KGB;Am70*-K}4+=rT`0oro+RezltVlIfWBm9~&c@1fod?{Q+{* z?crY$W>hbto%9#R4YUBp;>2}`1hCZ!0tHJ*PCAN`1w8r9QKlQPL=0(HP)dAr8lX2= zyP*p{oX=ySno!>=4l{P}k5hgHma&wHX;L$eOAcoPg`t)}8~Ht7zvBwwhC`}iJ*dHk z^Wy)f6Bb_`xPqsw;#pZjf*Fs{xu1KlojPCWEfRTptP+}18O5EqHm87C(+TMZMT7ZmtVJgW4f_K_PDl!s$N>G6YN zsQET610q1fH?)0-e_gl- z7m<2hag+;!-W^N?KQ%p0kFX$3@~3H$LOn+;;-kDYfsl}Ez6_1r$_m7`B2aZC zw?yeKY#wk%JSxLi&O_qyKt^b(vNW@bhv6TvrGDGB3k`6lUAb7ouSiX=Rn*8IY2c7J zGVo+jW>BCV{K=_IuaI=)r@EBM(Thq{`#V>pJoFA3K`D7K_$h?-C=s0%Vjf|uila~H z$hz-d)}9utaJxV%P>GVS?j(3hINn1BEBryiBLf$xa!()hG=ldfaIvf;2*h>Y{`o%VC5jGTYy)` zO4J>4`IkHip1ycI0)b$x`8m_?1J!Zvd!oMvcU)G?Z8!H;m5vr;l&kQGKNuC{6E_CD z3gXN47FHYa4-#}gMfgt%@`f|mzXWNYYzW)nv66D!hrq4)-Ea@?HB31*+yvAdPcWCf zt3aX>@(?Eooh2Ne`h?WLZp15bznhRyIa+8!bDdBWQ@T4;rd(*j@N*}H8{6VCa61e&;h4>-$9oMGSmo3ahVKB9TAKqp zLL_BMo@-t5H1Q3&N<)OHU%i%2vP~#l+qm6f@E6;u2ix&R&U2epfRlF&cnhwi2_Vka zQ1KE#8Vzo(Bu_;vW4SN6u-~UoL)0uYe&vsoLO29qB=C zwfY=KTPYA_R)i5jX@#S&lp5!SLBRJ@R$?3o5w{mQCMW`Mmu2Bh72wQ9OK!2ylUlTo z`6L?6f8vX$5D)V4(af zyMPZ3cc?&7tR37Y*-1+hm>KYn{cy0#$N43w0VKaf;7A91Y2f65<29sL*v!+=15- z9EKMLxs=-h8!duj(cu<{5&#DBCjsDg z;4hj45Oi{?bxjKyUPWOn;1{&ke=9qFijKe49NnLaj_u8b0n)B&iPNat1dgH=5gmZ& zaK}lxETt0n-j^GjVAF~x7UKkg%1}#A7DsZ28&+QkS9o3}VhJuB^t|tt@Y^T0Ks$^o zY!_8q6_DmVG>^766lybf<#Hgsuk;@`|upAd^ZW zLnSL-qT|Giiq$=-j|WA9a&`dE?A6tMsS^PQp)`;ZSAg}MFnnzz)#EAW1 zGjN*RhjMhStNo405N=0cXam@dFT>a4Vbv)HSm8xbhLf@m3b*Mk4#03E`A^3Bj><#V z>6EfI$rogAdI&^-hpBKfJ&+xTyQ1P%ZrB{Rc4w7%0u-Dhs)NJBae4ULpv|`y9aaVj(0!|be z0eGOBb%Hl|7eCcWBB*JZ(_O&2ZkZXhuH+0Z5-S8AT=Nuk*qjnV07pKBs37Cd zt{7+lWCDJG_og!yOq?$<`gE(Jk}h<#-@CmHl3WQVi(AhpXG0Jw4o9FK2Tah4WsoIQ zba*QWf~F#YDFPOGecwdHcU(l`tOCbGZ_v1=GxV-1-HaGt`pg|;dQ}A6waTf5pzw(8Z`EC}Yg3FK(TN$&rWMx4K<5qmsYL}zJ46@#S@D7HM? zDoUJVGF`kJxM7sNsrvW`aN)nQh42itlp5@|UA>79!W7qwEzai!{tduIe92JdZrsJr z9GqR0J6-KoR9z}}fLtOblFOx(hZ-`8J$}5g$0Qb&R~G@+H3IN*&K7%u8UrsM8bGil zpjun5s1pV4K^rfjO7)mTtbE~?;Y7d)6%&V2s?V)R(%|3~rBfmoUUhqv3diDVZ>khO zI5h$>KD~-0bxx?q*#K-p@0j_W2x{0T_^JfFJFc`&Cp8gNVAYY8{|)l0keypN28o%~CcXz(M=i3K_r~eK zH9YYQcj&rLP}fPE@p9^0T~nO&#w?Obr66jUc8AF!?>ktt035q1onXBJFi6lIMytXm zhWB<88Jj-osJESHopz%9wiC&6`*$-@_5g#{p5<`sIyodFA-^mJ=)9q{YTwBBg+)~B zOEBM#C(LRj!R6mdpbS-&dUo5|Am)L>;F9muVM|Nhx7Z(mLj4;ctD(+_9*#T~BnZ{d z4T?Bj&p_3c;}v_$D!*Ln!xJ>Yv5a(Tl0@J)JBCSubicD>UfDk+P~2(J!F_Z8Cp)Iv zFlLCkBa>xaS$}bk?mrylr^mxt) zhhAO0=(IeyfEVD6sH;YcTNDp(Lok302~?NjL@YUC0k~C(%fK-6F_Mu%t{4B{aeWzvGm+Y($a7pt|Ea zc>9C9#YOwaQdRu($536+(T@W5`dBK+s*GxuYAIw{sxGIfDbgAqj6oXTJ}nSeRqTHW zw;i47aPH5`xz)WD=6E^x!hi}e1kSBWJ>eQY@~98X+zx1pk|p~8x8 zO674|+|0lgh9OY96|}Od^roc4OnR!qqH+Nt=>f18!Y6Ug`qh>ikU%9xRSW*ciKG88 zUH@3+TF2kEr4gWXKU#ii4~IbX(@9V=ro#D!E%W-2A~NLY3*2(W&a9>E04m4@lvTNn`!wMI&p>mfbuj{NMwwf{TN&7>%CA`_Maae~h*2Ii zr7U8<1OCOULeKF4v%BRY@lHOAtssy(g&a24w$#%VYmF0r=yH!u=?tKsdIomKf^L=g ze$@B==CgbMqW4u?&R?a)Cd9H-#XFTnh!G0ZPi67C;SN!i#ek<)S)2g*on!?-1*MzX z4Y>!js$Rhfa`D6irP#P`VH0(P?>;P`AGHX{NiPEDic* z#s{pvDvoAtUn1ik)q*t=j%H|ZQO<1&`B+R0R}!RFH+AP`l#ql>XWU7_d+Dy{HLV6g zNVh6!J*`!k+gGEM<>s-aE^j_i4w$-nbP=q#oC&zt!d?JS41qs_HCMz1_+Xt$pY{@K z=ed4#n0%F5)n5R~{O&MO>>sr(cR|V=DipUPiP`dSULQ>(m>OsLSvfBTN?Fy41QWP2}kUE*FhmlYqEkP|#uSj4NPLY?NCcTlYf=em_@y{#3tS}VD32Xuqhqrmb6 zTSR#+ry4%~I$H7j4%R)XK9}dz6uF~p+VN=+*jL0RAjuCGbPS1TvzvR-49vZTOUXGb z+3L^x?v`tY>iWYSjRdYOG|ci^3pQRG0sA zS&Ilf!V?PBeW=!eQ^m8U9m13w;33|J+a0RDWb8eu-Q+TTQ51T61Kzagr!S!W(iM<{ zQ(83sNQ-jTCkU$Xj)2)s9W)!mR{)2a(NmY<(pX2&i7=-seQ^atPb%9ib#38@mM=F) z-0*bQ)UYK8>NFW_fdTGM?a&kdmBF+{yi3hkE@lM|ypqNOBax;mrKO_OX)^=E`fc$8 zx1+1D|M2@ooI$l3G`GmshTMYUm9oh}d|MSyaGG8V0|sHo$Eq~`B66WdTRdyN9cZA1 zGv%Xx7^|Ct>DPMerd&)Ge-G9f4=Dc>PEYX}b^jDjRec7m+_yWG)45tu&PSC~uq)_j zV!lA+bkff!38|d<&m<(5f0B@RPC&$05;C1$qmONWAk^O>DEAXWA+!U>_ZA$l?VR!t z-i&AY!J9+-=FQHC^RG$u|M2;bpx-dR`y0@&WWAl%C~vY}r)5pXZ?b+2XI;jYtgqH( zETJ~YJcBElFFh(}t)|9VG&9zd^MXf&-n`n) zZTji(Y;|Fu>8Hc9PZxG~pM=F}#5U=ur|w59cBnRfBAnEZL{&~2HiM$q*s{Uw9`$TA zV;n*Mez0-^Zq~;auelre-aeVsGf9pm+V_<*kM<*N+ zz4I{lRfLNk6)j{yoJ7$CiyGs(2#~oVx5l7w>cFya37v(dyj-%}$U7H-x!E~Fek?o` z<3gwB#CSolitdQknNzIi3i>P83XE|5Wo|j6{b4+C+(NxV|p<&1<81g#_A$KxE z3Qe%%x1&IqWm^&qK=4VU6-8AXiDl6q)qoW(p{U5+uTG?mZ$d5v+)~JSS?kkY_ue2O z%jpTz6qR;vOX=ks=Ahb_QhF7yze;r8nqveX>gkU8*&Cy2)L#?kfBZafLXJBYa|L8q zb?B&6GmVdW^b-&dxgzomO$YBw6BbR5FN)2m{RQh6d>WWYj%p)m$~4}D-IO%ZF->9; zU9-lxC8Q?J6drp{)77xikiPR*BFY~`zAO=?q7LEMT-ayCj&R#gA20wwZG%<`fbUv^ z^+<5%ai%khy6ln>A#W7{r4R*E)Ho=Za{W+zE4>O^q)(%a=CB<0G?a7=36+(Wa@Ry1 z-ZX;Jdx9=prQo|KzT?SiD1WS)L-doBmP+zDtK=hIEp*(g^6;E65nVX(;vzF763ze* zx%fin0ynpz6db-2TIzv$2TnV=y$ZGzr)hGNuo+d(H>f2DmgNi{7^*}*-QbDwJkQ~C zb5#`~6}G%nMIVO2*(aesWfpMDUM&^4geTk@pj2Z@w~Zl0zNQMHlF036Uyl1<8grW3 zR)vR8C(CI@N~#sM?wT4iGRLpc#u0B7FDG8JXK+1ew_dOjG-`FAGg>>mTwP3+!F?Dwx?Kl#=-&GiY6d2Vc^D}***+3w# z6G7O|_dH53Z}72s6s32pL8bnqaag@Xz|^9&bk_XZjnH59?hz~L!lkczdp;^z9gljK zyX5w&H_AKP>6(!CCMVm#^V~8H-l#TS4`0+U``mAJY;e~Rx75&ozov5ea8vF-Jyx=| zDoZR*WtNsl<51_xDJkRrHSW`rx5mrsi8(BEQQ0GWF4ycIu5_J|(ET_gxwB}JTWy3s zWOdREHPypMv7$QF3Lclbguyq#7nskzEEijAB#NNyF>^*5qFoS6fkHJ-6Ja?HRjI^& zF?;k#@gM2Jzm-=67pn_H7L7QPu`@@YlXhGJB_I$r<$@W9np)QfCsv5r_bBrTS6_q7 z`VDT=eI}V$YpP!gDyc@fdbOC<@D1`;>J!+V zG`vtO_4)enxK#7+Al}!9BdwcvG-D>vA^&N{tXfX&ppiaRyyJ$2^7thT+R`<|_9Bne z`k5^EH=zKUZG+`rl&Z_t?6=DVu|3v+`4-R<5N&)a&NrY)fJ%iGmHsYN>Qg^YFlnw$ ziCltaZ?06$vvC1$V{$iYh+P^r1m$WFToZrlOSU=iW_`&v2d;tOrUqp^}gp}@IN zlp8Oc)H9+ep`8`{)>mr>5f5_)3G%(n4`^&7sznd^O!bWI1hG_#fw#V)uvz6ARAO>S zIGlSv0AVBU)U26h&YdTMGw(f3f7LIgMUI!{I;H_w+Y8mdpJy$D$gD znzjBuqY>P%8I41Yf31Rbo3FaK>r(}*;xbkQi&g}yDuQjNsW;$MC5T=SZ`Der_5Yp& z`1CKh8eTu0*&hkt2U)mr{-C|$t1Sxr=9Q;Hhe zhcY!$r(|x)O1?fqPt&^61rO3Ykx&IpPI8Z6)QWNtKwsQDXGBQCQYUufG(|HJBcVT8 zl@bV^)jv0IDNWOXoDDh*!54w4YD(!~UVgYWb&s`GH5iKZmv$k~%RI}PpQ4vozS3kF zW%@Av2)^Amtgp5{Qzn(vu%Ys}+ls~uaDi*dD8v)@sJKXbIdn;#$?|#S5LH!HtJT$V zmwI+gxLprMdq7i7>*AJ%fuMTL5R?FtZV6e1*+vM#Cu)(kL(kU7Q9S)D%_x zS2|IM$d9U-KFmeU`1ony@hFDV?f&3-n&h$jQz6vaE0P>vUa7?^DqE@SASd|n9mL_^ zh5~mOei@&R0;Bi2`M05d$YgDL>xtR{?4zu?o> zJcPgXS4v7>s*tIbP4>sOckJH#WqF4~l-v)d^nXQ^q;_Xi_|3rET>PJM@c$(RpZdvo zyZ@f@{+EpRd}WBHa<9v2fL52GLf4}_^}u+BybQm9Ysgb=>37k{m1Ggbs#Rj+HfNNk;FxOBTm>gwVLZ*IS*#?dy9r%MNo}DavYZ*N0bx>? zY!H>fNRb*iWhgsD7?lHR3g$^J9=r;=gE%T#uN#BvJ~}z#;Ofi)kL@AnY0^W zTBd8+)H}4e)f@iMvbdw>`~ZYPK+R^Dm2Ft+P9qR*jRrzRwbU+&0%wu$08RD+Lf6x~ zDiRw04oWF5b!;Mr0*ft5~l-8eT0v1zLISerrydp)G0a+ zQ6H*5rVDpym7)4}eqaB!Gs2zLh+jJ+J|&HE@)l_YZdic{`4bhA+Nt0b(D176Y-E{& zpf6YM1wSMl z)t-jhBCrxbD**liA0XIpD#rq8^7MqIuHg(+Qk6Cw+k#ZrVsl5TW-CTpyXvi;=e)Fy z>;}AWJ&>BD)jsOYP%*H24gNND>e}8f@Z0td^-LO#P)`o_aRF*k4!#+Pk#=1QI8qBN z0#bjsWfi2~OJ?pr)y#gD%>LLuC@-ciO*GzFwk;}_5dadNbWcrXqETqP#+b#HfMHR) zfkc%q#cU0`o<&1VZ4nxR2X9?XSV5KHZ5e*GPpj~;)J&1m)}#z4R+XU-R_#RJ)D^Bm zur}EN0F#SLQQ%!Sr1Ibf@CklIusXPRWHbf(cB`KPoUc7q*qiu9eRo&9#ms)Do^GWL z<~W;iP83y;JZrHYEu_=_ySA1}Yzbe7^}h*qZ1RGOXk$>cQbSQvkqfcG#x2jHxs3|W zk<$h|X<19it9j#n@ZkgsK&s>8wQte-nBn{VAq zBgS{fc-3WLDafD({Mta{+AD)K_-2dx&TOsY9fe13OQXFw9{EBJlJ2FovdQ54L- z_M+T20m?x}C*%O=Eke_<=BI0koPgtv0Sn5(F0?BXh?k%qDpcCiHAOFR=V3VwkMq|` zNG&43R`{&#hTdc8cq?o``^}WIwvl|)c!8>6Z9A$8IB?CJ_9Uc-?l5h2@$tstKra|& zunEOgwd`)$%CT{#-82rw@ij%!r7Dj0Y~t2AR3|*M)xRN^Jcl;!L;|UbU!W{&lRH^y z%$A^t{BNy|N~Qs!O|O+V*+(bFVX)vI^;0!<@;0CP>GS+7p8hPIYIP*YUn*f^&~FQc zx;rlJ?ZuP9dX&qHCn42CB{bnlwMZ@D$wzq78K8WxB?Pspe0nBTjr;7Ny2J~Kl=|wQG8*GCEgP!N4eKJuNQmT7xdl9r!DBU$w@(Gt zSr7R)!BRWO4}!JRZv?A7zqtSJ&-f$U>{suuwNkvjyPrmiPvfpNQoN13-@E64_m}bv zP6e}lYamRSP4!&QMbND(%LCSSi6sQF2yJ0#r{y{#DX*4mKUYy{{Zi6befHMao<#9g zI>e65bBBD}&M&X6StmPjdRe5brt_zl1nCZ~mMmSp#E=BlT_Mk)^ z?o&H-kq)XE;VVv4w>I)%Q#R_S{K;K8>&$bj}oj(`E>Bhen#HAl=QTj=`XqxZMJLh4` z99&qR#B;M{4soBvbFc-Z>3adGv<}<#X&A&+me{6R4dVLc9uQA#B5i8W0da^VPo*`j z2}1#2nebos&HZV>!u_1E_>Th??~v_y72~W}IMXPqM7d;~^fQp63E5@ogY-3#LMSOj zS(`{veo+`NOqI5Ot|S#XJ`HbYE2%2j|J+K7;R!BW<1NnGe9l=R@M$e@Gr$FY^cJXz z$%g1u*48oWkTr&zK2tE3BKn?!QHn@=v_4ZX)&DjH)75UH`*6vg-IbhyXzKj%-{iOH4;KHG|hP&R@e)FwYD zkyDp0IzL52mCo=Tiw2UyyRC~+8CBbc5j3kgaSO@@7ppFCTM>H)O|RxuT+w{%u$5PW zA#35Tm54XSpzh#g1(taBWSvU!7xn*?nVjlOiVpV31Ec=(xlsRQI~O1{Z!g6?z8Wcx z=L)}cQD~s@*UhH$`Dcgvhyf*3{aS;c%4oE8_jmBqatYC?16z}ya$U=86ouYZ%!LGXFRiv>EKvs4@xu$ldZAjf`EVq@;;UJwKW4U;+3KDPcST1+tkWk2H zEVpU$34U-Ap0}1fOT4fdYjeP#5<`jRct6g!2aYV|8%~Sy+%C$7^js3cZ{>PUMN%<6 zpMs<|a!z|E1;G5++_#;7F|#-6>7d;L_L9<3wWDBMrEA zP_cq}`pnkh?azd@@0ZaQO<3F1gXRcS%f7Ty3z{L|s_c|;R)zBg8V*}&;v2F1uLzl82f_zKv6NQ+oj#Qo1{5k0P6TYig?HyL1g*O6x4fS9^oVY8ivn8~rUsh-H_Ed}0i(&(d zZ~u7m-xG^L%M>`qGqR{+%=KenQ8m9`IN5)qWbU7w%my-E3i26j`cRO!SKy@}XRzro z5ciq7_J3YG@Gd3#?>mXyZ%c{f!1p-&Y7ebBE4@y=OWF5#rB^vw0j%w8^dizO<)imm z>80fifjCK2Dc^(CHeB#ENUibz@?(&icUkR_<9C$$30gAxj#6_@cysjVFNv!ABU3dC zP0znhnEqkF)crnTn#+F$uz$p_T3DK9d1>C6>N`)6;4j|BQy)t^i4>`IP5n1T14>#X zETrD;!6vs;xktt7pQF+c-}9J;^m3-~&VGi&nTnvet&#)`yz2$s*Kh)_LC}Avf5%Z{ z`3qa9&wrbkiYe*IFIL(NdQggXnd%t=dpl)LZ0wzr-#SGt$Hl=}`>V8opd0As8pprG1_j8 zkB0;dq-M8V)CmTr#vZgMJ3L=WGTSMxwyl#SYmXjqQQjn(ma8vy2y8;O3PNYj=&QN< zbgPBKe@=TfaR2nNyzSNM3sO$U+N%+mA&=^vrth{3(;av!2V!Z|hV4AI$o>A@qQ8A?(J4b{lqXnV zaNkS$^+j)6`M0pb^JyOa?%l2BXYcNu{?u_pP2104y}C&WBs@OS?3$ zGuW+C1PGzvUA3f6dv0wv&xrC`i5rU=rpz#ltdz~8J)^qqs#>b579NfAdOp$+Nb6qn z&FZ;)#Quh;#(j&@Vy$y<8WHC>z0A*zrr!llRy{jX?T#8ahj4IZmP^s|a(fnWzWQFrQts6EKYLW=Rtg3HlCct*K zDQlSA*|&F!-v_7q#c5+*zs#nirY(PO+)Dzg+L5kNOzR$T{}_P&%kk&++q0S6zdxMm z_h&QNZWt|^-6$-n%a z{8Njt$jsXpq4iKeiBDgII->CH_4Gy5tjB)Nbj_c7uvS+J1QLwT^y34IN6xnW9e>xIYL;g``1 z)>E#hVy)(^fi=}}rF8n2@oBZ3{^bb=k$=*BS|(e=_R_UdX58E1HT0l4iI6Z>1%B&U z6)qR`%Oe8Y*Q~Gi(H;?KE4?)`uLU@27!=gdFs(_Xk4y7Z8a~rBz}6e+*)DsMq_Y|6w=*zaDL&Roswg-Lja3(1B{EQzZ<|$XPqh#9J17P@}5E+MT1g=Znj@T=VvJ z6wsKR;D&h2{(SFm^s2M~!L-e!4$HD!_SCs%>peLB>cl&t9bGLqTA--ixhgz|sErbd zsNAlqJ{)AZm#rc=)qtI&)vZOI5X$@T1f>e%=TSV6=6&V!C?1t(6@iwvE_ZnlTX^x$ zeHZROF1*ly+2%gc1Nk+j0N&L}Q6b{?C+(@ii9>O<6i-iI(f>i{DqWr3F6E!IllEjJ z+b^6?4~G_6D%axlXry#jf&I&Ts_G$^;qcS*a2}etY@31H>I&*rRG}^el|QQXXKZ!N z40V5e?c-{Hx0B8Nm*sZvPPU+nB}!{9JAUTL^Mw898Jr$67Gz6$24@P|hA6&fV|m&l3S{ifYcj0m<8|xz)QF-r{9Kbb z+a{6)@ZU#pjmQ}z{-pjTHEAn9a#+7cDb-7$YS#5t#X3>WGNNyki`R*AdVG(=nP~32 zX{ZthSC!?wF)rMCPne}`W!1B1+l$}{0&3-gJ1M+~uS>MSCE&OEmI%hJ;WbxM^$5pr zQ&vlOBT9T)gWJ>#^pX~BS9yMr7WZyhe_6}ze`75`t@}*8#`ReZU(35E>T5N8UT8L$ zBfhKQo9&4Twi@2{MA^jaX9D5V41c<~znbAs7x(yXhF2T+eVXBa7ToI@!_An|wwWo^ zGg$#zR4Fw@LGIflwWw!60dkV2YPx!#+NH#{GLb~hTTToJil0?HvQ-A^>bgDGNE0#BB;&Qx!IcS$^G zPH=+v${TBI)iyA%1{oz%>~Wp46q$(_hQ{6Jb82@4!T4Rf^W$=$hOg3{2unScJ3&wF zcg0S&&0~YXbyZngO*QZ*SF+CoH41`XG7&vMLTQ1sCPKdGu{9Ca3H9Nuzf)FBsb8Px zp?W|>wI|!DjzL^}^kl#Ztb1-i#hh`xkC1Ik3;D0|2v#dxg6wXql>#_4^c$T$4e8`F zF3V`xf(!icS3W}V z$gCmse5GbjDRo=*v1W24dO!0#a?ngcO`B%pI~2G`xL8pBbrSamHK@(;%70Ustig)pXCn2M){y4#uwN3 z^PL_}>lB@&jWUk@buW%_W`>mymFqeYr@m>b&v2a z)jXUM?v?`olsw)P_^0G?QsC*=wwCuvpjHpq_H;;lD$J!RXv_USC!dXR6NCPC-TkQ& zxu5Iq&-1yrt(5(w65q`-<&#LXqO3;TqyRCR0_cf@?y<*OXc_(QkBj>oJ(M ze?4wf8qhVR_}uM%VDx!_Q+>C0pKtP#`nJBQ(ix%sJT>pfitq0Y-#V@-K&8wII`p+y z^VhDvSMS{aqIk-93PQU758t_7M)_|Ih5!HoglR)VP)S2WAaHVTW@&6?004NLeUUv# z!$2IxUsH=B6$LwpIAo{}VnI~IQL9jd3ZYhL)xqS_FKE(`q_{W=t_24_7OM^}&bm6d z3WDGVh?|>}qKlOHzogJ2#)IR2yu0_fdj|;hGSjS%aX`~;GnI&one3|A`HB!C=)))= zGs~Ehq$GUD*F6G!y^HZI|8swi9yMn%ARrRYGQ+fqH;AVFVHWr1f#%yep=I6^EI+E{60Rx~x@DdMQA>69;IJXSexan{OJ*1RWwVK}F+ zEOVXa5E59#5+sOFP(=x4*oe`plVTx7`*9!tpzD{&rI4!xMvetkph0&1;D7MDTPr^~ z;U$IRKz1zUWbxTwBfXf|V z;K`6p*_DDcg?t`(KcjET0{yo@_nOyRb04Py{D4^000SaNLh0L04^f{04^f|c%?sf00007 zbV*G`2jvA65IQ87O7`&p000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-} z000FSNkl9lGD0lj&s;Ac(X*4@C-81z~cYRe|RZGSg@QsKX zW6TtZE!C#vo`0R6OXSJ5Yit7|qD3M)0PqhHO^E0z5p_eIQZJRqW?dLN^)$7Kd^8j=6h z7y~lKfQTjlzKp3700M9X;GQw&4ZnH5zlT|GSAKlx>*5-K=K#KC@`bjEG3F~r0KcY) z%N}n7ctJ${%LM4Zhln-+ys!X~0Qd=)1NoCB88>pV?Hd5kh-mwKe-E7pkLWT$b{;&U z^Zh*#(H4Mb0B$9kJNZWdekP(Oro_{PG8+IV0DiFjNXmp7)?{tT{@wv_oRKTYA^t;` zGi=584-TltRCsnX$*LZ}6QNx10jykj9%n2Dbff^fn`2L(DFcj|>bs=?c;o|7UCQ`1oj62KCGcM5l zcSQq|jph=7w?Z@aft#@`NFQ8?M1)h9+o^S93~tQNOL49MI8*@K6#-NjWe2oxbx$&t z#WvH*5i@@JoecEisF!I%r`|jsu=id)W#B z#a0v5*>!GiPLwA}F>I|-bgPM~cJk}1U#R1>;_0eowHbLlV;f9st(zj3F6C*=*mr#o zVC~M$o49uUdONpH!mts5m$3>N+7yP!kIqKxlprs2J$dMWRwbTf%;f)x3=FMm$oy6B zULzXv&&T2zPsG>N#(37XBqSmn7Om?kLiZPC{%KTtdcNFVDbp&0qER(#rRW78U0;DJxQXKv$$!b+{_=~ezG1Jo2 z&QDeXS}#8t$xF7%G}kIon^~s0P0c{tdb*l51JU)Q)rDbIr5D^wECA|Nf7GbssX2NH zpyhQu02Y)0w_^a?77jDS)RN<;^)*dxw+YJRNKH(rIQs-C|c1TxS6%&=)qAg7Z)znWfwv?+}{*6!9uBHaP zjc~QwXKK*993)ww2X^XC06cN*RFZDj)RtE$8C?MI*vfrsYtOsR{E()gsO0}2p}#?t eZYBR00f3K8$Ni3jI4r6F0000 Date: Thu, 20 May 2021 21:31:21 +0200 Subject: [PATCH 007/322] better handle unknown errors --- src/api/Api.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/api/Api.ts b/src/api/Api.ts index 6029f6ee..6eee4d37 100644 --- a/src/api/Api.ts +++ b/src/api/Api.ts @@ -97,8 +97,13 @@ export class ApiImpl implements Api { } } else { const errorResult = (await response.json()) as ErrorResponse - const message = (errorResult.hints as any[]).map(hint => hint.message).join(' and ') - throw new Error(message) + if(errorResult.hints) { + const message = (errorResult.hints as any[]).map(hint => hint.message).join(' and ') + throw new Error(message) + } else { + console.error(errorResult) + throw new Error("unknown error") + } } } From 84f7a949f4bb940ef575737dc7ee235660e45b3a Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 20 May 2021 21:36:20 +0200 Subject: [PATCH 008/322] log request --- src/api/Api.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/api/Api.ts b/src/api/Api.ts index 6eee4d37..5454720a 100644 --- a/src/api/Api.ts +++ b/src/api/Api.ts @@ -101,6 +101,7 @@ export class ApiImpl implements Api { const message = (errorResult.hints as any[]).map(hint => hint.message).join(' and ') throw new Error(message) } else { + console.error(completeRequest) console.error(errorResult) throw new Error("unknown error") } From 2e6eb0c68fb6e68647b7b523aa9617d92df1d44a Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 20 May 2021 23:13:00 +0200 Subject: [PATCH 009/322] use initReal --- src/sidebar/MobileSidebar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sidebar/MobileSidebar.tsx b/src/sidebar/MobileSidebar.tsx index d97cba54..1c98988b 100644 --- a/src/sidebar/MobileSidebar.tsx +++ b/src/sidebar/MobileSidebar.tsx @@ -60,7 +60,7 @@ export default function ({ query, route, info, error }: MobileSidebarProps) { /> )} {!error.isDismissed && } -
getLocationStore().initFake()}> +
getLocationStore().initReal()}> {route.selectedPath.instructions.length > 0 ? ( ) : ( From 26349f2749907e72005fdc4953a9215ebda364f0 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 01:06:37 +0200 Subject: [PATCH 010/322] fix time output --- src/turnNavigation/TurnNavigation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 2930f325..bae2d5d8 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -40,7 +40,7 @@ export default function ({ path, currentLocation }: TurnNavigationProps) {
- {arrivalDate.getHours() + ':' + (min > 10 ? min : '0' + min)} Uhr + {arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)} Uhr
{milliSecondsToText(path.time)}
{metersToText(path.distance)}
From 1add513c1163c4889796fee9017f2d6bb6c8b26e Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 01:17:43 +0200 Subject: [PATCH 011/322] added NoSleep.js --- package.json | 1 + src/stores/LocationStore.ts | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 725470b7..f81c2505 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "dependencies": { "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#24d763ef31b7319735478a2af7f5fcfccab018ee", "mapbox-gl": "^1.13.0", + "nosleep.js": "^0.12.0", "react": "^17.0.1", "react-dom": "^17.0.1", "react-responsive": "^8.2.0" diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 4d15649e..2c018368 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -2,6 +2,7 @@ import { Coordinate } from '@/stores/QueryStore' import Store from '@/stores/Store' import { LocationUpdate } from '@/actions/Actions' import Dispatcher, { Action } from '@/stores/Dispatcher' +import NoSleep from 'nosleep.js' export interface LocationStoreState { turnNavigation: boolean @@ -12,6 +13,7 @@ export default class LocationStore extends Store { private watchId : any private interval: any + private noSleep : any protected getInitialState(): LocationStoreState { return { @@ -75,11 +77,9 @@ export default class LocationStore extends Store { this.watchId = navigator.geolocation.watchPosition(success, function(err) { console.log("location watch error", err);}, options) } - // TODO NOW - // if(!this.noSleep) { - // this.noSleep = new NoSleep(); - // this.noSleep.enable() - // } + if(!this.noSleep) + this.noSleep = new NoSleep(); + this.noSleep.enable() } public stop() { @@ -92,6 +92,9 @@ export default class LocationStore extends Store { // directly writing the state does not work: this.state.turnNavigation = false Dispatcher.dispatch(new LocationUpdate({lat: 0, lng: 0 }, false)) + if(!this.noSleep) + this.noSleep.disable() + console.log("stopped location updates") } } From 4ba79568493f49a262ad5d200ffdee016623695d Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 01:17:56 +0200 Subject: [PATCH 012/322] updated deps --- package-lock.json | 48973 ++++++++++++++++++++++++++++++-------------- 1 file changed, 33641 insertions(+), 15332 deletions(-) diff --git a/package-lock.json b/package-lock.json index 24e5a44c..39b996fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15835 +1,34144 @@ { - "name": "graphhopper-maps-react", - "version": "0.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/compat-data": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", - "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", - "dev": true - }, - "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "name": "graphhopper-maps-react", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "graphhopper-maps-react", + "version": "0.0.0", + "dependencies": { + "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#24d763ef31b7319735478a2af7f5fcfccab018ee", + "mapbox-gl": "^1.13.0", + "nosleep.js": "^0.12.0", + "react": "^17.0.1", + "react-dom": "^17.0.1", + "react-responsive": "^8.2.0" + }, + "devDependencies": { + "@svgr/webpack": "^5.5.0", + "@types/mapbox-gl": "^1.13.0", + "@types/react": "^17.0.1", + "@types/react-dom": "^17.0.1", + "awesome-typescript-loader": "^5.2.1", + "css-loader": "^5.0.2", + "favicons": "^6.2.1", + "favicons-webpack-plugin": "^5.0.2", + "html-webpack-plugin": "^5.1.0", + "jest": "^26.6.3", + "jest-fetch-mock": "^3.0.3", + "prettier": "2.2.1", + "source-map-loader": "^2.0.1", + "style-loader": "^2.0.0", + "ts-jest": "^26.5.1", + "typescript": "^4.1.5", + "webpack": "^5.22.0", + "webpack-cli": "^4.5.0", + "webpack-dev-server": "^3.11.2", + "webpack-merge": "^5.7.3" + } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", - "dev": true, - "requires": { - "@babel/types": "^7.12.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/compat-data": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", + "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", + "dev": true + }, + "node_modules/@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/core/node_modules/json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", - "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^6.3.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", - "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.13.0", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } + "node_modules/@babel/core/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/helper-compilation-targets": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", + "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.12", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + } }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", + "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13" + } }, - "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", - "dev": true + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", - "debug": "^4.1.0", - "globals": "^11.1.0" - } + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", - "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", - "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", - "dev": true + "node_modules/@babel/helper-create-class-features-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" + } }, - "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", - "debug": "^4.1.0", - "globals": "^11.1.0" - } + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", + "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", - "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", - "dev": true, - "requires": { - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", - "dev": true + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", - "debug": "^4.1.0", - "globals": "^11.1.0" - } + "node_modules/@babel/helper-define-polyfill-provider/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0" + } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/helper-explode-assignable-expression/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helper-explode-assignable-expression/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } + "node_modules/@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } + "node_modules/@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-hoist-variables": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", + "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", - "dev": true + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", - "debug": "^4.1.0", - "globals": "^11.1.0" - } + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", - "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", - "dev": true - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", - "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.13.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", - "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", - "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", - "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", - "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", - "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", - "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", - "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", - "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-compilation-targets": "^7.13.8", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", - "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", - "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", - "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/helper-hoist-variables/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", - "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-classes": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", - "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } + "node_modules/@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.5" + } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" + } }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true + "node_modules/@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } + "node_modules/@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.11.0" + } }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } + "node_modules/@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } }, - "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", - "dev": true + "node_modules/@babel/helper-wrap-function/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-wrap-function/node_modules/@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", - "debug": "^4.1.0", - "globals": "^11.1.0" - } + "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", - "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } + "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helper-wrap-function/node_modules/@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/helper-wrap-function/node_modules/@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } + "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", - "dev": true + "node_modules/@babel/helper-wrap-function/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", - "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } + "node_modules/@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } + "node_modules/@babel/parser": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" + } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", + "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } }, - "@babel/helper-module-transforms": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", - "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-proposal-dynamic-import/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-proposal-export-namespace-from/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true + "node_modules/@babel/plugin-proposal-json-strings/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-proposal-logical-assignment-operators/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } }, - "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-proposal-numeric-separator/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/plugin-proposal-object-rest-spread/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } + "node_modules/@babel/plugin-proposal-optional-catch-binding/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } }, - "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", - "dev": true + "node_modules/@babel/plugin-proposal-optional-chaining/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "engines": { + "node": ">=4" + } }, - "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", - "debug": "^4.1.0", - "globals": "^11.1.0" - } + "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", - "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.12.13", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } }, - "@babel/helper-module-transforms": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", - "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-syntax-jsx/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + } }, - "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", - "dev": true + "node_modules/@babel/plugin-transform-arrow-functions/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" + } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", - "debug": "^4.1.0", - "globals": "^11.1.0" - } + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } + "node_modules/@babel/plugin-transform-block-scoped-functions/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", + "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } + "node_modules/@babel/plugin-transform-block-scoping/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" + } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/helper-module-transforms": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", - "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } }, - "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", - "dev": true + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-classes/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", - "debug": "^4.1.0", - "globals": "^11.1.0" - } + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", + "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", - "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } + "node_modules/@babel/plugin-transform-destructuring/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } + "node_modules/@babel/plugin-transform-dotall-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-duplicate-keys/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-exponentiation-operator/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-transform-for-of/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } }, - "@babel/helper-module-transforms": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", - "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } + "node_modules/@babel/plugin-transform-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } }, - "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", - "dev": true + "node_modules/@babel/plugin-transform-member-expression-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", + "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } }, - "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", - "debug": "^4.1.0", - "globals": "^11.1.0" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-module-transforms": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", + "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", - "dev": true + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", - "debug": "^4.1.0", - "globals": "^11.1.0" - } + "node_modules/@babel/plugin-transform-modules-amd/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", + "babel-plugin-dynamic-import-node": "^2.3.3" + } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", - "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz", - "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", - "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", - "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/types": "^7.13.12" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", - "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", - "dev": true, - "requires": { - "@babel/plugin-transform-react-jsx": "^7.12.17" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", - "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", - "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/preset-env": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.12.tgz", - "integrity": "sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-compilation-targets": "^7.13.10", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.13.8", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-dynamic-import": "^7.13.8", - "@babel/plugin-proposal-export-namespace-from": "^7.12.13", - "@babel/plugin-proposal-json-strings": "^7.13.8", - "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-numeric-separator": "^7.12.13", - "@babel/plugin-proposal-object-rest-spread": "^7.13.8", - "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.12.13", - "@babel/plugin-transform-classes": "^7.13.0", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.0", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.13.0", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.13.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.13.0", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.12.13", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.13.12", - "babel-plugin-polyfill-corejs2": "^0.1.4", - "babel-plugin-polyfill-corejs3": "^0.1.3", - "babel-plugin-polyfill-regenerator": "^0.1.2", - "core-js-compat": "^3.9.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-module-transforms": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", + "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } }, - "@babel/types": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", - "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", - "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-transform-react-display-name": "^7.12.13", - "@babel/plugin-transform-react-jsx": "^7.13.12", - "@babel/plugin-transform-react-jsx-development": "^7.12.17", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", - "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", - "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.5", - "@babel/types": "^7.12.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@discoveryjs/json-ext": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", - "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true - }, - "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" + } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-module-transforms": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", + "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - } - }, - "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - } - }, - "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - } - }, - "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", + "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-module-transforms": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", + "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jimp/bmp": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz", - "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "bmp-js": "^0.1.0" - } - }, - "@jimp/core": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz", - "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "any-base": "^1.1.0", - "buffer": "^5.2.0", - "exif-parser": "^0.1.12", - "file-type": "^9.0.0", - "load-bmfont": "^1.3.1", - "mkdirp": "^0.5.1", - "phin": "^2.9.1", - "pixelmatch": "^4.0.2", - "tinycolor2": "^1.4.1" - } - }, - "@jimp/custom": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz", - "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/core": "^0.16.1" - } - }, - "@jimp/gif": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz", - "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "gifwrap": "^0.9.2", - "omggif": "^1.0.9" - } - }, - "@jimp/jpeg": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz", - "integrity": "sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "jpeg-js": "0.4.2" - } - }, - "@jimp/plugin-blit": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz", - "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-blur": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz", - "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-circle": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz", - "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-color": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz", - "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "tinycolor2": "^1.4.1" - } - }, - "@jimp/plugin-contain": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz", - "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-cover": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz", - "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-crop": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz", - "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-displace": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz", - "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-dither": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz", - "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-fisheye": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz", - "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-flip": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz", - "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-gaussian": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz", - "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-invert": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz", - "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-mask": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz", - "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-normalize": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz", - "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-print": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz", - "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "load-bmfont": "^1.4.0" - } - }, - "@jimp/plugin-resize": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz", - "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-rotate": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz", - "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-scale": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz", - "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-shadow": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz", - "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-threshold": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz", - "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugins": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz", - "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/plugin-blit": "^0.16.1", - "@jimp/plugin-blur": "^0.16.1", - "@jimp/plugin-circle": "^0.16.1", - "@jimp/plugin-color": "^0.16.1", - "@jimp/plugin-contain": "^0.16.1", - "@jimp/plugin-cover": "^0.16.1", - "@jimp/plugin-crop": "^0.16.1", - "@jimp/plugin-displace": "^0.16.1", - "@jimp/plugin-dither": "^0.16.1", - "@jimp/plugin-fisheye": "^0.16.1", - "@jimp/plugin-flip": "^0.16.1", - "@jimp/plugin-gaussian": "^0.16.1", - "@jimp/plugin-invert": "^0.16.1", - "@jimp/plugin-mask": "^0.16.1", - "@jimp/plugin-normalize": "^0.16.1", - "@jimp/plugin-print": "^0.16.1", - "@jimp/plugin-resize": "^0.16.1", - "@jimp/plugin-rotate": "^0.16.1", - "@jimp/plugin-scale": "^0.16.1", - "@jimp/plugin-shadow": "^0.16.1", - "@jimp/plugin-threshold": "^0.16.1", - "timm": "^1.6.1" - } - }, - "@jimp/png": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz", - "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "pngjs": "^3.3.3" - } - }, - "@jimp/tiff": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz", - "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "utif": "^2.0.1" - } - }, - "@jimp/types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz", - "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/bmp": "^0.16.1", - "@jimp/gif": "^0.16.1", - "@jimp/jpeg": "^0.16.1", - "@jimp/png": "^0.16.1", - "@jimp/tiff": "^0.16.1", - "timm": "^1.6.1" - } - }, - "@jimp/utils": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz", - "integrity": "sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "regenerator-runtime": "^0.13.3" - } - }, - "@mapbox/geojson-rewind": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.0.tgz", - "integrity": "sha512-73l/qJQgj/T/zO1JXVfuVvvKDgikD/7D/rHAD28S9BG1OTstgmftrmqfCx4U+zQAmtsB6HcDA3a7ymdnJZAQgg==", - "requires": { - "concat-stream": "~2.0.0", - "minimist": "^1.2.5" - } - }, - "@mapbox/geojson-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", - "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" - }, - "@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", - "integrity": "sha1-zlblOfg1UrWNENZy6k1vya3HsjQ=" - }, - "@mapbox/mapbox-gl-supported": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", - "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==" - }, - "@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI=" - }, - "@mapbox/tiny-sdf": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.3.tgz", - "integrity": "sha512-UH233on+8Okmj/JJFcxyc+HMSzKQcSFiiT339lFf2BMGs0+iEbobX7+GESeKVkPVtTFoh54LuNa1mC8N2ucM2w==" - }, - "@mapbox/unitbezier": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", - "integrity": "sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4=" - }, - "@mapbox/vector-tile": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", - "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", - "requires": { - "@mapbox/point-geometry": "~0.1.0" - } - }, - "@mapbox/whoots-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", - "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" - }, - "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "dev": true - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "dev": true - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "dev": true - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "dev": true - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "dev": true - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "dev": true - }, - "@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "dev": true, - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - } - }, - "@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "dev": true, - "requires": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - } - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.6" - } - }, - "@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - } - }, - "@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - } - }, - "@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - }, - "dependencies": { - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "@types/babel__core": { - "version": "7.1.12", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", - "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", - "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", - "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/eslint": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz", - "integrity": "sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", - "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.46", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", - "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", - "dev": true - }, - "@types/favicons": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@types/favicons/-/favicons-5.5.0.tgz", - "integrity": "sha512-s76OlRaBfqtGu2ZBobnZv2NETfqsQUVfKKlOkKNGo4ArBsqiblodKsnQ3j29hCCgmpQacEfLxealV96za+tzVQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/geojson": { - "version": "7946.0.7", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", - "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==", - "dev": true - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==", - "dev": true - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "26.0.20", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.20.tgz", - "integrity": "sha512-9zi2Y+5USJRxd0FsahERhBwlcvFh6D2GLQnY2FH2BzK8J9s9omvNHIbvABwIluXa0fD8XVKMLTO0aOEuUfACAA==", - "dev": true, - "requires": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", - "dev": true - }, - "@types/mapbox-gl": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-1.13.0.tgz", - "integrity": "sha512-z5YxncrARfKaJXzkhy4qS0cOldMfGIXq5yOPQcU9S12/xjAe3m66scftYlV1E10Em5QGdW2xahBb3CPk/dDcqA==", - "dev": true, - "requires": { - "@types/geojson": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "14.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.10.2.tgz", - "integrity": "sha512-IzMhbDYCpv26pC2wboJ4MMOa9GKtjplXfcAqrMeNJpUUwpM/2ATt2w1JPUXwS6spu856TvKZL2AOmeU2rAxskw==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/prettier": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", - "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", - "dev": true - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true - }, - "@types/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.2.tgz", - "integrity": "sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.1.tgz", - "integrity": "sha512-yIVyopxQb8IDZ7SOHeTovurFq+fXiPICa+GV3gp0Xedsl+MwQlMLKmvrnEjFbQxjliH5YVAEWFh975eVNmKj7Q==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", - "dev": true - }, - "@types/yargs": { - "version": "15.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", - "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", - "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", - "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", - "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", - "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", - "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.0", - "@webassemblyjs/helper-api-error": "1.11.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", - "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", - "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", - "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", - "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", - "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", - "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/helper-wasm-section": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0", - "@webassemblyjs/wasm-opt": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "@webassemblyjs/wast-printer": "1.11.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", - "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/ieee754": "1.11.0", - "@webassemblyjs/leb128": "1.11.0", - "@webassemblyjs/utf8": "1.11.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", - "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", - "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-api-error": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/ieee754": "1.11.0", - "@webassemblyjs/leb128": "1.11.0", - "@webassemblyjs/utf8": "1.11.0" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", - "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz", - "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==", - "dev": true - }, - "@webpack-cli/info": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.2.tgz", - "integrity": "sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ==", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz", - "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==", - "dev": true - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.5.tgz", - "integrity": "sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "ajv": { - "version": "6.12.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", - "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", - "dev": true - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "author-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", - "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=", - "dev": true - }, - "awesome-typescript-loader": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-5.2.1.tgz", - "integrity": "sha512-slv66OAJB8orL+UUaTI3pKlLorwIvS4ARZzYR9iJJyGsEgOqueMfOMdKySWzZ73vIkEe3fcwFgsKMg4d8zyb1g==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.1.0", - "lodash": "^4.17.5", - "micromatch": "^3.1.9", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.3", - "webpack-log": "^1.2.0" - }, - "dependencies": { - "webpack-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", - "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", - "dev": true, - "requires": { - "chalk": "^2.1.0", - "log-symbols": "^2.1.0", - "loglevelnext": "^1.0.1", - "uuid": "^3.1.0" - } - } - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", - "dev": true, - "requires": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "node_modules/@babel/plugin-transform-modules-umd/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@babel/plugin-transform-new-target/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz", - "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.0", - "@babel/helper-define-polyfill-provider": "^0.1.5", - "semver": "^6.1.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", - "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.1.5", - "core-js-compat": "^3.8.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz", - "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.1.5" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz", - "integrity": "sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "bignumber.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", - "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "bmp-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", - "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", - "escalade": "^3.1.1", - "node-releases": "^1.1.70" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - } - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001187", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001187.tgz", - "integrity": "sha512-w7/EP1JRZ9552CyrThUnay2RkZ1DXxKe/Q2swTC4+LElLh9RRYrL1Z+27LlakB8kzY0fSmHw9mc7XYDUKAKWMA==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" } - } }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js-compat": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.1.tgz", - "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==", - "dev": true, - "requires": { - "browserslist": "^4.16.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cross-fetch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", - "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", - "dev": true, - "requires": { - "node-fetch": "2.6.1" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "css-loader": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.0.2.tgz", - "integrity": "sha512-gbkBigdcHbmNvZ1Cg6aV6qh6k9N6XOr8YWzISLQGrwk2mgOH8LLrizhkxbDhQtaLtktyKHD4970S0xwz5btfTA==", - "dev": true, - "requires": { - "camelcase": "^6.2.0", - "cssesc": "^3.0.0", - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.4", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.4" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "node_modules/@babel/plugin-transform-object-super/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + } }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "css-mediaquery": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", - "integrity": "sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA=" - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "dev": true - }, - "csscolorparser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", - "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs=" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true + "node_modules/@babel/plugin-transform-parameters/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-property-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz", + "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", + "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-react-display-name/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", + "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", + "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.12.17" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", + "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", + "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-reserved-words/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "node_modules/@babel/plugin-transform-spread/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "node_modules/@babel/plugin-transform-template-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/preset-env": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.12.tgz", + "integrity": "sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.12", + "@babel/helper-compilation-targets": "^7.13.10", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.13.8", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-dynamic-import": "^7.13.8", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.13.8", + "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.13.8", + "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.12.13", + "@babel/plugin-transform-classes": "^7.13.0", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.0", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.13.0", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.13.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.13.0", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.12.13", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.13.12", + "babel-plugin-polyfill-corejs2": "^0.1.4", + "babel-plugin-polyfill-corejs3": "^0.1.3", + "babel-plugin-polyfill-regenerator": "^0.1.2", + "core-js-compat": "^3.9.0", + "semver": "^6.3.0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/preset-env/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", + "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-transform-react-display-name": "^7.12.13", + "@babel/plugin-transform-react-jsx": "^7.13.12", + "@babel/plugin-transform-react-jsx-development": "^7.12.17", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + } + }, + "node_modules/@babel/preset-react/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/traverse": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/types": { + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/core/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@jest/core/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/@jest/core/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@jest/transform/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jimp/bmp": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz", + "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "bmp-js": "^0.1.0" + } + }, + "node_modules/@jimp/core": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz", + "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^9.0.0", + "load-bmfont": "^1.3.1", + "mkdirp": "^0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" + } + }, + "node_modules/@jimp/custom": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz", + "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.16.1" + } + }, + "node_modules/@jimp/gif": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz", + "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "gifwrap": "^0.9.2", + "omggif": "^1.0.9" + } + }, + "node_modules/@jimp/jpeg": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz", + "integrity": "sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "jpeg-js": "0.4.2" + } + }, + "node_modules/@jimp/plugin-blit": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz", + "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-blur": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz", + "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-circle": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz", + "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-color": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz", + "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "tinycolor2": "^1.4.1" + } + }, + "node_modules/@jimp/plugin-contain": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz", + "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-cover": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz", + "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-crop": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz", + "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-displace": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz", + "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-dither": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz", + "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-fisheye": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz", + "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-flip": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz", + "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-gaussian": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz", + "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-invert": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz", + "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-mask": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz", + "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-normalize": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz", + "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-print": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz", + "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "load-bmfont": "^1.4.0" + } + }, + "node_modules/@jimp/plugin-resize": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz", + "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-rotate": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz", + "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-scale": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz", + "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-shadow": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz", + "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-threshold": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz", + "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugins": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz", + "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.16.1", + "@jimp/plugin-blur": "^0.16.1", + "@jimp/plugin-circle": "^0.16.1", + "@jimp/plugin-color": "^0.16.1", + "@jimp/plugin-contain": "^0.16.1", + "@jimp/plugin-cover": "^0.16.1", + "@jimp/plugin-crop": "^0.16.1", + "@jimp/plugin-displace": "^0.16.1", + "@jimp/plugin-dither": "^0.16.1", + "@jimp/plugin-fisheye": "^0.16.1", + "@jimp/plugin-flip": "^0.16.1", + "@jimp/plugin-gaussian": "^0.16.1", + "@jimp/plugin-invert": "^0.16.1", + "@jimp/plugin-mask": "^0.16.1", + "@jimp/plugin-normalize": "^0.16.1", + "@jimp/plugin-print": "^0.16.1", + "@jimp/plugin-resize": "^0.16.1", + "@jimp/plugin-rotate": "^0.16.1", + "@jimp/plugin-scale": "^0.16.1", + "@jimp/plugin-shadow": "^0.16.1", + "@jimp/plugin-threshold": "^0.16.1", + "timm": "^1.6.1" + } + }, + "node_modules/@jimp/png": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz", + "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "pngjs": "^3.3.3" + } + }, + "node_modules/@jimp/tiff": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz", + "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "utif": "^2.0.1" + } + }, + "node_modules/@jimp/types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz", + "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.16.1", + "@jimp/gif": "^0.16.1", + "@jimp/jpeg": "^0.16.1", + "@jimp/png": "^0.16.1", + "@jimp/tiff": "^0.16.1", + "timm": "^1.6.1" + } + }, + "node_modules/@jimp/utils": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz", + "integrity": "sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/@mapbox/geojson-rewind": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.0.tgz", + "integrity": "sha512-73l/qJQgj/T/zO1JXVfuVvvKDgikD/7D/rHAD28S9BG1OTstgmftrmqfCx4U+zQAmtsB6HcDA3a7ymdnJZAQgg==", + "dependencies": { + "concat-stream": "~2.0.0", + "minimist": "^1.2.5" + }, + "bin": { + "geojson-rewind": "geojson-rewind" + } + }, + "node_modules/@mapbox/geojson-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", + "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha1-zlblOfg1UrWNENZy6k1vya3HsjQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-supported": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", + "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==" + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI=" + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.3.tgz", + "integrity": "sha512-UH233on+8Okmj/JJFcxyc+HMSzKQcSFiiT339lFf2BMGs0+iEbobX7+GESeKVkPVtTFoh54LuNa1mC8N2ucM2w==" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4=" + }, + "node_modules/@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "dependencies": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "node_modules/@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dev": true, + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dev": true, + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/core/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/webpack/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@svgr/webpack/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", + "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", + "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/eslint": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz", + "integrity": "sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", + "dev": true + }, + "node_modules/@types/favicons": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/favicons/-/favicons-5.5.0.tgz", + "integrity": "sha512-s76OlRaBfqtGu2ZBobnZv2NETfqsQUVfKKlOkKNGo4ArBsqiblodKsnQ3j29hCCgmpQacEfLxealV96za+tzVQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.7", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", + "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "26.0.20", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.20.tgz", + "integrity": "sha512-9zi2Y+5USJRxd0FsahERhBwlcvFh6D2GLQnY2FH2BzK8J9s9omvNHIbvABwIluXa0fD8XVKMLTO0aOEuUfACAA==", + "dev": true, + "dependencies": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "node_modules/@types/mapbox-gl": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-1.13.0.tgz", + "integrity": "sha512-z5YxncrARfKaJXzkhy4qS0cOldMfGIXq5yOPQcU9S12/xjAe3m66scftYlV1E10Em5QGdW2xahBb3CPk/dDcqA==", + "dev": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.10.2.tgz", + "integrity": "sha512-IzMhbDYCpv26pC2wboJ4MMOa9GKtjplXfcAqrMeNJpUUwpM/2ATt2w1JPUXwS6spu856TvKZL2AOmeU2rAxskw==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", + "dev": true + }, + "node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "node_modules/@types/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.2.tgz", + "integrity": "sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.1.tgz", + "integrity": "sha512-yIVyopxQb8IDZ7SOHeTovurFq+fXiPICa+GV3gp0Xedsl+MwQlMLKmvrnEjFbQxjliH5YVAEWFh975eVNmKj7Q==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", + "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", + "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", + "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", + "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", + "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", + "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", + "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", + "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", + "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", + "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", + "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/helper-wasm-section": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-opt": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "@webassemblyjs/wast-printer": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", + "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", + "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", + "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", + "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz", + "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==", + "dev": true + }, + "node_modules/@webpack-cli/info": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.2.tgz", + "integrity": "sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz", + "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==", + "dev": true + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.5.tgz", + "integrity": "sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/are-we-there-yet/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/author-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/awesome-typescript-loader": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-5.2.1.tgz", + "integrity": "sha512-slv66OAJB8orL+UUaTI3pKlLorwIvS4ARZzYR9iJJyGsEgOqueMfOMdKySWzZ73vIkEe3fcwFgsKMg4d8zyb1g==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.1.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.3", + "webpack-log": "^1.2.0" + } + }, + "node_modules/awesome-typescript-loader/node_modules/webpack-log": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", + "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", + "dev": true, + "dependencies": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "loglevelnext": "^1.0.1", + "uuid": "^3.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "dependencies": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz", + "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.0", + "@babel/helper-define-polyfill-provider": "^0.1.5", + "semver": "^6.1.1" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", + "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.1.5", + "core-js-compat": "^3.8.1" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz", + "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.1.5" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz", + "integrity": "sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "node_modules/babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/bignumber.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", + "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "node_modules/buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camel-case/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001187", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001187.tgz", + "integrity": "sha512-w7/EP1JRZ9552CyrThUnay2RkZ1DXxKe/Q2swTC4+LElLh9RRYrL1Z+27LlakB8kzY0fSmHw9mc7XYDUKAKWMA==", + "dev": true + }, + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/chokidar/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/chokidar/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/cloneable-readable/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/cloneable-readable/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/cloneable-readable/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.1.tgz", + "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.3", + "semver": "7.0.0" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-fetch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", + "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", + "dev": true, + "dependencies": { + "node-fetch": "2.6.1" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/css-loader": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.0.2.tgz", + "integrity": "sha512-gbkBigdcHbmNvZ1Cg6aV6qh6k9N6XOr8YWzISLQGrwk2mgOH8LLrizhkxbDhQtaLtktyKHD4970S0xwz5btfTA==", + "dev": true, + "dependencies": { + "camelcase": "^6.2.0", + "cssesc": "^3.0.0", + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.4", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/css-loader/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-loader/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/css-loader/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-mediaquery": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", + "integrity": "sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA=" + }, + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs=" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.6.tgz", + "integrity": "sha512-+ZAmfyWMT7TiIlzdqJgjMb7S4f1beorDbWbsocyK4RaiqA5RTX3K14bnBWmmA9QEM0gRdsjyyrEmcyga8Zsxmw==", + "dev": true + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "dependencies": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + } + }, + "node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "node_modules/d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "node_modules/d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "node_modules/d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "dependencies": { + "d3-array": "1", + "d3-path": "1" + } + }, + "node_modules/d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "dependencies": { + "d3-array": "^1.1.1" + } + }, + "node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "node_modules/d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "dependencies": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "node_modules/d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "dependencies": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json", + "csv2tsv": "bin/dsv2dsv", + "dsv2dsv": "bin/dsv2dsv", + "dsv2json": "bin/dsv2json", + "json2csv": "bin/json2dsv", + "json2dsv": "bin/json2dsv", + "json2tsv": "bin/json2dsv", + "tsv2csv": "bin/dsv2dsv", + "tsv2json": "bin/dsv2json" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "node_modules/d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "dependencies": { + "d3-dsv": "1" + } + }, + "node_modules/d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "dependencies": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "node_modules/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "node_modules/d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "dependencies": { + "d3-array": "1" + } + }, + "node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dependencies": { + "d3-color": "1" + } + }, + "node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "node_modules/d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "node_modules/d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "node_modules/d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "dependencies": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "dependencies": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "node_modules/d3-selection-multi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d3-selection-multi/-/d3-selection-multi-1.0.1.tgz", + "integrity": "sha1-zWwlQT0EosuXRw54byzYd/PjT1g=", + "dependencies": { + "d3-selection": "1", + "d3-transition": "1" + } + }, + "node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "node_modules/d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "dependencies": { + "d3-time": "1" + } + }, + "node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "node_modules/d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "dependencies": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "node_modules/d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "node_modules/d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", + "dev": true + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/earcut": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.2.tgz", + "integrity": "sha512-eZoZPPJcUHnfRZ0PjLvx2qBordSiO8ofC3vt+qACLM95u+4DovnbYNpQtJh0DNsWj8RnxrQytD4WA8gj5cRIaQ==" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.3.666", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.666.tgz", + "integrity": "sha512-/mP4HFQ0fKIX4sXltG6kfcoGrfNDZwCIyWbH2SIcVaa9u7Rm0HKjambiHNg5OEruicTl9s1EwbERLwxZwk19aw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/enhanced-resolve/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/enhanced-resolve/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/enhanced-resolve/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "node_modules/envinfo": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.4.tgz", + "integrity": "sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", + "integrity": "sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA==", + "dev": true + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=", + "dev": true + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/expect/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/expect/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/expect/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "node_modules/favicons": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/favicons/-/favicons-6.2.1.tgz", + "integrity": "sha512-6Vh1CYubenqks9XXoPGU7NXtF56am0Lb98puIV4Q1FHxm0cexFzmvxP+5nBfJvFpi/r+LxIs8umAnUuiGgOJWg==", + "dev": true, + "dependencies": { + "clone": "^2.1.2", + "colors": "^1.4.0", + "image-size": "^0.8.3", + "jimp": "^0.16.1", + "jsontoxml": "^1.0.1", + "lodash.defaultsdeep": "^4.6.1", + "require-directory": "^2.1.1", + "sharp": "^0.27.1", + "through2": "^4.0.2", + "tinycolor2": "^1.4.2", + "to-ico": "^1.1.5", + "vinyl": "^2.2.1", + "xml2js": "^0.4.23" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/favicons-webpack-plugin": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/favicons-webpack-plugin/-/favicons-webpack-plugin-5.0.2.tgz", + "integrity": "sha512-D/A+Ze0x57+YZBU69hK/lR3NI636qQnKduWyQm0THGl1y3jt16whPHHsi8yjsuXvetv84Eh/I/yYJbAMC2iQxg==", + "dev": true, + "dependencies": { + "@types/favicons": "5.5.0", + "find-root": "^1.1.0", + "html-webpack-plugin": ">=5.0.0", + "parse-author": "^2.0.0", + "parse5": "^6.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/favicons-webpack-plugin/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-type": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", + "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", + "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/geojson-vt": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", + "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/gifwrap": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.2.tgz", + "integrity": "sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA==", + "dev": true, + "dependencies": { + "image-q": "^1.1.1", + "omggif": "^1.0.10" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "dev": true + }, + "node_modules/gl-matrix": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", + "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/grid-index": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", + "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-minifier-terser/node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/html-webpack-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.1.0.tgz", + "integrity": "sha512-2axkp+2NHmvHUWrKe1dY4LyM3WatQEdFChr42OY7R/Ad7f0AQzaKscGCcqN/FtQBxo8rdfJP7M3RMFDttqok3g==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^2.0.0", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "node_modules/image-q": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-q/-/image-q-1.1.1.tgz", + "integrity": "sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=", + "dev": true, + "engines": { + "node": ">=0.9.0" + } + }, + "node_modules/image-size": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", + "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", + "dev": true, + "dependencies": { + "queue": "6.0.1" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", + "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true, + "optional": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "dev": true + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-config/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-config/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-fetch-mock": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", + "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", + "dev": true, + "dependencies": { + "cross-fetch": "^3.0.4", + "promise-polyfill": "^8.1.3" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-haste-map/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-haste-map/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-jasmine2/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-jasmine2/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "dependencies": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-message-util/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-message-util/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-runtime/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-util/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-util/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/jest/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jimp": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz", + "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.16.1", + "@jimp/plugins": "^0.16.1", + "@jimp/types": "^0.16.1", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz", + "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.0.tgz", + "integrity": "sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsontoxml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jsontoxml/-/jsontoxml-1.0.1.tgz", + "integrity": "sha512-dtKGq0K8EWQBRqcAaePSgKR4Hyjfsz/LkurHSV3Cxk4H+h2fWDeaN2jzABz+ZmOJylgXS7FGeWmbZ6jgYUMdJQ==", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/kdbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leaflet.heightgraph": { + "resolved": "git+ssh://git@github.com/easbar/Leaflet.Heightgraph.git#24d763ef31b7319735478a2af7f5fcfccab018ee", + "dependencies": { + "d3": "^5.16.0", + "d3-selection-multi": "^1.0.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/load-bmfont": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", + "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", + "dev": true, + "dependencies": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^2.9.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "node_modules/load-bmfont/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/loglevelnext": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", + "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", + "dev": true, + "dependencies": { + "es6-symbol": "^3.1.1", + "object.assign": "^4.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lower-case/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mapbox-gl": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.0.tgz", + "integrity": "sha512-g8zlzuJxYJqbOPXT19/UBYpVrcefBQ06F/Cbj0fyEfFnFesDcU3cFTxd75/FZ6Upx2ZEjCsD61CHxrcxZidVpA==", + "dependencies": { + "@mapbox/geojson-rewind": "^0.5.0", + "@mapbox/geojson-types": "^1.0.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^1.5.0", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^1.1.1", + "@mapbox/unitbezier": "^0.0.0", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "csscolorparser": "~1.0.3", + "earcut": "^2.2.2", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.2.1", + "grid-index": "^1.1.0", + "minimist": "^1.2.5", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^1.0.1", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "supercluster": "^7.1.0", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.1" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/matchmediaquery": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", + "integrity": "sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ==", + "dependencies": { + "css-mediaquery": "^0.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/memory-fs/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/memory-fs/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/memory-fs/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "dependencies": { + "mime-db": "1.44.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=" + }, + "node_modules/nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/no-case/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/node-abi": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.21.0.tgz", + "integrity": "sha512-smhrivuPqEM3H5LmnY3KU6HfYv0u4QklgAxfFyRNujKUzbUcYZ+Jc2EhukB9SRcD2VpqhxM7n/MIcp1Ua1/JMg==", + "dev": true, + "dependencies": { + "semver": "^5.4.1" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-addon-api": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", + "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-notifier": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", + "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "dev": true, + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-notifier/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-notifier/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "dev": true, + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/node-notifier/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-releases": { + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", + "dev": true + }, + "node_modules/noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nosleep.js": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.12.0.tgz", + "integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==" + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "node_modules/object-is": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign/node_modules/es-abstract": { + "version": "1.18.0-next.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", + "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/object.getownpropertydescriptors/node_modules/es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors/node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors/node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors/node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors/node_modules/is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors/node_modules/object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "node_modules/object.getownpropertydescriptors/node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors/node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "node_modules/object.getownpropertydescriptors/node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values/node_modules/es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values/node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values/node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values/node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values/node_modules/is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values/node_modules/object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "node_modules/object.values/node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values/node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "node_modules/object.values/node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/param-case/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-author": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=", + "dev": true, + "dependencies": { + "author-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=", + "dev": true + }, + "node_modules/parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=", + "dev": true + }, + "node_modules/parse-bmfont-xml": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", + "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "dev": true, + "dependencies": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.4.5" + } + }, + "node_modules/parse-headers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==", + "dev": true + }, + "node_modules/parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse-png": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-1.1.2.tgz", + "integrity": "sha1-9cKtfHmTSQmGAgooTBmu5FlxH/I=", + "dev": true, + "dependencies": { + "pngjs": "^3.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "dev": true, + "dependencies": { + "pngjs": "^3.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.2.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", + "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", + "dev": true, + "dependencies": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map": "^0.6.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "node_modules/postcss/node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/potpack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.1.tgz", + "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" + }, + "node_modules/prebuild-install": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.1.tgz", + "integrity": "sha512-7GOJrLuow8yeiyv75rmvZyeMGzl8mdEX5gY69d6a6bHWmiPevwqFw+tQavhK0EYMaSg3/KD24cWqeQv1EWsqDQ==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prebuild-install/node_modules/simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "dev": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/pretty-format/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/pretty-format/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "dev": true + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-polyfill": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.0.tgz", + "integrity": "sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==", + "dev": true + }, + "node_modules/prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/protocol-buffers-schema": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz", + "integrity": "sha512-YVCvdhxWNDP8/nJDyXLuM+UFsuPk4+1PB7WGPVDzm3HTHbzFLxQYeW2iZpS4mmnXrQJGBzt230t/BbEb7PrQaw==" + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", + "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", + "dev": true, + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", + "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", + "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-responsive": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-8.2.0.tgz", + "integrity": "sha512-iagCqVrw4QSjhxKp3I/YK6+ODkWY6G+YPElvdYKiUUbywwh9Ds0M7r26Fj2/7dWFFbOpcGnJE6uE7aMck8j5Qg==", + "dependencies": { + "hyphenate-style-name": "^1.0.0", + "matchmediaquery": "^0.3.0", + "prop-types": "^15.6.1", + "shallow-equal": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/read-chunk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", + "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/readdirp/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/renderkid": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "dev": true, + "dependencies": { + "css-select": "^2.0.2", + "dom-converter": "^0.2", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resize-img": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/resize-img/-/resize-img-1.1.2.tgz", + "integrity": "sha1-+tZQ+vPvLFPqYxErwnLZXp2SVQ4=", + "dev": true, + "dependencies": { + "bmp-js": "0.0.1", + "file-type": "^3.8.0", + "get-stream": "^2.0.0", + "jimp": "^0.2.21", + "jpeg-js": "^0.1.1", + "parse-png": "^1.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resize-img/node_modules/bmp-js": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.1.tgz", + "integrity": "sha1-WtAUcJnROp84qnuZrx1ueGZu038=", + "dev": true + }, + "node_modules/resize-img/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resize-img/node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dev": true, + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resize-img/node_modules/jimp": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", + "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", + "dev": true, + "dependencies": { + "bignumber.js": "^2.1.0", + "bmp-js": "0.0.3", + "es6-promise": "^3.0.2", + "exif-parser": "^0.1.9", + "file-type": "^3.1.0", + "jpeg-js": "^0.2.0", + "load-bmfont": "^1.2.3", + "mime": "^1.3.4", + "mkdirp": "0.5.1", + "pixelmatch": "^4.0.0", + "pngjs": "^3.0.0", + "read-chunk": "^1.0.1", + "request": "^2.65.0", + "stream-to-buffer": "^0.1.0", + "tinycolor2": "^1.1.2", + "url-regex": "^3.0.0" + } + }, + "node_modules/resize-img/node_modules/jimp/node_modules/bmp-js": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", + "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=", + "dev": true + }, + "node_modules/resize-img/node_modules/jimp/node_modules/jpeg-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", + "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=", + "dev": true + }, + "node_modules/resize-img/node_modules/jpeg-js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", + "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=", + "dev": true + }, + "node_modules/resize-img/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resize-img/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "node_modules/resize-img/node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true, + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.1.tgz", + "integrity": "sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, + "node_modules/sharp": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.27.2.tgz", + "integrity": "sha512-w3FVoONPG/x5MXCc3wsjOS+b9h3CI60qkus6EPQU4dkT0BDm0PyGhDCK6KhtfT3/vbeOMOXAKFNSw+I3QGWkMA==", + "dev": true, + "dependencies": { + "array-flatten": "^3.0.0", + "color": "^3.1.3", + "detect-libc": "^1.0.3", + "node-addon-api": "^3.1.0", + "npmlog": "^4.1.2", + "prebuild-install": "^6.0.1", + "semver": "^7.3.4", + "simple-get": "^4.0.0", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp/node_modules/array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", + "dev": true + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "node_modules/simple-get": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", + "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", + "dev": true, + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-get/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", + "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.4.7" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-2.0.1.tgz", + "integrity": "sha512-UzOTTQhoNPeTNzOxwFw220RSRzdGSyH4lpNyWjR7Qm34P4/N0W669YSUFdH07+YNeN75h765XLHmNsF/bm97RQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-to": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", + "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-to-buffer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", + "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", + "dev": true, + "dependencies": { + "stream-to": "~0.2.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/style-loader/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/style-loader/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/supercluster": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.2.tgz", + "integrity": "sha512-bGA0pk3DYMjLTY1h+rbh0imi/I8k/Lg0rzdBGfyQs0Xkiix7jK2GUmH1qSD8+jq6U0Vu382QHr3+rbbiHqdKJA==", + "dependencies": { + "kdbush": "^3.0.0" + } + }, + "node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz", + "integrity": "sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==", + "dev": true, + "dependencies": { + "jest-worker": "^26.6.2", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.5.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timm": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", + "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==", + "dev": true + }, + "node_modules/tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, + "node_modules/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-ico": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/to-ico/-/to-ico-1.1.5.tgz", + "integrity": "sha512-5kIh7m7bkIlqIESEZkL8gAMMzucXKfPe3hX2FoDY5HEAfD9OJU+Qh9b6Enp74w0qRcxVT5ejss66PHKqc3AVkg==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "buffer-alloc": "^1.1.0", + "image-size": "^0.5.0", + "parse-png": "^1.0.0", + "resize-img": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-ico/node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-jest": { + "version": "26.5.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.1.tgz", + "integrity": "sha512-G7Rmo3OJMvlqE79amJX8VJKDiRcd7/r61wh9fnvvG8cAjhA9edklGw/dCxRSQmfZ/z8NDums5srSVgwZos1qfg==", + "dev": true, + "dependencies": { + "@types/jest": "26.x", + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ts-jest/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-jest/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yargs-parser": { + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.5.tgz", + "integrity": "sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz", + "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "node_modules/unbox-primitive/node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.0.tgz", + "integrity": "sha512-9iT6N4s93SMfzunOyDPe4vo4nLcSu1yq0IQK1gURmjm8tQNlM6loiuCRrKG1hHGXfB2EWd6H4cGi7tGdaygMFw==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-regex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", + "dev": true, + "dependencies": { + "ip-regex": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/url-regex/node_modules/ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/utif": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", + "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", + "dev": true, + "dependencies": { + "pako": "^1.0.5" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz", + "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vt-pbf": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.1.tgz", + "integrity": "sha512-pHjWdrIoxurpmTcbfBWXaPwSmtPAHS105253P1qyEfSTV2HJddqjM+kIHquaT/L6lVJIk9ltTGc0IxR/G47hYA==", + "dependencies": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.0.5" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/watchpack": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", + "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.22.0.tgz", + "integrity": "sha512-xqlb6r9RUXda/d9iA6P7YRTP1ChWeP50TEESKMMNIg0u8/Rb66zN9YJJO7oYgJTRyFyYi43NVC5feG45FSO1vQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.46", + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/wasm-edit": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "acorn": "^8.0.4", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.7.0", + "es-module-lexer": "^0.3.26", + "eslint-scope": "^5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.1", + "watchpack": "^2.0.0", + "webpack-sources": "^2.1.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-cli": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.5.0.tgz", + "integrity": "sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.1", + "@webpack-cli/info": "^1.2.2", + "@webpack-cli/serve": "^1.3.0", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", + "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-cli/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack-cli/node_modules/execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/webpack-cli/node_modules/get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/webpack-cli/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/webpack-cli/node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dev": true, + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + } + }, + "node_modules/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-merge": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", + "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", + "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dev": true, + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=", + "dev": true + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + } + } }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - }, - "dependencies": { + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", + "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", + "dev": true + }, + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", + "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.12", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", + "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", + "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", + "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", + "dev": true, + "requires": { + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", + "dev": true + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", + "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", + "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-classes": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", + "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", + "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-transforms": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", + "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-transforms": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", + "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-transforms": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", + "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", + "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-transforms": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", + "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz", + "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", + "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", + "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/types": "^7.13.12" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", + "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.12.17" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", + "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", + "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-spread": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/preset-env": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.12.tgz", + "integrity": "sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.12", + "@babel/helper-compilation-targets": "^7.13.10", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.13.8", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-dynamic-import": "^7.13.8", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.13.8", + "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.13.8", + "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.12.13", + "@babel/plugin-transform-classes": "^7.13.0", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.0", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.13.0", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.13.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.13.0", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.12.13", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.13.12", + "babel-plugin-polyfill-corejs2": "^0.1.4", + "babel-plugin-polyfill-corejs3": "^0.1.3", + "babel-plugin-polyfill-regenerator": "^0.1.2", + "core-js-compat": "^3.9.0", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", + "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-transform-react-display-name": "^7.12.13", + "@babel/plugin-transform-react-jsx": "^7.13.12", + "@babel/plugin-transform-react-jsx-development": "^7.12.17", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } + } + }, + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jimp/bmp": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz", + "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "bmp-js": "^0.1.0" + } + }, + "@jimp/core": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz", + "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^9.0.0", + "load-bmfont": "^1.3.1", + "mkdirp": "^0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" + } + }, + "@jimp/custom": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz", + "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.16.1" + } + }, + "@jimp/gif": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz", + "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "gifwrap": "^0.9.2", + "omggif": "^1.0.9" + } + }, + "@jimp/jpeg": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz", + "integrity": "sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "jpeg-js": "0.4.2" + } + }, + "@jimp/plugin-blit": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz", + "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-blur": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz", + "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-circle": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz", + "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-color": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz", + "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "tinycolor2": "^1.4.1" + } + }, + "@jimp/plugin-contain": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz", + "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-cover": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz", + "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-crop": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz", + "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-displace": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz", + "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-dither": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz", + "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-fisheye": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz", + "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-flip": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz", + "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-gaussian": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz", + "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-invert": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz", + "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-mask": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz", + "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-normalize": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz", + "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-print": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz", + "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "load-bmfont": "^1.4.0" + } + }, + "@jimp/plugin-resize": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz", + "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-rotate": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz", + "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-scale": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz", + "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-shadow": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz", + "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugin-threshold": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz", + "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "@jimp/plugins": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz", + "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.16.1", + "@jimp/plugin-blur": "^0.16.1", + "@jimp/plugin-circle": "^0.16.1", + "@jimp/plugin-color": "^0.16.1", + "@jimp/plugin-contain": "^0.16.1", + "@jimp/plugin-cover": "^0.16.1", + "@jimp/plugin-crop": "^0.16.1", + "@jimp/plugin-displace": "^0.16.1", + "@jimp/plugin-dither": "^0.16.1", + "@jimp/plugin-fisheye": "^0.16.1", + "@jimp/plugin-flip": "^0.16.1", + "@jimp/plugin-gaussian": "^0.16.1", + "@jimp/plugin-invert": "^0.16.1", + "@jimp/plugin-mask": "^0.16.1", + "@jimp/plugin-normalize": "^0.16.1", + "@jimp/plugin-print": "^0.16.1", + "@jimp/plugin-resize": "^0.16.1", + "@jimp/plugin-rotate": "^0.16.1", + "@jimp/plugin-scale": "^0.16.1", + "@jimp/plugin-shadow": "^0.16.1", + "@jimp/plugin-threshold": "^0.16.1", + "timm": "^1.6.1" + } + }, + "@jimp/png": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz", + "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "pngjs": "^3.3.3" + } + }, + "@jimp/tiff": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz", + "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "utif": "^2.0.1" + } + }, + "@jimp/types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz", + "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.16.1", + "@jimp/gif": "^0.16.1", + "@jimp/jpeg": "^0.16.1", + "@jimp/png": "^0.16.1", + "@jimp/tiff": "^0.16.1", + "timm": "^1.6.1" + } + }, + "@jimp/utils": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz", + "integrity": "sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "regenerator-runtime": "^0.13.3" + } + }, + "@mapbox/geojson-rewind": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.0.tgz", + "integrity": "sha512-73l/qJQgj/T/zO1JXVfuVvvKDgikD/7D/rHAD28S9BG1OTstgmftrmqfCx4U+zQAmtsB6HcDA3a7ymdnJZAQgg==", + "requires": { + "concat-stream": "~2.0.0", + "minimist": "^1.2.5" + } + }, + "@mapbox/geojson-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", + "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" + }, + "@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha1-zlblOfg1UrWNENZy6k1vya3HsjQ=" + }, + "@mapbox/mapbox-gl-supported": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", + "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==" + }, + "@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI=" + }, + "@mapbox/tiny-sdf": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.3.tgz", + "integrity": "sha512-UH233on+8Okmj/JJFcxyc+HMSzKQcSFiiT339lFf2BMGs0+iEbobX7+GESeKVkPVtTFoh54LuNa1mC8N2ucM2w==" + }, + "@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4=" + }, + "@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "requires": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" + }, + "@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "dev": true + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "dev": true + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "dev": true + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "dev": true + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "dev": true + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "dev": true + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "dev": true + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "dev": true + }, + "@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dev": true, + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + } + }, + "@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dev": true, + "requires": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + } + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.6" + } + }, + "@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "@types/babel__core": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", + "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", + "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/eslint": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz", + "integrity": "sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", + "dev": true + }, + "@types/favicons": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/favicons/-/favicons-5.5.0.tgz", + "integrity": "sha512-s76OlRaBfqtGu2ZBobnZv2NETfqsQUVfKKlOkKNGo4ArBsqiblodKsnQ3j29hCCgmpQacEfLxealV96za+tzVQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/geojson": { + "version": "7946.0.7", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", + "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==", + "dev": true + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.20", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.20.tgz", + "integrity": "sha512-9zi2Y+5USJRxd0FsahERhBwlcvFh6D2GLQnY2FH2BzK8J9s9omvNHIbvABwIluXa0fD8XVKMLTO0aOEuUfACAA==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "@types/mapbox-gl": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-1.13.0.tgz", + "integrity": "sha512-z5YxncrARfKaJXzkhy4qS0cOldMfGIXq5yOPQcU9S12/xjAe3m66scftYlV1E10Em5QGdW2xahBb3CPk/dDcqA==", + "dev": true, + "requires": { + "@types/geojson": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "14.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.10.2.tgz", + "integrity": "sha512-IzMhbDYCpv26pC2wboJ4MMOa9GKtjplXfcAqrMeNJpUUwpM/2ATt2w1JPUXwS6spu856TvKZL2AOmeU2rAxskw==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/prettier": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", + "dev": true + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "@types/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.2.tgz", + "integrity": "sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.1.tgz", + "integrity": "sha512-yIVyopxQb8IDZ7SOHeTovurFq+fXiPICa+GV3gp0Xedsl+MwQlMLKmvrnEjFbQxjliH5YVAEWFh975eVNmKj7Q==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", + "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", + "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", + "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", + "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", + "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", + "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", + "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", + "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", + "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", + "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", + "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/helper-wasm-section": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-opt": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "@webassemblyjs/wast-printer": "1.11.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", + "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", + "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", + "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", + "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz", + "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==", + "dev": true + }, + "@webpack-cli/info": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.2.tgz", + "integrity": "sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz", + "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==", + "dev": true + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.5.tgz", + "integrity": "sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", + "dev": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "author-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=", + "dev": true + }, + "awesome-typescript-loader": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-5.2.1.tgz", + "integrity": "sha512-slv66OAJB8orL+UUaTI3pKlLorwIvS4ARZzYR9iJJyGsEgOqueMfOMdKySWzZ73vIkEe3fcwFgsKMg4d8zyb1g==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.1.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.3", + "webpack-log": "^1.2.0" + }, + "dependencies": { + "webpack-log": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", + "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "loglevelnext": "^1.0.1", + "uuid": "^3.1.0" + } + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz", + "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.0", + "@babel/helper-define-polyfill-provider": "^0.1.5", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", + "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.1.5", + "core-js-compat": "^3.8.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz", + "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.1.5" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz", + "integrity": "sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "bignumber.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", + "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001187", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001187.tgz", + "integrity": "sha512-w7/EP1JRZ9552CyrThUnay2RkZ1DXxKe/Q2swTC4+LElLh9RRYrL1Z+27LlakB8kzY0fSmHw9mc7XYDUKAKWMA==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js-compat": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.1.tgz", + "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==", + "dev": true, + "requires": { + "browserslist": "^4.16.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-fetch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", + "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", + "dev": true, + "requires": { + "node-fetch": "2.6.1" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "css-loader": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.0.2.tgz", + "integrity": "sha512-gbkBigdcHbmNvZ1Cg6aV6qh6k9N6XOr8YWzISLQGrwk2mgOH8LLrizhkxbDhQtaLtktyKHD4970S0xwz5btfTA==", + "dev": true, + "requires": { + "camelcase": "^6.2.0", + "cssesc": "^3.0.0", + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.4", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "css-mediaquery": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", + "integrity": "sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA=" + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, "css-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", - "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs=" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + } + } }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - } - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "csstype": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.6.tgz", - "integrity": "sha512-+ZAmfyWMT7TiIlzdqJgjMb7S4f1beorDbWbsocyK4RaiqA5RTX3K14bnBWmmA9QEM0gRdsjyyrEmcyga8Zsxmw==", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "d3": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", - "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", - "requires": { - "d3-array": "1", - "d3-axis": "1", - "d3-brush": "1", - "d3-chord": "1", - "d3-collection": "1", - "d3-color": "1", - "d3-contour": "1", - "d3-dispatch": "1", - "d3-drag": "1", - "d3-dsv": "1", - "d3-ease": "1", - "d3-fetch": "1", - "d3-force": "1", - "d3-format": "1", - "d3-geo": "1", - "d3-hierarchy": "1", - "d3-interpolate": "1", - "d3-path": "1", - "d3-polygon": "1", - "d3-quadtree": "1", - "d3-random": "1", - "d3-scale": "2", - "d3-scale-chromatic": "1", - "d3-selection": "1", - "d3-shape": "1", - "d3-time": "1", - "d3-time-format": "2", - "d3-timer": "1", - "d3-transition": "1", - "d3-voronoi": "1", - "d3-zoom": "1" - } - }, - "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" - }, - "d3-brush": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", - "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", - "requires": { - "d3-array": "1", - "d3-path": "1" - } - }, - "d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" - }, - "d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" - }, - "d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", - "requires": { - "d3-array": "^1.1.1" - } - }, - "d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" - }, - "d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", - "requires": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "d3-dsv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", - "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } - }, - "d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" - }, - "d3-fetch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", - "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", - "requires": { - "d3-dsv": "1" - } - }, - "d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", - "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" - }, - "d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", - "requires": { - "d3-array": "1" - } - }, - "d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" - }, - "d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", - "requires": { - "d3-color": "1" - } - }, - "d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "d3-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" - }, - "d3-quadtree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" - }, - "d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" - }, - "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", - "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" - } - }, - "d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", - "requires": { - "d3-color": "1", - "d3-interpolate": "1" - } - }, - "d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" - }, - "d3-selection-multi": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d3-selection-multi/-/d3-selection-multi-1.0.1.tgz", - "integrity": "sha1-zWwlQT0EosuXRw54byzYd/PjT1g=", - "requires": { - "d3-selection": "1", - "d3-transition": "1" - } - }, - "d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "requires": { - "d3-path": "1" - } - }, - "d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" - }, - "d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", - "requires": { - "d3-time": "1" - } - }, - "d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" - }, - "d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", - "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" - } - }, - "d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" - }, - "d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "csstype": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.6.tgz", + "integrity": "sha512-+ZAmfyWMT7TiIlzdqJgjMb7S4f1beorDbWbsocyK4RaiqA5RTX3K14bnBWmmA9QEM0gRdsjyyrEmcyga8Zsxmw==", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "requires": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + } + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + } + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + } + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, + "d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "requires": { + "d3-dsv": "1" + } + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "requires": { + "d3-array": "1" + } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "d3-selection-multi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d3-selection-multi/-/d3-selection-multi-1.0.1.tgz", + "integrity": "sha1-zWwlQT0EosuXRw54byzYd/PjT1g=", + "requires": { + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, + "requires": { + "mimic-response": "^2.0.0" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", + "dev": true + } + } + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { "domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", - "dev": true - } - } - }, - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - } - } - }, - "earcut": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.2.tgz", - "integrity": "sha512-eZoZPPJcUHnfRZ0PjLvx2qBordSiO8ofC3vt+qACLM95u+4DovnbYNpQtJh0DNsWj8RnxrQytD4WA8gj5cRIaQ==" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.666", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.666.tgz", - "integrity": "sha512-/mP4HFQ0fKIX4sXltG6kfcoGrfNDZwCIyWbH2SIcVaa9u7Rm0HKjambiHNg5OEruicTl9s1EwbERLwxZwk19aw==", - "dev": true - }, - "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, + "earcut": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.2.tgz", + "integrity": "sha512-eZoZPPJcUHnfRZ0PjLvx2qBordSiO8ofC3vt+qACLM95u+4DovnbYNpQtJh0DNsWj8RnxrQytD4WA8gj5cRIaQ==" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.666", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.666.tgz", + "integrity": "sha512-/mP4HFQ0fKIX4sXltG6kfcoGrfNDZwCIyWbH2SIcVaa9u7Rm0HKjambiHNg5OEruicTl9s1EwbERLwxZwk19aw==", + "dev": true + }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "envinfo": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.4.tgz", + "integrity": "sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-module-lexer": { + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", + "integrity": "sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA==", + "dev": true + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "envinfo": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.4.tgz", - "integrity": "sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-module-lexer": { - "version": "0.3.26", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", - "integrity": "sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA==", - "dev": true - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", - "dev": true - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exif-parser": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "favicons": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/favicons/-/favicons-6.2.1.tgz", + "integrity": "sha512-6Vh1CYubenqks9XXoPGU7NXtF56am0Lb98puIV4Q1FHxm0cexFzmvxP+5nBfJvFpi/r+LxIs8umAnUuiGgOJWg==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "colors": "^1.4.0", + "image-size": "^0.8.3", + "jimp": "^0.16.1", + "jsontoxml": "^1.0.1", + "lodash.defaultsdeep": "^4.6.1", + "require-directory": "^2.1.1", + "sharp": "^0.27.1", + "through2": "^4.0.2", + "tinycolor2": "^1.4.2", + "to-ico": "^1.1.5", + "vinyl": "^2.2.1", + "xml2js": "^0.4.23" + } + }, + "favicons-webpack-plugin": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/favicons-webpack-plugin/-/favicons-webpack-plugin-5.0.2.tgz", + "integrity": "sha512-D/A+Ze0x57+YZBU69hK/lR3NI636qQnKduWyQm0THGl1y3jt16whPHHsi8yjsuXvetv84Eh/I/yYJbAMC2iQxg==", + "dev": true, + "requires": { + "@types/favicons": "5.5.0", + "find-root": "^1.1.0", + "html-webpack-plugin": ">=5.0.0", + "parse-author": "^2.0.0", + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "file-type": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", + "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", + "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "geojson-vt": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", + "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "gifwrap": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.2.tgz", + "integrity": "sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA==", + "dev": true, + "requires": { + "image-q": "^1.1.1", + "omggif": "^1.0.10" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "dev": true + }, + "gl-matrix": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", + "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "grid-index": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", + "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true - }, - "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + } + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "html-webpack-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.1.0.tgz", + "integrity": "sha512-2axkp+2NHmvHUWrKe1dY4LyM3WatQEdFChr42OY7R/Ad7f0AQzaKscGCcqN/FtQBxo8rdfJP7M3RMFDttqok3g==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^2.0.0", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^2.0.0" + }, + "dependencies": { + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + } + } }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + } + } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true - }, - "favicons": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/favicons/-/favicons-6.2.1.tgz", - "integrity": "sha512-6Vh1CYubenqks9XXoPGU7NXtF56am0Lb98puIV4Q1FHxm0cexFzmvxP+5nBfJvFpi/r+LxIs8umAnUuiGgOJWg==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "colors": "^1.4.0", - "image-size": "^0.8.3", - "jimp": "^0.16.1", - "jsontoxml": "^1.0.1", - "lodash.defaultsdeep": "^4.6.1", - "require-directory": "^2.1.1", - "sharp": "^0.27.1", - "through2": "^4.0.2", - "tinycolor2": "^1.4.2", - "to-ico": "^1.1.5", - "vinyl": "^2.2.1", - "xml2js": "^0.4.23" - } - }, - "favicons-webpack-plugin": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/favicons-webpack-plugin/-/favicons-webpack-plugin-5.0.2.tgz", - "integrity": "sha512-D/A+Ze0x57+YZBU69hK/lR3NI636qQnKduWyQm0THGl1y3jt16whPHHsi8yjsuXvetv84Eh/I/yYJbAMC2iQxg==", - "dev": true, - "requires": { - "@types/favicons": "5.5.0", - "find-root": "^1.1.0", - "html-webpack-plugin": ">=5.0.0", - "parse-author": "^2.0.0", - "parse5": "^6.0.1" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - } - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-type": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", - "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "follow-redirects": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", - "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "geojson-vt": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", - "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "gifwrap": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.2.tgz", - "integrity": "sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA==", - "dev": true, - "requires": { - "image-q": "^1.1.1", - "omggif": "^1.0.10" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", - "dev": true - }, - "gl-matrix": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", - "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "grid-index": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", - "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "dev": true, - "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "dependencies": { - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - } - } - }, - "html-webpack-plugin": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.1.0.tgz", - "integrity": "sha512-2axkp+2NHmvHUWrKe1dY4LyM3WatQEdFChr42OY7R/Ad7f0AQzaKscGCcqN/FtQBxo8rdfJP7M3RMFDttqok3g==", - "dev": true, - "requires": { - "@types/html-minifier-terser": "^5.0.0", - "html-minifier-terser": "^5.0.1", - "loader-utils": "^2.0.0", - "lodash": "^4.17.20", - "pretty-error": "^2.1.1", - "tapable": "^2.0.0" - }, - "dependencies": { - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "image-q": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-q/-/image-q-1.1.1.tgz", + "integrity": "sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=", + "dev": true + }, + "image-size": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", + "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", + "dev": true, + "requires": { + "queue": "6.0.1" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } }, - "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true - } - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "image-q": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-q/-/image-q-1.1.1.tgz", - "integrity": "sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=", - "dev": true - }, - "image-size": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", - "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", - "dev": true, - "requires": { - "queue": "6.0.1" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", - "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", - "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true, - "optional": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } + "is-callable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "is-core-module": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", + "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true, + "optional": true }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } + "jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "jest-fetch-mock": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", + "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", + "dev": true, + "requires": { + "cross-fetch": "^3.0.4", + "promise-polyfill": "^8.1.3" + } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" - } - }, - "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "jest-fetch-mock": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", - "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", - "dev": true, - "requires": { - "cross-fetch": "^3.0.4", - "promise-polyfill": "^8.1.3" - } - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true - }, - "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } + "jimp": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz", + "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.16.1", + "@jimp/plugins": "^0.16.1", + "@jimp/types": "^0.16.1", + "regenerator-runtime": "^0.13.3" + } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "jpeg-js": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz", + "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "ws": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.0.tgz", + "integrity": "sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsontoxml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jsontoxml/-/jsontoxml-1.0.1.tgz", + "integrity": "sha512-dtKGq0K8EWQBRqcAaePSgKR4Hyjfsz/LkurHSV3Cxk4H+h2fWDeaN2jzABz+ZmOJylgXS7FGeWmbZ6jgYUMdJQ==", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kdbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leaflet.heightgraph": { + "version": "git+ssh://git@github.com/easbar/Leaflet.Heightgraph.git#24d763ef31b7319735478a2af7f5fcfccab018ee", + "from": "leaflet.heightgraph@github:easbar/Leaflet.Heightgraph#24d763ef31b7319735478a2af7f5fcfccab018ee", + "requires": { + "d3": "^5.16.0", + "d3-selection-multi": "^1.0.1" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "load-bmfont": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", + "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", + "dev": true, + "requires": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^2.9.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + } + } + }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true + }, + "loglevelnext": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", + "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", + "dev": true, + "requires": { + "es6-symbol": "^3.1.1", + "object.assign": "^4.1.0" + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "mapbox-gl": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.0.tgz", + "integrity": "sha512-g8zlzuJxYJqbOPXT19/UBYpVrcefBQ06F/Cbj0fyEfFnFesDcU3cFTxd75/FZ6Upx2ZEjCsD61CHxrcxZidVpA==", + "requires": { + "@mapbox/geojson-rewind": "^0.5.0", + "@mapbox/geojson-types": "^1.0.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^1.5.0", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^1.1.1", + "@mapbox/unitbezier": "^0.0.0", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "csscolorparser": "~1.0.3", + "earcut": "^2.2.2", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.2.1", + "grid-index": "^1.1.0", + "minimist": "^1.2.5", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^1.0.1", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "supercluster": "^7.1.0", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.1" + } + }, + "matchmediaquery": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", + "integrity": "sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ==", + "requires": { + "css-mediaquery": "^0.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", - "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=" + }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, + "node-abi": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.21.0.tgz", + "integrity": "sha512-smhrivuPqEM3H5LmnY3KU6HfYv0u4QklgAxfFyRNujKUzbUcYZ+Jc2EhukB9SRcD2VpqhxM7n/MIcp1Ua1/JMg==", + "dev": true, + "requires": { + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-addon-api": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", + "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", + "dev": true + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", + "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "optional": true + }, + "uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "dev": true, + "optional": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "node-releases": { + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", + "dev": true + }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "nosleep.js": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.12.0.tgz", + "integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-is": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", + "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + } + } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "object.values": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + } + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "dev": true }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true - }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - } - }, - "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "parse-author": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=", + "dev": true, + "requires": { + "author-regex": "^1.0.0" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=", + "dev": true + }, + "parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=", + "dev": true + }, + "parse-bmfont-xml": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", + "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "dev": true, + "requires": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.4.5" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "parse-headers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==", + "dev": true + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "parse-png": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-1.1.2.tgz", + "integrity": "sha1-9cKtfHmTSQmGAgooTBmu5FlxH/I=", + "dev": true, + "requires": { + "pngjs": "^3.2.0" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "requires": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==", + "dev": true }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } + "pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "dev": true, + "requires": { + "pngjs": "^3.0.0" + } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "dev": true + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "8.2.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", + "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map": "^0.6.1" + }, + "dependencies": { + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + } + } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } + "postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + } }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "potpack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.1.tgz", + "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" + }, + "prebuild-install": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.1.tgz", + "integrity": "sha512-7GOJrLuow8yeiyv75rmvZyeMGzl8mdEX5gY69d6a6bHWmiPevwqFw+tQavhK0EYMaSg3/KD24cWqeQv1EWsqDQ==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "dev": true, + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + } + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "dev": true + } + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-polyfill": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.0.tgz", + "integrity": "sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==", + "dev": true + }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "protocol-buffers-schema": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz", + "integrity": "sha512-YVCvdhxWNDP8/nJDyXLuM+UFsuPk4+1PB7WGPVDzm3HTHbzFLxQYeW2iZpS4mmnXrQJGBzt230t/BbEb7PrQaw==" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", + "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", + "dev": true, + "requires": { + "inherits": "~2.0.3" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } + "react": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", + "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "react-dom": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", + "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.1" + } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-responsive": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-8.2.0.tgz", + "integrity": "sha512-iagCqVrw4QSjhxKp3I/YK6+ODkWY6G+YPElvdYKiUUbywwh9Ds0M7r26Fj2/7dWFFbOpcGnJE6uE7aMck8j5Qg==", + "requires": { + "hyphenate-style-name": "^1.0.0", + "matchmediaquery": "^0.3.0", + "prop-types": "^15.6.1", + "shallow-equal": "^1.1.0" + } }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } + "read-chunk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", + "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "rechoir": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "dev": true, + "requires": { + "css-select": "^2.0.2", + "dom-converter": "^0.2", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jimp": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz", - "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/custom": "^0.16.1", - "@jimp/plugins": "^0.16.1", - "@jimp/types": "^0.16.1", - "regenerator-runtime": "^0.13.3" - } - }, - "jpeg-js": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz", - "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } }, - "ws": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.0.tgz", - "integrity": "sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==", - "dev": true - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsontoxml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jsontoxml/-/jsontoxml-1.0.1.tgz", - "integrity": "sha512-dtKGq0K8EWQBRqcAaePSgKR4Hyjfsz/LkurHSV3Cxk4H+h2fWDeaN2jzABz+ZmOJylgXS7FGeWmbZ6jgYUMdJQ==", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kdbush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", - "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leaflet.heightgraph": { - "version": "github:easbar/Leaflet.Heightgraph#24d763ef31b7319735478a2af7f5fcfccab018ee", - "from": "github:easbar/Leaflet.Heightgraph#24d763ef31b7319735478a2af7f5fcfccab018ee", - "requires": { - "d3": "^5.16.0", - "d3-selection-multi": "^1.0.1" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "load-bmfont": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", - "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", - "dev": true, - "requires": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - } - } - }, - "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "lodash.defaultsdeep": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", - "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", - "dev": true - }, - "loglevelnext": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", - "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", - "dev": true, - "requires": { - "es6-symbol": "^3.1.1", - "object.assign": "^4.1.0" - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - } - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "mapbox-gl": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.0.tgz", - "integrity": "sha512-g8zlzuJxYJqbOPXT19/UBYpVrcefBQ06F/Cbj0fyEfFnFesDcU3cFTxd75/FZ6Upx2ZEjCsD61CHxrcxZidVpA==", - "requires": { - "@mapbox/geojson-rewind": "^0.5.0", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "minimist": "^1.2.5", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.1.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - } - }, - "matchmediaquery": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", - "integrity": "sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ==", - "requires": { - "css-mediaquery": "^0.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resize-img": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/resize-img/-/resize-img-1.1.2.tgz", + "integrity": "sha1-+tZQ+vPvLFPqYxErwnLZXp2SVQ4=", + "dev": true, + "requires": { + "bmp-js": "0.0.1", + "file-type": "^3.8.0", + "get-stream": "^2.0.0", + "jimp": "^0.2.21", + "jpeg-js": "^0.1.1", + "parse-png": "^1.1.1" + }, + "dependencies": { + "bmp-js": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.1.tgz", + "integrity": "sha1-WtAUcJnROp84qnuZrx1ueGZu038=", + "dev": true + }, + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "jimp": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", + "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", + "dev": true, + "requires": { + "bignumber.js": "^2.1.0", + "bmp-js": "0.0.3", + "es6-promise": "^3.0.2", + "exif-parser": "^0.1.9", + "file-type": "^3.1.0", + "jpeg-js": "^0.2.0", + "load-bmfont": "^1.2.3", + "mime": "^1.3.4", + "mkdirp": "0.5.1", + "pixelmatch": "^4.0.0", + "pngjs": "^3.0.0", + "read-chunk": "^1.0.1", + "request": "^2.65.0", + "stream-to-buffer": "^0.1.0", + "tinycolor2": "^1.1.2", + "url-regex": "^3.0.0" + }, + "dependencies": { + "bmp-js": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", + "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=", + "dev": true + }, + "jpeg-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", + "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=", + "dev": true + } + } + }, + "jpeg-js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", + "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + } + } + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "requires": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", - "dev": true - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "murmurhash-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", - "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=" - }, - "nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - } - } - }, - "node-abi": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.21.0.tgz", - "integrity": "sha512-smhrivuPqEM3H5LmnY3KU6HfYv0u4QklgAxfFyRNujKUzbUcYZ+Jc2EhukB9SRcD2VpqhxM7n/MIcp1Ua1/JMg==", - "dev": true, - "requires": { - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "node-addon-api": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", - "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", - "dev": true - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-notifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", - "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "optional": true + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } }, - "uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", - "dev": true, - "optional": true + "scheduler": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.1.tgz", + "integrity": "sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "node-releases": { - "version": "1.1.70", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", - "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", - "dev": true - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", - "dev": true - }, - "object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", - "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - } + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } }, - "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" - } + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true + "shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, + "sharp": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.27.2.tgz", + "integrity": "sha512-w3FVoONPG/x5MXCc3wsjOS+b9h3CI60qkus6EPQU4dkT0BDm0PyGhDCK6KhtfT3/vbeOMOXAKFNSw+I3QGWkMA==", + "dev": true, + "requires": { + "array-flatten": "^3.0.0", + "color": "^3.1.3", + "detect-libc": "^1.0.3", + "node-addon-api": "^3.1.0", + "npmlog": "^4.1.2", + "prebuild-install": "^6.0.1", + "semver": "^7.3.4", + "simple-get": "^4.0.0", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", - "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - } + "simple-get": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", + "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", + "dev": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } + } }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } }, - "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" - } + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } + "sockjs-client": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", + "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.4.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - } - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "omggif": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", - "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-author": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", - "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=", - "dev": true, - "requires": { - "author-regex": "^1.0.0" - } - }, - "parse-bmfont-ascii": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=", - "dev": true - }, - "parse-bmfont-binary": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=", - "dev": true - }, - "parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", - "dev": true, - "requires": { - "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" - } - }, - "parse-headers": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", - "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==", - "dev": true - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-png": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-1.1.2.tgz", - "integrity": "sha1-9cKtfHmTSQmGAgooTBmu5FlxH/I=", - "dev": true, - "requires": { - "pngjs": "^3.2.0" - } - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - } - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pbf": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", - "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", - "requires": { - "ieee754": "^1.1.12", - "resolve-protobuf-schema": "^2.1.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pixelmatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", - "dev": true, - "requires": { - "pngjs": "^3.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "8.2.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", - "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", - "dev": true, - "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map": "^0.6.1" - }, - "dependencies": { - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - } - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "potpack": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.1.tgz", - "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" - }, - "prebuild-install": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.1.tgz", - "integrity": "sha512-7GOJrLuow8yeiyv75rmvZyeMGzl8mdEX5gY69d6a6bHWmiPevwqFw+tQavhK0EYMaSg3/KD24cWqeQv1EWsqDQ==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "dev": true, - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - } - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", - "dev": true - }, - "pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", - "dev": true, - "requires": { - "lodash": "^4.17.20", - "renderkid": "^2.0.4" - } - }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true + }, + "source-map-loader": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-2.0.1.tgz", + "integrity": "sha512-UzOTTQhoNPeTNzOxwFw220RSRzdGSyH4lpNyWjR7Qm34P4/N0W669YSUFdH07+YNeN75h765XLHmNsF/bm97RQ==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "source-map-js": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-to": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", + "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=", + "dev": true + }, + "stream-to-buffer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", + "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", + "dev": true, + "requires": { + "stream-to": "~0.2.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } }, - "react-is": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", - "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", - "dev": true - } - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promise-polyfill": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.0.tgz", - "integrity": "sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==", - "dev": true - }, - "prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "protocol-buffers-schema": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz", - "integrity": "sha512-YVCvdhxWNDP8/nJDyXLuM+UFsuPk4+1PB7WGPVDzm3HTHbzFLxQYeW2iZpS4mmnXrQJGBzt230t/BbEb7PrQaw==" - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "queue": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", - "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", - "dev": true, - "requires": { - "inherits": "~2.0.3" - } - }, - "quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", - "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-dom": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", - "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "react-responsive": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-8.2.0.tgz", - "integrity": "sha512-iagCqVrw4QSjhxKp3I/YK6+ODkWY6G+YPElvdYKiUUbywwh9Ds0M7r26Fj2/7dWFFbOpcGnJE6uE7aMck8j5Qg==", - "requires": { - "hyphenate-style-name": "^1.0.0", - "matchmediaquery": "^0.3.0", - "prop-types": "^15.6.1", - "shallow-equal": "^1.1.0" - } - }, - "read-chunk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", - "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } + "supercluster": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.2.tgz", + "integrity": "sha512-bGA0pk3DYMjLTY1h+rbh0imi/I8k/Lg0rzdBGfyQs0Xkiix7jK2GUmH1qSD8+jq6U0Vu382QHr3+rbbiHqdKJA==", + "requires": { + "kdbush": "^3.0.0" + } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "rechoir": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", - "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", - "dev": true - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", - "dev": true, - "requires": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resize-img": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/resize-img/-/resize-img-1.1.2.tgz", - "integrity": "sha1-+tZQ+vPvLFPqYxErwnLZXp2SVQ4=", - "dev": true, - "requires": { - "bmp-js": "0.0.1", - "file-type": "^3.8.0", - "get-stream": "^2.0.0", - "jimp": "^0.2.21", - "jpeg-js": "^0.1.1", - "parse-png": "^1.1.1" - }, - "dependencies": { - "bmp-js": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.1.tgz", - "integrity": "sha1-WtAUcJnROp84qnuZrx1ueGZu038=", - "dev": true + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true }, - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } }, - "jimp": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", - "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", - "dev": true, - "requires": { - "bignumber.js": "^2.1.0", - "bmp-js": "0.0.3", - "es6-promise": "^3.0.2", - "exif-parser": "^0.1.9", - "file-type": "^3.1.0", - "jpeg-js": "^0.2.0", - "load-bmfont": "^1.2.3", - "mime": "^1.3.4", - "mkdirp": "0.5.1", - "pixelmatch": "^4.0.0", - "pngjs": "^3.0.0", - "read-chunk": "^1.0.1", - "request": "^2.65.0", - "stream-to-buffer": "^0.1.0", - "tinycolor2": "^1.1.2", - "url-regex": "^3.0.0" - }, - "dependencies": { - "bmp-js": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", - "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=", - "dev": true - }, - "jpeg-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", - "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=", - "dev": true - } - } + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } }, - "jpeg-js": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", - "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=", - "dev": true + "terser": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz", + "integrity": "sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "terser-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==", + "dev": true, + "requires": { + "jest-worker": "^26.6.2", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.5.1" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - } - } - }, - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-protobuf-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "requires": { - "protocol-buffers-schema": "^3.3.1" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "scheduler": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.1.tgz", - "integrity": "sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", - "dev": true, - "requires": { - "node-forge": "^0.10.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timm": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", + "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==", + "dev": true + }, + "tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", + "dev": true + }, + "tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-ico": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/to-ico/-/to-ico-1.1.5.tgz", + "integrity": "sha512-5kIh7m7bkIlqIESEZkL8gAMMzucXKfPe3hX2FoDY5HEAfD9OJU+Qh9b6Enp74w0qRcxVT5ejss66PHKqc3AVkg==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "buffer-alloc": "^1.1.0", + "image-size": "^0.5.0", + "parse-png": "^1.0.0", + "resize-img": "^1.1.0" + }, + "dependencies": { + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true + } + } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shallow-equal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", - "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" - }, - "sharp": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.27.2.tgz", - "integrity": "sha512-w3FVoONPG/x5MXCc3wsjOS+b9h3CI60qkus6EPQU4dkT0BDm0PyGhDCK6KhtfT3/vbeOMOXAKFNSw+I3QGWkMA==", - "dev": true, - "requires": { - "array-flatten": "^3.0.0", - "color": "^3.1.3", - "detect-libc": "^1.0.3", - "node-addon-api": "^3.1.0", - "npmlog": "^4.1.2", - "prebuild-install": "^6.0.1", - "semver": "^7.3.4", - "simple-get": "^4.0.0", - "tar-fs": "^2.1.1", - "tunnel-agent": "^0.6.0" - }, - "dependencies": { - "array-flatten": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", - "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", - "dev": true + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true - }, - "simple-get": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", - "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", - "dev": true, - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } + "ts-jest": { + "version": "26.5.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.1.tgz", + "integrity": "sha512-G7Rmo3OJMvlqE79amJX8VJKDiRcd7/r61wh9fnvvG8cAjhA9edklGw/dCxRSQmfZ/z8NDums5srSVgwZos1qfg==", + "dev": true, + "requires": { + "@types/jest": "26.x", + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yargs-parser": { + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.5.tgz", + "integrity": "sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg==", + "dev": true + } + } }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } + "typescript": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz", + "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "dependencies": { + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + } + } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", - "websocket-driver": "^0.7.4" - } - }, - "sockjs-client": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", - "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", - "dev": true, - "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.4.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", - "dev": true - }, - "source-map-loader": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-2.0.1.tgz", - "integrity": "sha512-UzOTTQhoNPeTNzOxwFw220RSRzdGSyH4lpNyWjR7Qm34P4/N0W669YSUFdH07+YNeN75h765XLHmNsF/bm97RQ==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.2", - "source-map-js": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "stream-to": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", - "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=", - "dev": true - }, - "stream-to-buffer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", - "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", - "dev": true, - "requires": { - "stream-to": "~0.2.0" - } - }, - "string-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "style-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", - "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "url-parse": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.0.tgz", + "integrity": "sha512-9iT6N4s93SMfzunOyDPe4vo4nLcSu1yq0IQK1gURmjm8tQNlM6loiuCRrKG1hHGXfB2EWd6H4cGi7tGdaygMFw==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "supercluster": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.2.tgz", - "integrity": "sha512-bGA0pk3DYMjLTY1h+rbh0imi/I8k/Lg0rzdBGfyQs0Xkiix7jK2GUmH1qSD8+jq6U0Vu382QHr3+rbbiHqdKJA==", - "requires": { - "kdbush": "^3.0.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "url-regex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", + "dev": true, + "requires": { + "ip-regex": "^1.0.1" + }, + "dependencies": { + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", + "dev": true + } + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "terser": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz", - "integrity": "sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "utif": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", + "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", + "dev": true, + "requires": { + "pako": "^1.0.5" + } }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz", - "integrity": "sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==", - "dev": true, - "requires": { - "jest-worker": "^26.6.2", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "source-map": "^0.6.1", - "terser": "^5.5.1" - }, - "dependencies": { - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "timm": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", - "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==", - "dev": true - }, - "tinycolor2": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", - "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", - "dev": true - }, - "tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-ico": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/to-ico/-/to-ico-1.1.5.tgz", - "integrity": "sha512-5kIh7m7bkIlqIESEZkL8gAMMzucXKfPe3hX2FoDY5HEAfD9OJU+Qh9b6Enp74w0qRcxVT5ejss66PHKqc3AVkg==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "buffer-alloc": "^1.1.0", - "image-size": "^0.5.0", - "parse-png": "^1.0.0", - "resize-img": "^1.1.0" - }, - "dependencies": { - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true - } - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "ts-jest": { - "version": "26.5.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.1.tgz", - "integrity": "sha512-G7Rmo3OJMvlqE79amJX8VJKDiRcd7/r61wh9fnvvG8cAjhA9edklGw/dCxRSQmfZ/z8NDums5srSVgwZos1qfg==", - "dev": true, - "requires": { - "@types/jest": "26.x", - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", - "lodash": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "dependencies": { - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "v8-to-istanbul": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz", + "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } }, - "yargs-parser": { - "version": "20.2.5", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.5.tgz", - "integrity": "sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg==", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz", - "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - } - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } - } }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.0.tgz", - "integrity": "sha512-9iT6N4s93SMfzunOyDPe4vo4nLcSu1yq0IQK1gURmjm8tQNlM6loiuCRrKG1hHGXfB2EWd6H4cGi7tGdaygMFw==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", - "dev": true, - "requires": { - "ip-regex": "^1.0.1" - }, - "dependencies": { - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", - "dev": true - } - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "utif": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", - "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", - "dev": true, - "requires": { - "pako": "^1.0.5" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", - "dev": true - }, - "v8-to-istanbul": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz", - "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vt-pbf": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.1.tgz", - "integrity": "sha512-pHjWdrIoxurpmTcbfBWXaPwSmtPAHS105253P1qyEfSTV2HJddqjM+kIHquaT/L6lVJIk9ltTGc0IxR/G47hYA==", - "requires": { - "@mapbox/point-geometry": "0.1.0", - "@mapbox/vector-tile": "^1.3.1", - "pbf": "^3.0.5" - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "watchpack": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", - "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "webpack": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.22.0.tgz", - "integrity": "sha512-xqlb6r9RUXda/d9iA6P7YRTP1ChWeP50TEESKMMNIg0u8/Rb66zN9YJJO7oYgJTRyFyYi43NVC5feG45FSO1vQ==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.46", - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/wasm-edit": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "acorn": "^8.0.4", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.7.0", - "es-module-lexer": "^0.3.26", - "eslint-scope": "^5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.1", - "watchpack": "^2.0.0", - "webpack-sources": "^2.1.1" - }, - "dependencies": { - "enhanced-resolve": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", - "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } }, - "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true - } - } - }, - "webpack-cli": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.5.0.tgz", - "integrity": "sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.0.1", - "@webpack-cli/info": "^1.2.2", - "@webpack-cli/serve": "^1.3.0", - "colorette": "^1.2.1", - "commander": "^7.0.0", - "enquirer": "^2.3.6", - "execa": "^5.0.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "v8-compile-cache": "^2.2.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", - "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==", - "dev": true + "vt-pbf": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.1.tgz", + "integrity": "sha512-pHjWdrIoxurpmTcbfBWXaPwSmtPAHS105253P1qyEfSTV2HJddqjM+kIHquaT/L6lVJIk9ltTGc0IxR/G47hYA==", + "requires": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.0.5" + } }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } }, - "execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } }, - "get-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", - "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", - "dev": true + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true + "watchpack": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", + "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "webpack": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.22.0.tgz", + "integrity": "sha512-xqlb6r9RUXda/d9iA6P7YRTP1ChWeP50TEESKMMNIg0u8/Rb66zN9YJJO7oYgJTRyFyYi43NVC5feG45FSO1vQ==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.46", + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/wasm-edit": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "acorn": "^8.0.4", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.7.0", + "es-module-lexer": "^0.3.26", + "eslint-scope": "^5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.1", + "watchpack": "^2.0.0", + "webpack-sources": "^2.1.1" + }, + "dependencies": { + "enhanced-resolve": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", + "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + } + } }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "webpack-cli": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.5.0.tgz", + "integrity": "sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.1", + "@webpack-cli/info": "^1.2.2", + "@webpack-cli/serve": "^1.3.0", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", + "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - } - }, - "webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + } + } }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } + "webpack-merge": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } + "webpack-sources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", + "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - } - } - }, - "webpack-merge": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", - "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", - "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", - "dev": true, - "requires": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "dev": true, - "requires": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xml-parse-from-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=", - "dev": true - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dev": true, + "requires": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true } - } } From f4f78278a892bb0b66536e96ffd196feb8a83dce Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 01:28:06 +0200 Subject: [PATCH 013/322] onClick should be only on enabled image, also div is too wide --- src/sidebar/MobileSidebar.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sidebar/MobileSidebar.tsx b/src/sidebar/MobileSidebar.tsx index 1c98988b..768ca5f1 100644 --- a/src/sidebar/MobileSidebar.tsx +++ b/src/sidebar/MobileSidebar.tsx @@ -60,9 +60,9 @@ export default function ({ query, route, info, error }: MobileSidebarProps) { /> )} {!error.isDismissed && } -
getLocationStore().initReal()}> +
{route.selectedPath.instructions.length > 0 ? ( - + getLocationStore().initReal()} src={startNavigation} /> ) : ( )} From 4ffee38811d07efcc922a7762c31c3d60d215999 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 02:07:27 +0200 Subject: [PATCH 014/322] watchId can be 0 and so no clearWatch would be called; move navi icon into bigger mobile view --- src/sidebar/MobileSidebar.tsx | 18 ++++++++++-------- src/stores/LocationStore.ts | 8 ++++---- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/sidebar/MobileSidebar.tsx b/src/sidebar/MobileSidebar.tsx index 768ca5f1..5a7398a9 100644 --- a/src/sidebar/MobileSidebar.tsx +++ b/src/sidebar/MobileSidebar.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react' import { QueryPoint, QueryPointType, QueryStoreState } from '@/stores/QueryStore' import { RouteStoreState } from '@/stores/RouteStore' -import { ApiInfo, RoutingProfile } from '@/api/graphhopper' +import { ApiInfo, RoutingProfile, Path } from '@/api/graphhopper' import { ErrorStoreState } from '@/stores/ErrorStore' import styles from './MobileSidebar.module.css' import Search from '@/sidebar/search/Search' @@ -57,16 +57,10 @@ export default function ({ query, route, info, error }: MobileSidebarProps) { points={query.queryPoints} routingProfiles={info.profiles} selectedProfile={query.routingProfile} + path={route.selectedPath} /> )} {!error.isDismissed && } -
- {route.selectedPath.instructions.length > 0 ? ( - getLocationStore().initReal()} src={startNavigation} /> - ) : ( - - )} -
) @@ -80,6 +74,7 @@ function SearchView(props: { points: QueryPoint[] routingProfiles: RoutingProfile[] selectedProfile: RoutingProfile + path: Path }) { return (
@@ -88,6 +83,13 @@ function SearchView(props: { routingProfiles={props.routingProfiles} selectedProfile={props.selectedProfile} /> +
+ {props.path.instructions.length > 0 ? ( + getLocationStore().initReal()} src={startNavigation} /> + ) : ( + + )} +
) } diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 2c018368..86b54038 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -11,7 +11,7 @@ export interface LocationStoreState { export default class LocationStore extends Store { - private watchId : any + private watchId : any = undefined private interval: any private noSleep : any @@ -66,7 +66,7 @@ export default class LocationStore extends Store { console.log("location init") // force calling clearWatch can help to find GPS fix more reliable in android firefox - if(this.watchId) + if(this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) var success = (pos: any) => { @@ -86,7 +86,7 @@ export default class LocationStore extends Store { if(this.interval) clearInterval(this.interval); - if(this.watchId) + if(this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) // directly writing the state does not work: this.state.turnNavigation = false @@ -95,6 +95,6 @@ export default class LocationStore extends Store { if(!this.noSleep) this.noSleep.disable() - console.log("stopped location updates") + console.log("stopped location updates " + this.watchId + ", " + this.interval) } } From 4127683179237b12de032d7e72df4bef39957aa7 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 09:19:57 +0200 Subject: [PATCH 015/322] prettier --- src/App.tsx | 4 +- src/actions/Actions.ts | 12 ++--- src/api/Api.ts | 4 +- src/index.tsx | 4 +- src/sidebar/MobileSidebar.tsx | 2 +- src/stores/LocationStore.ts | 85 ++++++++++++++++++----------------- 6 files changed, 56 insertions(+), 55 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index d75b2424..d5c62ba8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -7,7 +7,7 @@ import { getMapOptionsStore, getQueryStore, getRouteStore, - getLocationStore, + getLocationStore } from '@/stores/Stores' import MapComponent from '@/map/Map' import { ApiInfo, Bbox } from '@/api/graphhopper' @@ -60,7 +60,7 @@ export default function App() { const isSmallScreen = useMediaQuery({ query: '(max-width: 44rem)' }) // only use the api info's bbox until any other bounding box was chosen. Is this too messy? - const chooseBoundingBox = function(infoBbox: Bbox, shouldUseInfoBbox: boolean, pathBbox?: Bbox) { + const chooseBoundingBox = function (infoBbox: Bbox, shouldUseInfoBbox: boolean, pathBbox?: Bbox) { if (shouldUseInfoBbox && pathBbox && pathBbox.every(num => num !== 0)) { setUseInfoBbox(false) return pathBbox diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 0a3fe3dc..2e37127a 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -50,8 +50,7 @@ export class AddPoint implements Action { } } -export class ClearPoints implements Action { -} +export class ClearPoints implements Action {} export class RemovePoint implements Action { readonly point: QueryPoint @@ -89,8 +88,7 @@ export class RouteRequestFailed implements Action { } } -export class ClearRoute implements Action { -} +export class ClearRoute implements Action {} export class SetSelectedPath implements Action { readonly path: Path @@ -100,8 +98,7 @@ export class SetSelectedPath implements Action { } } -export class DismissLastError implements Action { -} +export class DismissLastError implements Action {} export class SelectMapStyle implements Action { readonly styleOption: StyleOption @@ -111,5 +108,4 @@ export class SelectMapStyle implements Action { } } -export class MapIsLoaded implements Action { -} +export class MapIsLoaded implements Action {} diff --git a/src/api/Api.ts b/src/api/Api.ts index 9b09031d..f4960965 100644 --- a/src/api/Api.ts +++ b/src/api/Api.ts @@ -102,7 +102,9 @@ export class ApiImpl implements Api { const errorResult = (await response.json()) as ErrorResponse let message = errorResult.message if (errorResult.hints.length > 0) - message += (message ? message + ' and ' : '') + (errorResult.hints as any[]).map(hint => hint.message).join(' and ') + message += + (message ? message + ' and ' : '') + + (errorResult.hints as any[]).map(hint => hint.message).join(' and ') throw new Error(message) } diff --git a/src/index.tsx b/src/index.tsx index f1bf3d15..859b65f1 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -9,7 +9,7 @@ import { getMapOptionsStore, getQueryStore, getRouteStore, - setStores, + setStores } from '@/stores/Stores' import Dispatcher from '@/stores/Dispatcher' import RouteStore from '@/stores/RouteStore' @@ -30,7 +30,7 @@ setStores({ infoStore: new ApiInfoStore(), errorStore: new ErrorStore(), mapOptionsStore: new MapOptionsStore(), - locationStore: new LocationStore(), + locationStore: new LocationStore() }) // register stores at dispatcher to receive actions diff --git a/src/sidebar/MobileSidebar.tsx b/src/sidebar/MobileSidebar.tsx index 84d3ca2d..5a7398a9 100644 --- a/src/sidebar/MobileSidebar.tsx +++ b/src/sidebar/MobileSidebar.tsx @@ -18,7 +18,7 @@ type MobileSidebarProps = { error: ErrorStoreState } -export default function({ query, route, info, error }: MobileSidebarProps) { +export default function ({ query, route, info, error }: MobileSidebarProps) { // the following three elements control, whether the small search view is displayed const isShortScreen = useMediaQuery({ query: '(max-height: 55rem)' }) const [isSmallSearchView, setIsSmallSearchView] = useState(isShortScreen && hasResult(route)) diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 86b54038..070088cb 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -10,23 +10,22 @@ export interface LocationStoreState { } export default class LocationStore extends Store { - - private watchId : any = undefined + private watchId: any = undefined private interval: any - private noSleep : any + private noSleep: any protected getInitialState(): LocationStoreState { return { turnNavigation: false, - coordinate: {lat: 0, lng: 0} + coordinate: { lat: 0, lng: 0 } } } reduce(state: LocationStoreState, action: Action): LocationStoreState { - if(action instanceof LocationUpdate) { + if (action instanceof LocationUpdate) { return { turnNavigation: action.turnNavigation, - coordinate: action.coordinate, + coordinate: action.coordinate } } return state @@ -36,65 +35,69 @@ export default class LocationStore extends Store { public initFake() { // TODO randomize a route const latlon: number[][] = [ - [51.439291,14.245254], - [51.438989,14.245405], - [51.438694,14.245577], - [51.438668,14.246092], - [51.438226,14.246972], - [51.436795,14.24592], - [51.435029,14.243259], - [51.435203,14.241006], - [51.434788,14.238882], - [51.434146,14.237745], - [51.433959,14.235985], - [51.43322,14.234999]] - var currentIndex: number = 0; - - Dispatcher.dispatch(new LocationUpdate({lat: latlon[currentIndex][0], lng: latlon[currentIndex][1] }, true)) + [51.439291, 14.245254], + [51.438989, 14.245405], + [51.438694, 14.245577], + [51.438668, 14.246092], + [51.438226, 14.246972], + [51.436795, 14.24592], + [51.435029, 14.243259], + [51.435203, 14.241006], + [51.434788, 14.238882], + [51.434146, 14.237745], + [51.433959, 14.235985], + [51.43322, 14.234999] + ] + var currentIndex: number = 0 + + Dispatcher.dispatch(new LocationUpdate({ lat: latlon[currentIndex][0], lng: latlon[currentIndex][1] }, true)) this.interval = setInterval(() => { currentIndex++ currentIndex %= latlon.length - Dispatcher.dispatch(new LocationUpdate({lat: latlon[currentIndex][0], lng: latlon[currentIndex][1] }, true)) - }, 3000); + Dispatcher.dispatch( + new LocationUpdate({ lat: latlon[currentIndex][0], lng: latlon[currentIndex][1] }, true) + ) + }, 3000) } public initReal() { - if (!navigator.geolocation) { - console.log("location not supported. In firefox I had to set geo.enabled=true in about:config") + if (!navigator.geolocation) { + console.log('location not supported. In firefox I had to set geo.enabled=true in about:config') } else { - console.log("location init") + console.log('location init') // force calling clearWatch can help to find GPS fix more reliable in android firefox - if(this.watchId !== undefined) - navigator.geolocation.clearWatch(this.watchId) + if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) var success = (pos: any) => { - console.log("location success handler start") - Dispatcher.dispatch(new LocationUpdate({lat: pos.coords.latitude, lng: pos.coords.longitude }, true)) + console.log('location success handler start') + Dispatcher.dispatch(new LocationUpdate({ lat: pos.coords.latitude, lng: pos.coords.longitude }, true)) } var options = { enableHighAccuracy: false, timeout: 5000, maximumAge: 5000 } - this.watchId = navigator.geolocation.watchPosition(success, function(err) { console.log("location watch error", err);}, options) + this.watchId = navigator.geolocation.watchPosition( + success, + function (err) { + console.log('location watch error', err) + }, + options + ) } - if(!this.noSleep) - this.noSleep = new NoSleep(); + if (!this.noSleep) this.noSleep = new NoSleep() this.noSleep.enable() } public stop() { - if(this.interval) - clearInterval(this.interval); + if (this.interval) clearInterval(this.interval) - if(this.watchId !== undefined) - navigator.geolocation.clearWatch(this.watchId) + if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) // directly writing the state does not work: this.state.turnNavigation = false - Dispatcher.dispatch(new LocationUpdate({lat: 0, lng: 0 }, false)) + Dispatcher.dispatch(new LocationUpdate({ lat: 0, lng: 0 }, false)) - if(!this.noSleep) - this.noSleep.disable() + if (!this.noSleep) this.noSleep.disable() - console.log("stopped location updates " + this.watchId + ", " + this.interval) + console.log('stopped location updates ' + this.watchId + ', ' + this.interval) } } From ee828f1a52839dbacce92a0d982239da03f29a9c Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 09:50:56 +0200 Subject: [PATCH 016/322] try notation without github: --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f8ec0062..cd8dd89b 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "test": "jest" }, "dependencies": { - "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", + "leaflet.heightgraph": "easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", "mapbox-gl": "^1.13.0", "nosleep.js": "^0.12.0", "react": "^17.0.1", From 3c39a377cdf7c8ea4665573e1f7aa9f1a0dae9b6 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 09:58:38 +0200 Subject: [PATCH 017/322] updated package-lock --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39b996fc..3fce4dce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "graphhopper-maps-react", "version": "0.0.0", "dependencies": { - "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#24d763ef31b7319735478a2af7f5fcfccab018ee", + "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", "mapbox-gl": "^1.13.0", "nosleep.js": "^0.12.0", "react": "^17.0.1", @@ -12527,7 +12527,7 @@ } }, "node_modules/leaflet.heightgraph": { - "resolved": "git+ssh://git@github.com/easbar/Leaflet.Heightgraph.git#24d763ef31b7319735478a2af7f5fcfccab018ee", + "resolved": "git+ssh://git@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", "dependencies": { "d3": "^5.16.0", "d3-selection-multi": "^1.0.1" @@ -29321,8 +29321,8 @@ "dev": true }, "leaflet.heightgraph": { - "version": "git+ssh://git@github.com/easbar/Leaflet.Heightgraph.git#24d763ef31b7319735478a2af7f5fcfccab018ee", - "from": "leaflet.heightgraph@github:easbar/Leaflet.Heightgraph#24d763ef31b7319735478a2af7f5fcfccab018ee", + "version": "git+ssh://git@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", + "from": "leaflet.heightgraph@github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", "requires": { "d3": "^5.16.0", "d3-selection-multi": "^1.0.1" diff --git a/package.json b/package.json index cd8dd89b..f8ec0062 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "test": "jest" }, "dependencies": { - "leaflet.heightgraph": "easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", + "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", "mapbox-gl": "^1.13.0", "nosleep.js": "^0.12.0", "react": "^17.0.1", From ccc1db2cd4930513d2f8c05edee6b2d8f2cd577c Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 10:14:01 +0200 Subject: [PATCH 018/322] do not deploy this branch --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 05c876de..5f6c6462 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ before_deploy: pip install --user awscli deploy: on: - all_branches: true + all_branches: master skip_cleanup: true provider: script script: From d9d3816c955a56915e6baf56a51a2f1801cbc697 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 10:44:30 +0200 Subject: [PATCH 019/322] explicit dep due to https://github.com/lovell/sharp/issues/1882#issuecomment-534315249 --- package-lock.json | 859 +++++++++++++++++++++++++++------------------- package.json | 5 +- 2 files changed, 513 insertions(+), 351 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3fce4dce..009aa0e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,11 @@ "dependencies": { "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", "mapbox-gl": "^1.13.0", - "nosleep.js": "^0.12.0", + "minipass": "2.7.0", "react": "^17.0.1", "react-dom": "^17.0.1", - "react-responsive": "^8.2.0" + "react-responsive": "^8.2.0", + "sharp": "^0.23.0" }, "devDependencies": { "@svgr/webpack": "^5.5.0", @@ -5334,7 +5335,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5373,14 +5373,12 @@ "node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "node_modules/are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -5390,7 +5388,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5404,14 +5401,12 @@ "node_modules/are-we-there-yet/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/are-we-there-yet/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -5881,8 +5876,7 @@ "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "node_modules/batch": { "version": "0.6.1", @@ -5930,7 +5924,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -6110,7 +6103,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -6350,8 +6342,7 @@ "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/chrome-trace-event": { "version": "1.0.2", @@ -6555,7 +6546,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6583,7 +6573,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dev": true, "dependencies": { "color-convert": "^1.9.1", "color-string": "^1.5.4" @@ -6593,7 +6582,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -6601,14 +6589,12 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "node_modules/color-string": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "dev": true, "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -6739,8 +6725,7 @@ "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "node_modules/content-disposition": { "version": "0.5.3", @@ -6830,8 +6815,7 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "node_modules/cosmiconfig": { "version": "7.0.0", @@ -7444,7 +7428,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, "dependencies": { "mimic-response": "^2.0.0" }, @@ -7470,7 +7453,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, "engines": { "node": ">=4.0.0" } @@ -7596,8 +7578,7 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "node_modules/depd": { "version": "1.1.2", @@ -7618,7 +7599,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, "bin": { "detect-libc": "bin/detect-libc.js" }, @@ -7832,7 +7812,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "dependencies": { "once": "^1.4.0" } @@ -8270,7 +8249,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, "engines": { "node": ">=6" } @@ -8605,6 +8583,132 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, + "node_modules/favicons/node_modules/array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", + "dev": true + }, + "node_modules/favicons/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/favicons/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/favicons/node_modules/prebuild-install": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.2.tgz", + "integrity": "sha512-PzYWIKZeP+967WuKYXlTOhYBgGOvTRSfaKI89XnfJ0ansRAH7hDU45X+K+FZeI1Wb/7p/NnuctPH3g0IqKUuSQ==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.21.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/favicons/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/favicons/node_modules/sharp": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.27.2.tgz", + "integrity": "sha512-w3FVoONPG/x5MXCc3wsjOS+b9h3CI60qkus6EPQU4dkT0BDm0PyGhDCK6KhtfT3/vbeOMOXAKFNSw+I3QGWkMA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "array-flatten": "^3.0.0", + "color": "^3.1.3", + "detect-libc": "^1.0.3", + "node-addon-api": "^3.1.0", + "npmlog": "^4.1.2", + "prebuild-install": "^6.0.1", + "semver": "^7.3.4", + "simple-get": "^4.0.0", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/favicons/node_modules/sharp/node_modules/simple-get": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", + "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/faye-websocket": { "version": "0.11.3", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", @@ -8774,8 +8878,29 @@ "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -8806,7 +8931,6 @@ "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, "dependencies": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -8822,7 +8946,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "dependencies": { "number-is-nan": "^1.0.0" }, @@ -8834,7 +8957,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -8930,8 +9052,7 @@ "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", - "dev": true + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" }, "node_modules/gl-matrix": { "version": "3.3.0", @@ -9112,8 +9233,7 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "node_modules/has-value": { "version": "1.0.0", @@ -9566,8 +9686,7 @@ "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/internal-ip": { "version": "4.3.0", @@ -9823,7 +9942,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, "engines": { "node": ">=4" } @@ -10017,8 +10135,7 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "node_modules/isexe": { "version": "2.0.0", @@ -12943,9 +13060,11 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/min-document": { @@ -12980,6 +13099,43 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "node_modules/minipass": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.7.0.tgz", + "integrity": "sha512-+CbZuJ4uEiuTL9s5Z/ULkuRg1O9AvVqVvceaBrhbYHIy1R3dPO7FMmG0nZLD0//ZzZq0MUOjwdBQvk+w1JHUqQ==", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -13009,7 +13165,6 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, "dependencies": { "minimist": "^1.2.5" }, @@ -13020,8 +13175,7 @@ "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/ms": { "version": "2.1.2", @@ -13053,6 +13207,11 @@ "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=" }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + }, "node_modules/nanoid": { "version": "3.1.23", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", @@ -13090,8 +13249,7 @@ "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -13143,10 +13301,9 @@ "dev": true }, "node_modules/node-abi": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.21.0.tgz", - "integrity": "sha512-smhrivuPqEM3H5LmnY3KU6HfYv0u4QklgAxfFyRNujKUzbUcYZ+Jc2EhukB9SRcD2VpqhxM7n/MIcp1Ua1/JMg==", - "dev": true, + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.26.0.tgz", + "integrity": "sha512-ag/Vos/mXXpWLLAYWsAoQdgS+gW7IwvgMLOgqopm/DbzAjazLltzgzpVMsFlgmo9TzG5hGXeaBZx2AI731RIsQ==", "dependencies": { "semver": "^5.4.1" } @@ -13155,15 +13312,14 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, "bin": { "semver": "bin/semver" } }, "node_modules/node-addon-api": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", - "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.0.tgz", + "integrity": "sha512-kcwSAWhPi4+QzAtsL2+2s/awvDo2GKLsvMCwNRxb5BUshteXU8U97NCyvQDsGKs/m0He9WcG4YWew/BnuLx++w==", "dev": true }, "node_modules/node-fetch": { @@ -13275,8 +13431,7 @@ "node_modules/noop-logger": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", - "dev": true + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -13308,11 +13463,6 @@ "node": ">=0.10.0" } }, - "node_modules/nosleep.js": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.12.0.tgz", - "integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==" - }, "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -13329,7 +13479,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -13350,7 +13499,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -13788,7 +13936,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "dependencies": { "wrappy": "1" } @@ -14350,10 +14497,9 @@ "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" }, "node_modules/prebuild-install": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.1.tgz", - "integrity": "sha512-7GOJrLuow8yeiyv75rmvZyeMGzl8mdEX5gY69d6a6bHWmiPevwqFw+tQavhK0EYMaSg3/KD24cWqeQv1EWsqDQ==", - "dev": true, + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz", + "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==", "dependencies": { "detect-libc": "^1.0.3", "expand-template": "^2.0.3", @@ -14378,17 +14524,6 @@ "node": ">=6" } }, - "node_modules/prebuild-install/node_modules/simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "dev": true, - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -14492,8 +14627,7 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/promise-polyfill": { "version": "8.2.0", @@ -14558,7 +14692,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -14658,7 +14791,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -15487,7 +15619,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -15636,8 +15767,7 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "node_modules/set-value": { "version": "2.0.1", @@ -15690,45 +15820,26 @@ "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" }, "node_modules/sharp": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.27.2.tgz", - "integrity": "sha512-w3FVoONPG/x5MXCc3wsjOS+b9h3CI60qkus6EPQU4dkT0BDm0PyGhDCK6KhtfT3/vbeOMOXAKFNSw+I3QGWkMA==", - "dev": true, + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.23.4.tgz", + "integrity": "sha512-fJMagt6cT0UDy9XCsgyLi0eiwWWhQRxbwGmqQT6sY8Av4s0SVsT/deg8fobBQCTDU5iXRgz0rAeXoE2LBZ8g+Q==", + "hasInstallScript": true, "dependencies": { - "array-flatten": "^3.0.0", - "color": "^3.1.3", + "color": "^3.1.2", "detect-libc": "^1.0.3", - "node-addon-api": "^3.1.0", + "nan": "^2.14.0", "npmlog": "^4.1.2", - "prebuild-install": "^6.0.1", - "semver": "^7.3.4", - "simple-get": "^4.0.0", - "tar-fs": "^2.1.1", + "prebuild-install": "^5.3.3", + "semver": "^6.3.0", + "simple-get": "^3.1.0", + "tar": "^5.0.5", "tunnel-agent": "^0.6.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/sharp/node_modules/array-flatten": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", - "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", - "dev": true - }, - "node_modules/sharp/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" + "node": ">=8.5.0" }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://opencollective.com/libvips" } }, "node_modules/shebang-command": { @@ -15762,52 +15873,41 @@ "node_modules/signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/simple-get": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", - "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", "dependencies": { - "decompress-response": "^6.0.0", + "decompress-response": "^4.2.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/simple-get/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, "dependencies": { "is-arrayish": "^0.3.1" } @@ -15815,8 +15915,7 @@ "node_modules/simple-swizzle/node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sisteransi": { "version": "1.0.5", @@ -16393,7 +16492,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "dependencies": { "ansi-regex": "^2.0.0" }, @@ -16432,7 +16530,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -16581,11 +16678,26 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.5.tgz", + "integrity": "sha512-MNIgJddrV2TkuwChwcSNds/5E9VijOiw7kAc1y5hTNJoLDSuIyid2QtLYiCYNnICebpuvjhPQZsXwUL0O3l7OQ==", + "dependencies": { + "chownr": "^1.1.3", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^0.5.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -16597,7 +16709,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -16609,6 +16720,17 @@ "node": ">=6" } }, + "node_modules/tar/node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -16968,7 +17090,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -18018,14 +18139,12 @@ "node_modules/which-pm-runs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "dev": true + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" }, "node_modules/wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, "dependencies": { "string-width": "^1.0.2 || 2" } @@ -18034,7 +18153,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, "engines": { "node": ">=4" } @@ -18043,7 +18161,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -18056,7 +18173,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "dependencies": { "ansi-regex": "^3.0.0" }, @@ -18117,8 +18233,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -18211,8 +18326,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { "version": "1.10.2", @@ -23345,8 +23459,7 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "3.2.1", @@ -23376,14 +23489,12 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -23393,7 +23504,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -23407,14 +23517,12 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -23808,8 +23916,7 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "batch": { "version": "0.6.1", @@ -23848,7 +23955,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -24008,7 +24114,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -24218,8 +24323,7 @@ "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "chrome-trace-event": { "version": "1.0.2", @@ -24394,8 +24498,7 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "collect-v8-coverage": { "version": "1.0.1", @@ -24417,7 +24520,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dev": true, "requires": { "color-convert": "^1.9.1", "color-string": "^1.5.4" @@ -24427,7 +24529,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -24435,14 +24536,12 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "dev": true, "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -24554,8 +24653,7 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "content-disposition": { "version": "0.5.3", @@ -24636,8 +24734,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "7.0.0", @@ -25186,7 +25283,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, "requires": { "mimic-response": "^2.0.0" } @@ -25208,8 +25304,7 @@ "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "deep-is": { "version": "0.1.3", @@ -25307,8 +25402,7 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "depd": { "version": "1.1.2", @@ -25325,8 +25419,7 @@ "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, "detect-newline": { "version": "3.1.0", @@ -25519,7 +25612,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -25879,8 +25971,7 @@ "expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" }, "expect": { "version": "26.6.2", @@ -26153,6 +26244,91 @@ "to-ico": "^1.1.5", "vinyl": "^2.2.1", "xml2js": "^0.4.23" + }, + "dependencies": { + "array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", + "dev": true + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "prebuild-install": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.2.tgz", + "integrity": "sha512-PzYWIKZeP+967WuKYXlTOhYBgGOvTRSfaKI89XnfJ0ansRAH7hDU45X+K+FZeI1Wb/7p/NnuctPH3g0IqKUuSQ==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.21.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "sharp": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.27.2.tgz", + "integrity": "sha512-w3FVoONPG/x5MXCc3wsjOS+b9h3CI60qkus6EPQU4dkT0BDm0PyGhDCK6KhtfT3/vbeOMOXAKFNSw+I3QGWkMA==", + "dev": true, + "requires": { + "array-flatten": "^3.0.0", + "color": "^3.1.3", + "detect-libc": "^1.0.3", + "node-addon-api": "^3.1.0", + "npmlog": "^4.1.2", + "prebuild-install": "^6.0.1", + "semver": "^7.3.4", + "simple-get": "^4.0.0", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "simple-get": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", + "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", + "dev": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + } + } + } } }, "favicons-webpack-plugin": { @@ -26313,8 +26489,25 @@ "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + } + } }, "fs.realpath": { "version": "1.0.0", @@ -26339,7 +26532,6 @@ "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -26355,7 +26547,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -26364,7 +26555,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -26444,8 +26634,7 @@ "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", - "dev": true + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" }, "gl-matrix": { "version": "3.3.0", @@ -26600,8 +26789,7 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "has-value": { "version": "1.0.0", @@ -26982,8 +27170,7 @@ "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "internal-ip": { "version": "4.3.0", @@ -27181,8 +27368,7 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-function": { "version": "1.0.2", @@ -27327,8 +27513,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -29674,8 +29859,7 @@ "mimic-response": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" }, "min-document": { "version": "2.19.0", @@ -29706,6 +29890,41 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "minipass": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.7.0.tgz", + "integrity": "sha512-+CbZuJ4uEiuTL9s5Z/ULkuRg1O9AvVqVvceaBrhbYHIy1R3dPO7FMmG0nZLD0//ZzZq0MUOjwdBQvk+w1JHUqQ==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -29731,7 +29950,6 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, "requires": { "minimist": "^1.2.5" } @@ -29739,8 +29957,7 @@ "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "ms": { "version": "2.1.2", @@ -29769,6 +29986,11 @@ "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=" }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + }, "nanoid": { "version": "3.1.23", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", @@ -29797,8 +30019,7 @@ "napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" }, "natural-compare": { "version": "1.4.0", @@ -29849,10 +30070,9 @@ } }, "node-abi": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.21.0.tgz", - "integrity": "sha512-smhrivuPqEM3H5LmnY3KU6HfYv0u4QklgAxfFyRNujKUzbUcYZ+Jc2EhukB9SRcD2VpqhxM7n/MIcp1Ua1/JMg==", - "dev": true, + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.26.0.tgz", + "integrity": "sha512-ag/Vos/mXXpWLLAYWsAoQdgS+gW7IwvgMLOgqopm/DbzAjazLltzgzpVMsFlgmo9TzG5hGXeaBZx2AI731RIsQ==", "requires": { "semver": "^5.4.1" }, @@ -29860,15 +30080,14 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, "node-addon-api": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", - "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.0.tgz", + "integrity": "sha512-kcwSAWhPi4+QzAtsL2+2s/awvDo2GKLsvMCwNRxb5BUshteXU8U97NCyvQDsGKs/m0He9WcG4YWew/BnuLx++w==", "dev": true }, "node-fetch": { @@ -29955,8 +30174,7 @@ "noop-logger": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", - "dev": true + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" }, "normalize-package-data": { "version": "2.5.0", @@ -29984,11 +30202,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "nosleep.js": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.12.0.tgz", - "integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==" - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -30002,7 +30215,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -30022,8 +30234,7 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nwsapi": { "version": "2.2.0", @@ -30385,7 +30596,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -30844,10 +31054,9 @@ "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" }, "prebuild-install": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.1.tgz", - "integrity": "sha512-7GOJrLuow8yeiyv75rmvZyeMGzl8mdEX5gY69d6a6bHWmiPevwqFw+tQavhK0EYMaSg3/KD24cWqeQv1EWsqDQ==", - "dev": true, + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz", + "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==", "requires": { "detect-libc": "^1.0.3", "expand-template": "^2.0.3", @@ -30864,19 +31073,6 @@ "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0", "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "dev": true, - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - } } }, "prelude-ls": { @@ -30960,8 +31156,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise-polyfill": { "version": "8.2.0", @@ -31020,7 +31215,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -31103,7 +31297,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -31802,8 +31995,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "send": { "version": "0.17.1", @@ -31937,8 +32129,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.1", @@ -31984,38 +32175,19 @@ "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" }, "sharp": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.27.2.tgz", - "integrity": "sha512-w3FVoONPG/x5MXCc3wsjOS+b9h3CI60qkus6EPQU4dkT0BDm0PyGhDCK6KhtfT3/vbeOMOXAKFNSw+I3QGWkMA==", - "dev": true, + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.23.4.tgz", + "integrity": "sha512-fJMagt6cT0UDy9XCsgyLi0eiwWWhQRxbwGmqQT6sY8Av4s0SVsT/deg8fobBQCTDU5iXRgz0rAeXoE2LBZ8g+Q==", "requires": { - "array-flatten": "^3.0.0", - "color": "^3.1.3", + "color": "^3.1.2", "detect-libc": "^1.0.3", - "node-addon-api": "^3.1.0", + "nan": "^2.14.0", "npmlog": "^4.1.2", - "prebuild-install": "^6.0.1", - "semver": "^7.3.4", - "simple-get": "^4.0.0", - "tar-fs": "^2.1.1", + "prebuild-install": "^5.3.3", + "semver": "^6.3.0", + "simple-get": "^3.1.0", + "tar": "^5.0.5", "tunnel-agent": "^0.6.0" - }, - "dependencies": { - "array-flatten": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", - "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "shebang-command": { @@ -32043,48 +32215,27 @@ "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" }, "simple-get": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", - "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", "requires": { - "decompress-response": "^6.0.0", + "decompress-response": "^4.2.0", "once": "^1.3.1", "simple-concat": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } } }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, "requires": { "is-arrayish": "^0.3.1" }, @@ -32092,8 +32243,7 @@ "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" } } }, @@ -32591,7 +32741,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -32617,8 +32766,7 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "style-loader": { "version": "2.0.0", @@ -32735,11 +32883,33 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, + "tar": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.5.tgz", + "integrity": "sha512-MNIgJddrV2TkuwChwcSNds/5E9VijOiw7kAc1y5hTNJoLDSuIyid2QtLYiCYNnICebpuvjhPQZsXwUL0O3l7OQ==", + "requires": { + "chownr": "^1.1.3", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^0.5.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, "tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, "requires": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -32751,7 +32921,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, "requires": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -33042,7 +33211,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -33894,14 +34062,12 @@ "which-pm-runs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "dev": true + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, "requires": { "string-width": "^1.0.2 || 2" }, @@ -33909,14 +34075,12 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -33926,7 +34090,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -33976,8 +34139,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "3.0.3", @@ -34061,8 +34223,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { "version": "1.10.2", diff --git a/package.json b/package.json index f8ec0062..0ed5cf77 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,11 @@ "dependencies": { "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", "mapbox-gl": "^1.13.0", - "nosleep.js": "^0.12.0", + "minipass": "2.7.0", "react": "^17.0.1", "react-dom": "^17.0.1", - "react-responsive": "^8.2.0" + "react-responsive": "^8.2.0", + "sharp": "^0.23.0" }, "devDependencies": { "@svgr/webpack": "^5.5.0", From a397bd82f2552ec292431c18153c9daf0a06b995 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 10:49:40 +0200 Subject: [PATCH 020/322] try branch instead of commit --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 009aa0e2..0e217ee7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "graphhopper-maps-react", "version": "0.0.0", "dependencies": { - "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", + "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#mapbox", "mapbox-gl": "^1.13.0", "minipass": "2.7.0", "react": "^17.0.1", @@ -29507,7 +29507,7 @@ }, "leaflet.heightgraph": { "version": "git+ssh://git@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", - "from": "leaflet.heightgraph@github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", + "from": "leaflet.heightgraph@github:easbar/Leaflet.Heightgraph#mapbox", "requires": { "d3": "^5.16.0", "d3-selection-multi": "^1.0.1" diff --git a/package.json b/package.json index 0ed5cf77..0ee9dc16 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "test": "jest" }, "dependencies": { - "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", + "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#mapbox", "mapbox-gl": "^1.13.0", "minipass": "2.7.0", "react": "^17.0.1", From 8aa09d88c4072143b0852ad900b41b539d6b39d9 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 10:54:15 +0200 Subject: [PATCH 021/322] and this? --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0ee9dc16..bf2029e6 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "test": "jest" }, "dependencies": { - "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#mapbox", + "leaflet.heightgraph": "https://github.com/easbar/Leaflet.Heightgraph#mapbox", "mapbox-gl": "^1.13.0", "minipass": "2.7.0", "react": "^17.0.1", From 4561e4c7ce0121c26f6e544777da377177db9426 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 10:58:23 +0200 Subject: [PATCH 022/322] is it a cache problem? --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 5f6c6462..e783642c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,3 +21,6 @@ deploy: script: # upload all files from ./dist folder and delete files on s3 which are not in current build - aws s3 sync ./dist s3://gh-maps-react --delete + +cache: + npm: false \ No newline at end of file From 152b958a379371bff40d7850174d6850ec71c192 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 11:00:45 +0200 Subject: [PATCH 023/322] avoid fetching repo via ssh again --- .travis.yml | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index e783642c..6e0a422d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ global: - travis encrypt AWS_ACCESS_KEY_ID=$S3_KEY_ID --add - travis encrypt AWS_SECRET_ACCESS_KEY=$S3_KEY --add -script: npm run build && npm run test +script: git config --global url."https://".insteadOf git:// && npm run build && npm run test # install awscli command line tool to sync files to s3 before_deploy: pip install --user awscli @@ -22,5 +22,5 @@ deploy: # upload all files from ./dist folder and delete files on s3 which are not in current build - aws s3 sync ./dist s3://gh-maps-react --delete -cache: - npm: false \ No newline at end of file +#cache: +# npm: false \ No newline at end of file diff --git a/package.json b/package.json index bf2029e6..0ed5cf77 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "test": "jest" }, "dependencies": { - "leaflet.heightgraph": "https://github.com/easbar/Leaflet.Heightgraph#mapbox", + "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", "mapbox-gl": "^1.13.0", "minipass": "2.7.0", "react": "^17.0.1", From 7b3b835d74882fbc1f58c3496c58d166618f4403 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 11:07:21 +0200 Subject: [PATCH 024/322] it seems to be a npm bug https://github.com/npm/cli/issues/2610 --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0e217ee7..4c4ea698 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12644,7 +12644,7 @@ } }, "node_modules/leaflet.heightgraph": { - "resolved": "git+ssh://git@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", + "resolved": "github:easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", "dependencies": { "d3": "^5.16.0", "d3-selection-multi": "^1.0.1" @@ -29506,7 +29506,7 @@ "dev": true }, "leaflet.heightgraph": { - "version": "git+ssh://git@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", + "version": "github:easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", "from": "leaflet.heightgraph@github:easbar/Leaflet.Heightgraph#mapbox", "requires": { "d3": "^5.16.0", From 1b4ca79df682122364a296d1d3be79ad5ebff5fc Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 11:15:47 +0200 Subject: [PATCH 025/322] revert travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6e0a422d..4d707d1c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ global: - travis encrypt AWS_ACCESS_KEY_ID=$S3_KEY_ID --add - travis encrypt AWS_SECRET_ACCESS_KEY=$S3_KEY --add -script: git config --global url."https://".insteadOf git:// && npm run build && npm run test +script: npm run build && npm run test # install awscli command line tool to sync files to s3 before_deploy: pip install --user awscli From bfe99eceae6c37f769c35f451180226606532803 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 11:17:47 +0200 Subject: [PATCH 026/322] trick npm and force https: recreate package-lock.js from notation with user name --- package-lock.json | 53 ++++++++--------------------------------------- package.json | 2 +- 2 files changed, 10 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4c4ea698..e2bbf316 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "graphhopper-maps-react", "version": "0.0.0", "dependencies": { - "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#mapbox", + "leaflet.heightgraph": "git+https://easbar@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", "mapbox-gl": "^1.13.0", "minipass": "2.7.0", "react": "^17.0.1", @@ -6326,19 +6326,6 @@ "node": ">=0.10.0" } }, - "node_modules/chokidar/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 4.0" - } - }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -8908,19 +8895,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -12644,7 +12618,11 @@ } }, "node_modules/leaflet.heightgraph": { - "resolved": "github:easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", + "name": "heightgraph", + "version": "0.0.1", + "resolved": "git+https://easbar@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", + "integrity": "sha512-tLP00wuPdjJnHr8eCvZFIir5yOD7b9Anb3TrfbWDlji925iS5oN3TU9p8exnsn1jtxjO4TXc2X/3LaeznSxP3w==", + "license": "ISC", "dependencies": { "d3": "^5.16.0", "d3-selection-multi": "^1.0.1" @@ -24310,13 +24288,6 @@ } } } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true } } }, @@ -26515,13 +26486,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -29506,8 +29470,9 @@ "dev": true }, "leaflet.heightgraph": { - "version": "github:easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", - "from": "leaflet.heightgraph@github:easbar/Leaflet.Heightgraph#mapbox", + "version": "git+https://easbar@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", + "integrity": "sha512-tLP00wuPdjJnHr8eCvZFIir5yOD7b9Anb3TrfbWDlji925iS5oN3TU9p8exnsn1jtxjO4TXc2X/3LaeznSxP3w==", + "from": "leaflet.heightgraph@git+https://easbar@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", "requires": { "d3": "^5.16.0", "d3-selection-multi": "^1.0.1" diff --git a/package.json b/package.json index 0ed5cf77..828aad05 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "test": "jest" }, "dependencies": { - "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", + "leaflet.heightgraph": "git+https://easbar@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", "mapbox-gl": "^1.13.0", "minipass": "2.7.0", "react": "^17.0.1", From 1d6912af8e2c055b169a0555a67dd52195a81277 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 11:28:40 +0200 Subject: [PATCH 027/322] try with optional dependencies --- package-lock.json | 327 ++++++++++++++++++++++++++++++++++++---------- package.json | 9 +- 2 files changed, 268 insertions(+), 68 deletions(-) diff --git a/package-lock.json b/package-lock.json index e2bbf316..8948bd8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,11 +10,10 @@ "dependencies": { "leaflet.heightgraph": "git+https://easbar@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", "mapbox-gl": "^1.13.0", - "minipass": "2.7.0", + "nosleep.js": "^0.12.0", "react": "^17.0.1", "react-dom": "^17.0.1", - "react-responsive": "^8.2.0", - "sharp": "^0.23.0" + "react-responsive": "^8.2.0" }, "devDependencies": { "@svgr/webpack": "^5.5.0", @@ -37,6 +36,11 @@ "webpack-cli": "^4.5.0", "webpack-dev-server": "^3.11.2", "webpack-merge": "^5.7.3" + }, + "optionalDependencies": { + "fsevents": "1.2.9", + "minipass": "2.7.0", + "sharp": "^0.23.0" } }, "node_modules/@babel/code-frame": { @@ -5335,6 +5339,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -5373,12 +5378,14 @@ "node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "devOptional": true }, "node_modules/are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "devOptional": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -5388,6 +5395,7 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "devOptional": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5401,12 +5409,14 @@ "node_modules/are-we-there-yet/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "devOptional": true }, "node_modules/are-we-there-yet/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "devOptional": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -5876,7 +5886,8 @@ "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "devOptional": true }, "node_modules/batch": { "version": "0.6.1", @@ -5924,6 +5935,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "devOptional": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -6103,6 +6115,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "devOptional": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -6329,7 +6342,8 @@ "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "devOptional": true }, "node_modules/chrome-trace-event": { "version": "1.0.2", @@ -6533,6 +6547,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -6560,6 +6575,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "devOptional": true, "dependencies": { "color-convert": "^1.9.1", "color-string": "^1.5.4" @@ -6569,6 +6585,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "devOptional": true, "dependencies": { "color-name": "1.1.3" } @@ -6576,12 +6593,14 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "devOptional": true }, "node_modules/color-string": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "devOptional": true, "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -6712,7 +6731,8 @@ "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "devOptional": true }, "node_modules/content-disposition": { "version": "0.5.3", @@ -6802,7 +6822,8 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "devOptional": true }, "node_modules/cosmiconfig": { "version": "7.0.0", @@ -7415,6 +7436,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "devOptional": true, "dependencies": { "mimic-response": "^2.0.0" }, @@ -7440,6 +7462,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "devOptional": true, "engines": { "node": ">=4.0.0" } @@ -7565,7 +7588,8 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "devOptional": true }, "node_modules/depd": { "version": "1.1.2", @@ -7586,6 +7610,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "devOptional": true, "bin": { "detect-libc": "bin/detect-libc.js" }, @@ -7799,6 +7824,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "devOptional": true, "dependencies": { "once": "^1.4.0" } @@ -8236,6 +8262,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "devOptional": true, "engines": { "node": ">=6" } @@ -8865,12 +8892,14 @@ "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "devOptional": true }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "optional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -8882,6 +8911,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -8895,6 +8925,27 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "node_modules/fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "bundleDependencies": [ + "node-pre-gyp" + ], + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -8905,6 +8956,7 @@ "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "devOptional": true, "dependencies": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -8920,6 +8972,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "devOptional": true, "dependencies": { "number-is-nan": "^1.0.0" }, @@ -8931,6 +8984,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "devOptional": true, "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -9026,7 +9080,8 @@ "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "devOptional": true }, "node_modules/gl-matrix": { "version": "3.3.0", @@ -9207,7 +9262,8 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "devOptional": true }, "node_modules/has-value": { "version": "1.0.0", @@ -9660,7 +9716,8 @@ "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "devOptional": true }, "node_modules/internal-ip": { "version": "4.3.0", @@ -9916,6 +9973,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "devOptional": true, "engines": { "node": ">=4" } @@ -10109,7 +10167,8 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "devOptional": true }, "node_modules/isexe": { "version": "2.0.0", @@ -13038,6 +13097,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "devOptional": true, "engines": { "node": ">=8" }, @@ -13081,6 +13141,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.7.0.tgz", "integrity": "sha512-+CbZuJ4uEiuTL9s5Z/ULkuRg1O9AvVqVvceaBrhbYHIy1R3dPO7FMmG0nZLD0//ZzZq0MUOjwdBQvk+w1JHUqQ==", + "optional": true, "dependencies": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -13089,12 +13150,14 @@ "node_modules/minipass/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "optional": true }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "optional": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -13107,6 +13170,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -13143,6 +13207,7 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "devOptional": true, "dependencies": { "minimist": "^1.2.5" }, @@ -13153,7 +13218,8 @@ "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "devOptional": true }, "node_modules/ms": { "version": "2.1.2", @@ -13188,7 +13254,8 @@ "node_modules/nan": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "optional": true }, "node_modules/nanoid": { "version": "3.1.23", @@ -13227,7 +13294,8 @@ "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "devOptional": true }, "node_modules/natural-compare": { "version": "1.4.0", @@ -13282,6 +13350,7 @@ "version": "2.26.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.26.0.tgz", "integrity": "sha512-ag/Vos/mXXpWLLAYWsAoQdgS+gW7IwvgMLOgqopm/DbzAjazLltzgzpVMsFlgmo9TzG5hGXeaBZx2AI731RIsQ==", + "devOptional": true, "dependencies": { "semver": "^5.4.1" } @@ -13290,6 +13359,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "devOptional": true, "bin": { "semver": "bin/semver" } @@ -13409,7 +13479,8 @@ "node_modules/noop-logger": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", + "devOptional": true }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -13441,6 +13512,11 @@ "node": ">=0.10.0" } }, + "node_modules/nosleep.js": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.12.0.tgz", + "integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==" + }, "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -13457,6 +13533,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "devOptional": true, "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -13477,6 +13554,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -13914,6 +13992,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "devOptional": true, "dependencies": { "wrappy": "1" } @@ -14478,6 +14557,7 @@ "version": "5.3.6", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz", "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==", + "optional": true, "dependencies": { "detect-libc": "^1.0.3", "expand-template": "^2.0.3", @@ -14605,7 +14685,8 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "devOptional": true }, "node_modules/promise-polyfill": { "version": "8.2.0", @@ -14670,6 +14751,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "devOptional": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -14769,6 +14851,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "devOptional": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -15597,6 +15680,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "devOptional": true, "bin": { "semver": "bin/semver.js" } @@ -15745,7 +15829,8 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "devOptional": true }, "node_modules/set-value": { "version": "2.0.1", @@ -15802,6 +15887,7 @@ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.23.4.tgz", "integrity": "sha512-fJMagt6cT0UDy9XCsgyLi0eiwWWhQRxbwGmqQT6sY8Av4s0SVsT/deg8fobBQCTDU5iXRgz0rAeXoE2LBZ8g+Q==", "hasInstallScript": true, + "optional": true, "dependencies": { "color": "^3.1.2", "detect-libc": "^1.0.3", @@ -15851,12 +15937,14 @@ "node_modules/signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "devOptional": true }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "devOptional": true, "funding": [ { "type": "github", @@ -15876,6 +15964,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "devOptional": true, "dependencies": { "decompress-response": "^4.2.0", "once": "^1.3.1", @@ -15886,6 +15975,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "devOptional": true, "dependencies": { "is-arrayish": "^0.3.1" } @@ -15893,7 +15983,8 @@ "node_modules/simple-swizzle/node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "devOptional": true }, "node_modules/sisteransi": { "version": "1.0.5", @@ -16470,6 +16561,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "devOptional": true, "dependencies": { "ansi-regex": "^2.0.0" }, @@ -16508,6 +16600,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -16660,6 +16753,7 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.5.tgz", "integrity": "sha512-MNIgJddrV2TkuwChwcSNds/5E9VijOiw7kAc1y5hTNJoLDSuIyid2QtLYiCYNnICebpuvjhPQZsXwUL0O3l7OQ==", + "optional": true, "dependencies": { "chownr": "^1.1.3", "fs-minipass": "^2.0.0", @@ -16676,6 +16770,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "devOptional": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -16687,6 +16782,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "devOptional": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -16702,6 +16798,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -17068,6 +17165,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "devOptional": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -18117,12 +18215,14 @@ "node_modules/which-pm-runs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "optional": true }, "node_modules/wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "devOptional": true, "dependencies": { "string-width": "^1.0.2 || 2" } @@ -18131,6 +18231,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "devOptional": true, "engines": { "node": ">=4" } @@ -18139,6 +18240,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "devOptional": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -18151,6 +18253,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "devOptional": true, "dependencies": { "ansi-regex": "^3.0.0" }, @@ -18211,7 +18314,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "devOptional": true }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -18304,7 +18408,8 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true }, "node_modules/yaml": { "version": "1.10.2", @@ -23437,7 +23542,8 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "devOptional": true }, "ansi-styles": { "version": "3.2.1", @@ -23467,12 +23573,14 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "devOptional": true }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "devOptional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -23482,6 +23590,7 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "devOptional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -23495,12 +23604,14 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "devOptional": true }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "devOptional": true, "requires": { "safe-buffer": "~5.1.0" } @@ -23894,7 +24005,8 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "devOptional": true }, "batch": { "version": "0.6.1", @@ -23933,6 +24045,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "devOptional": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -24092,6 +24205,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "devOptional": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -24294,7 +24408,8 @@ "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "devOptional": true }, "chrome-trace-event": { "version": "1.0.2", @@ -24469,7 +24584,8 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "devOptional": true }, "collect-v8-coverage": { "version": "1.0.1", @@ -24491,6 +24607,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "devOptional": true, "requires": { "color-convert": "^1.9.1", "color-string": "^1.5.4" @@ -24500,6 +24617,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "devOptional": true, "requires": { "color-name": "1.1.3" } @@ -24507,12 +24625,14 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "devOptional": true }, "color-string": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "devOptional": true, "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -24624,7 +24744,8 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "devOptional": true }, "content-disposition": { "version": "0.5.3", @@ -24705,7 +24826,8 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "devOptional": true }, "cosmiconfig": { "version": "7.0.0", @@ -25254,6 +25376,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "devOptional": true, "requires": { "mimic-response": "^2.0.0" } @@ -25275,7 +25398,8 @@ "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "devOptional": true }, "deep-is": { "version": "0.1.3", @@ -25373,7 +25497,8 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "devOptional": true }, "depd": { "version": "1.1.2", @@ -25390,7 +25515,8 @@ "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "devOptional": true }, "detect-newline": { "version": "3.1.0", @@ -25583,6 +25709,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "devOptional": true, "requires": { "once": "^1.4.0" } @@ -25942,7 +26069,8 @@ "expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "devOptional": true }, "expect": { "version": "26.6.2", @@ -26460,12 +26588,14 @@ "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "devOptional": true }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "optional": true, "requires": { "minipass": "^3.0.0" }, @@ -26474,6 +26604,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "optional": true, "requires": { "yallist": "^4.0.0" } @@ -26486,6 +26617,16 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -26496,6 +26637,7 @@ "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "devOptional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -26511,6 +26653,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "devOptional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -26519,6 +26662,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "devOptional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -26598,7 +26742,8 @@ "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "devOptional": true }, "gl-matrix": { "version": "3.3.0", @@ -26753,7 +26898,8 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "devOptional": true }, "has-value": { "version": "1.0.0", @@ -27134,7 +27280,8 @@ "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "devOptional": true }, "internal-ip": { "version": "4.3.0", @@ -27332,7 +27479,8 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "devOptional": true }, "is-function": { "version": "1.0.2", @@ -27477,7 +27625,8 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "devOptional": true }, "isexe": { "version": "2.0.0", @@ -29824,7 +29973,8 @@ "mimic-response": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "devOptional": true }, "min-document": { "version": "2.19.0", @@ -29859,6 +30009,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.7.0.tgz", "integrity": "sha512-+CbZuJ4uEiuTL9s5Z/ULkuRg1O9AvVqVvceaBrhbYHIy1R3dPO7FMmG0nZLD0//ZzZq0MUOjwdBQvk+w1JHUqQ==", + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -29867,7 +30018,8 @@ "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "optional": true } } }, @@ -29875,6 +30027,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "optional": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -29884,6 +30037,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "optional": true, "requires": { "yallist": "^4.0.0" } @@ -29915,6 +30069,7 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "devOptional": true, "requires": { "minimist": "^1.2.5" } @@ -29922,7 +30077,8 @@ "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "devOptional": true }, "ms": { "version": "2.1.2", @@ -29954,7 +30110,8 @@ "nan": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "optional": true }, "nanoid": { "version": "3.1.23", @@ -29984,7 +30141,8 @@ "napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "devOptional": true }, "natural-compare": { "version": "1.4.0", @@ -30038,6 +30196,7 @@ "version": "2.26.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.26.0.tgz", "integrity": "sha512-ag/Vos/mXXpWLLAYWsAoQdgS+gW7IwvgMLOgqopm/DbzAjazLltzgzpVMsFlgmo9TzG5hGXeaBZx2AI731RIsQ==", + "devOptional": true, "requires": { "semver": "^5.4.1" }, @@ -30045,7 +30204,8 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "devOptional": true } } }, @@ -30139,7 +30299,8 @@ "noop-logger": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", + "devOptional": true }, "normalize-package-data": { "version": "2.5.0", @@ -30167,6 +30328,11 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "nosleep.js": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.12.0.tgz", + "integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==" + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -30180,6 +30346,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "devOptional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -30199,7 +30366,8 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "devOptional": true }, "nwsapi": { "version": "2.2.0", @@ -30561,6 +30729,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "devOptional": true, "requires": { "wrappy": "1" } @@ -31022,6 +31191,7 @@ "version": "5.3.6", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz", "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==", + "optional": true, "requires": { "detect-libc": "^1.0.3", "expand-template": "^2.0.3", @@ -31121,7 +31291,8 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "devOptional": true }, "promise-polyfill": { "version": "8.2.0", @@ -31180,6 +31351,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "devOptional": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -31262,6 +31434,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "devOptional": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -31960,7 +32133,8 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "devOptional": true }, "send": { "version": "0.17.1", @@ -32094,7 +32268,8 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "devOptional": true }, "set-value": { "version": "2.0.1", @@ -32143,6 +32318,7 @@ "version": "0.23.4", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.23.4.tgz", "integrity": "sha512-fJMagt6cT0UDy9XCsgyLi0eiwWWhQRxbwGmqQT6sY8Av4s0SVsT/deg8fobBQCTDU5iXRgz0rAeXoE2LBZ8g+Q==", + "optional": true, "requires": { "color": "^3.1.2", "detect-libc": "^1.0.3", @@ -32180,17 +32356,20 @@ "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "devOptional": true }, "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "devOptional": true }, "simple-get": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "devOptional": true, "requires": { "decompress-response": "^4.2.0", "once": "^1.3.1", @@ -32201,6 +32380,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "devOptional": true, "requires": { "is-arrayish": "^0.3.1" }, @@ -32208,7 +32388,8 @@ "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "devOptional": true } } }, @@ -32706,6 +32887,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "devOptional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -32731,7 +32913,8 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "devOptional": true }, "style-loader": { "version": "2.0.0", @@ -32852,6 +33035,7 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.5.tgz", "integrity": "sha512-MNIgJddrV2TkuwChwcSNds/5E9VijOiw7kAc1y5hTNJoLDSuIyid2QtLYiCYNnICebpuvjhPQZsXwUL0O3l7OQ==", + "optional": true, "requires": { "chownr": "^1.1.3", "fs-minipass": "^2.0.0", @@ -32865,6 +33049,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "optional": true, "requires": { "yallist": "^4.0.0" } @@ -32875,6 +33060,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "devOptional": true, "requires": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -32886,6 +33072,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "devOptional": true, "requires": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -33176,6 +33363,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "devOptional": true, "requires": { "safe-buffer": "^5.0.1" } @@ -34027,12 +34215,14 @@ "which-pm-runs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "optional": true }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "devOptional": true, "requires": { "string-width": "^1.0.2 || 2" }, @@ -34040,12 +34230,14 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "devOptional": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "devOptional": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -34055,6 +34247,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "devOptional": true, "requires": { "ansi-regex": "^3.0.0" } @@ -34104,7 +34297,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "devOptional": true }, "write-file-atomic": { "version": "3.0.3", @@ -34188,7 +34382,8 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true }, "yaml": { "version": "1.10.2", diff --git a/package.json b/package.json index 828aad05..5f4a4d41 100644 --- a/package.json +++ b/package.json @@ -11,12 +11,17 @@ "dependencies": { "leaflet.heightgraph": "git+https://easbar@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", "mapbox-gl": "^1.13.0", - "minipass": "2.7.0", + "nosleep.js": "^0.12.0", "react": "^17.0.1", "react-dom": "^17.0.1", - "react-responsive": "^8.2.0", + "react-responsive": "^8.2.0" + }, + "optionalDependencies": { + "fsevents": "1.2.9", + "minipass": "2.7.0", "sharp": "^0.23.0" }, + "_comment": "fsevent,minipass and sharp are locked due to dependency problems with npm ci", "devDependencies": { "@svgr/webpack": "^5.5.0", "@types/mapbox-gl": "^1.13.0", From c2203edb4d5aeb53a74298b6369b671249f18a98 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 11:40:11 +0200 Subject: [PATCH 028/322] try again with old package-lock -> fevents --- package-lock.json | 612 ++++++++++++---------------------------------- package.json | 6 - 2 files changed, 158 insertions(+), 460 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8948bd8f..c4449ef1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,11 +36,6 @@ "webpack-cli": "^4.5.0", "webpack-dev-server": "^3.11.2", "webpack-merge": "^5.7.3" - }, - "optionalDependencies": { - "fsevents": "1.2.9", - "minipass": "2.7.0", - "sharp": "^0.23.0" } }, "node_modules/@babel/code-frame": { @@ -5339,7 +5334,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5379,13 +5374,13 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "devOptional": true + "dev": true }, "node_modules/are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "devOptional": true, + "dev": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -5395,7 +5390,7 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "devOptional": true, + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5410,13 +5405,13 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "devOptional": true + "dev": true }, "node_modules/are-we-there-yet/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "devOptional": true, + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -5887,7 +5882,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "devOptional": true + "dev": true }, "node_modules/batch": { "version": "0.6.1", @@ -5935,7 +5930,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "devOptional": true, + "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -6115,7 +6110,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "devOptional": true, + "dev": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -6339,11 +6334,24 @@ "node": ">=0.10.0" } }, + "node_modules/chokidar/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 4.0" + } + }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "devOptional": true + "dev": true }, "node_modules/chrome-trace-event": { "version": "1.0.2", @@ -6547,7 +6555,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -6575,7 +6583,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^1.9.1", "color-string": "^1.5.4" @@ -6585,7 +6593,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -6594,13 +6602,13 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "devOptional": true + "dev": true }, "node_modules/color-string": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -6732,7 +6740,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "devOptional": true + "dev": true }, "node_modules/content-disposition": { "version": "0.5.3", @@ -6823,7 +6831,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "devOptional": true + "dev": true }, "node_modules/cosmiconfig": { "version": "7.0.0", @@ -7436,7 +7444,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "devOptional": true, + "dev": true, "dependencies": { "mimic-response": "^2.0.0" }, @@ -7462,7 +7470,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=4.0.0" } @@ -7589,7 +7597,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "devOptional": true + "dev": true }, "node_modules/depd": { "version": "1.1.2", @@ -7610,7 +7618,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "devOptional": true, + "dev": true, "bin": { "detect-libc": "bin/detect-libc.js" }, @@ -7824,7 +7832,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "devOptional": true, + "dev": true, "dependencies": { "once": "^1.4.0" } @@ -8262,7 +8270,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6" } @@ -8893,31 +8901,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "devOptional": true - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -8926,24 +8910,16 @@ "dev": true }, "node_modules/fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "bundleDependencies": [ - "node-pre-gyp" - ], - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "hasInstallScript": true, + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, "optional": true, "os": [ "darwin" ], - "dependencies": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, "engines": { - "node": ">=4.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { @@ -8956,7 +8932,7 @@ "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "devOptional": true, + "dev": true, "dependencies": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -8972,7 +8948,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "devOptional": true, + "dev": true, "dependencies": { "number-is-nan": "^1.0.0" }, @@ -8984,7 +8960,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "devOptional": true, + "dev": true, "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -9081,7 +9057,7 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", - "devOptional": true + "dev": true }, "node_modules/gl-matrix": { "version": "3.3.0", @@ -9263,7 +9239,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "devOptional": true + "dev": true }, "node_modules/has-value": { "version": "1.0.0", @@ -9717,7 +9693,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "devOptional": true + "dev": true }, "node_modules/internal-ip": { "version": "4.3.0", @@ -9973,7 +9949,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "devOptional": true, + "dev": true, "engines": { "node": ">=4" } @@ -10168,7 +10144,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "devOptional": true + "dev": true }, "node_modules/isexe": { "version": "2.0.0", @@ -12677,11 +12653,7 @@ } }, "node_modules/leaflet.heightgraph": { - "name": "heightgraph", - "version": "0.0.1", - "resolved": "git+https://easbar@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", - "integrity": "sha512-tLP00wuPdjJnHr8eCvZFIir5yOD7b9Anb3TrfbWDlji925iS5oN3TU9p8exnsn1jtxjO4TXc2X/3LaeznSxP3w==", - "license": "ISC", + "resolved": "git+ssh://git@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", "dependencies": { "d3": "^5.16.0", "d3-selection-multi": "^1.0.1" @@ -13097,7 +13069,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" }, @@ -13137,47 +13109,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "node_modules/minipass": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.7.0.tgz", - "integrity": "sha512-+CbZuJ4uEiuTL9s5Z/ULkuRg1O9AvVqVvceaBrhbYHIy1R3dPO7FMmG0nZLD0//ZzZq0MUOjwdBQvk+w1JHUqQ==", - "optional": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/minipass/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "optional": true - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -13207,7 +13138,7 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "devOptional": true, + "dev": true, "dependencies": { "minimist": "^1.2.5" }, @@ -13219,7 +13150,7 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "devOptional": true + "dev": true }, "node_modules/ms": { "version": "2.1.2", @@ -13251,12 +13182,6 @@ "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=" }, - "node_modules/nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "optional": true - }, "node_modules/nanoid": { "version": "3.1.23", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", @@ -13295,7 +13220,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "devOptional": true + "dev": true }, "node_modules/natural-compare": { "version": "1.4.0", @@ -13350,7 +13275,7 @@ "version": "2.26.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.26.0.tgz", "integrity": "sha512-ag/Vos/mXXpWLLAYWsAoQdgS+gW7IwvgMLOgqopm/DbzAjazLltzgzpVMsFlgmo9TzG5hGXeaBZx2AI731RIsQ==", - "devOptional": true, + "dev": true, "dependencies": { "semver": "^5.4.1" } @@ -13359,7 +13284,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "devOptional": true, + "dev": true, "bin": { "semver": "bin/semver" } @@ -13480,7 +13405,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", - "devOptional": true + "dev": true }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -13533,7 +13458,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "devOptional": true, + "dev": true, "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -13554,7 +13479,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -13992,7 +13917,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "devOptional": true, + "dev": true, "dependencies": { "wrappy": "1" } @@ -14553,35 +14478,6 @@ "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.1.tgz", "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" }, - "node_modules/prebuild-install": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz", - "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -14686,7 +14582,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "devOptional": true + "dev": true }, "node_modules/promise-polyfill": { "version": "8.2.0", @@ -14751,7 +14647,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "devOptional": true, + "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -14851,7 +14747,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "devOptional": true, + "dev": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -15680,7 +15576,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "devOptional": true, + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -15830,7 +15726,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "devOptional": true + "dev": true }, "node_modules/set-value": { "version": "2.0.1", @@ -15882,30 +15778,6 @@ "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" }, - "node_modules/sharp": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.23.4.tgz", - "integrity": "sha512-fJMagt6cT0UDy9XCsgyLi0eiwWWhQRxbwGmqQT6sY8Av4s0SVsT/deg8fobBQCTDU5iXRgz0rAeXoE2LBZ8g+Q==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "color": "^3.1.2", - "detect-libc": "^1.0.3", - "nan": "^2.14.0", - "npmlog": "^4.1.2", - "prebuild-install": "^5.3.3", - "semver": "^6.3.0", - "simple-get": "^3.1.0", - "tar": "^5.0.5", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=8.5.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, "node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -15938,13 +15810,13 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "devOptional": true + "dev": true }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "devOptional": true, + "dev": true, "funding": [ { "type": "github", @@ -15964,7 +15836,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "devOptional": true, + "dev": true, "dependencies": { "decompress-response": "^4.2.0", "once": "^1.3.1", @@ -15975,7 +15847,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "devOptional": true, + "dev": true, "dependencies": { "is-arrayish": "^0.3.1" } @@ -15984,7 +15856,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "devOptional": true + "dev": true }, "node_modules/sisteransi": { "version": "1.0.5", @@ -16561,7 +16433,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "devOptional": true, + "dev": true, "dependencies": { "ansi-regex": "^2.0.0" }, @@ -16600,7 +16472,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -16749,28 +16621,11 @@ "node": ">=6" } }, - "node_modules/tar": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.5.tgz", - "integrity": "sha512-MNIgJddrV2TkuwChwcSNds/5E9VijOiw7kAc1y5hTNJoLDSuIyid2QtLYiCYNnICebpuvjhPQZsXwUL0O3l7OQ==", - "optional": true, - "dependencies": { - "chownr": "^1.1.3", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.0", - "mkdirp": "^0.5.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "devOptional": true, + "dev": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -16782,7 +16637,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "devOptional": true, + "dev": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -16794,18 +16649,6 @@ "node": ">=6" } }, - "node_modules/tar/node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -17165,7 +17008,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "devOptional": true, + "dev": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -18212,17 +18055,11 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "node_modules/which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "optional": true - }, "node_modules/wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "devOptional": true, + "dev": true, "dependencies": { "string-width": "^1.0.2 || 2" } @@ -18231,7 +18068,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "devOptional": true, + "dev": true, "engines": { "node": ">=4" } @@ -18240,7 +18077,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "devOptional": true, + "dev": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -18253,7 +18090,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "devOptional": true, + "dev": true, "dependencies": { "ansi-regex": "^3.0.0" }, @@ -18315,7 +18152,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "devOptional": true + "dev": true }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -18409,7 +18246,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true + "dev": true }, "node_modules/yaml": { "version": "1.10.2", @@ -23543,7 +23380,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "devOptional": true + "dev": true }, "ansi-styles": { "version": "3.2.1", @@ -23574,13 +23411,13 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "devOptional": true + "dev": true }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "devOptional": true, + "dev": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -23590,7 +23427,7 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "devOptional": true, + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -23605,13 +23442,13 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "devOptional": true + "dev": true }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "devOptional": true, + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -24006,7 +23843,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "devOptional": true + "dev": true }, "batch": { "version": "0.6.1", @@ -24045,7 +23882,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "devOptional": true, + "dev": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -24205,7 +24042,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "devOptional": true, + "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -24402,6 +24239,13 @@ } } } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true } } }, @@ -24409,7 +24253,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "devOptional": true + "dev": true }, "chrome-trace-event": { "version": "1.0.2", @@ -24585,7 +24429,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "devOptional": true + "dev": true }, "collect-v8-coverage": { "version": "1.0.1", @@ -24607,7 +24451,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "devOptional": true, + "dev": true, "requires": { "color-convert": "^1.9.1", "color-string": "^1.5.4" @@ -24617,7 +24461,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "devOptional": true, + "dev": true, "requires": { "color-name": "1.1.3" } @@ -24626,13 +24470,13 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "devOptional": true + "dev": true }, "color-string": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "devOptional": true, + "dev": true, "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -24745,7 +24589,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "devOptional": true + "dev": true }, "content-disposition": { "version": "0.5.3", @@ -24827,7 +24671,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "devOptional": true + "dev": true }, "cosmiconfig": { "version": "7.0.0", @@ -25376,7 +25220,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "devOptional": true, + "dev": true, "requires": { "mimic-response": "^2.0.0" } @@ -25399,7 +25243,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "devOptional": true + "dev": true }, "deep-is": { "version": "0.1.3", @@ -25498,7 +25342,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "devOptional": true + "dev": true }, "depd": { "version": "1.1.2", @@ -25516,7 +25360,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "devOptional": true + "dev": true }, "detect-newline": { "version": "3.1.0", @@ -25709,7 +25553,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "devOptional": true, + "dev": true, "requires": { "once": "^1.4.0" } @@ -26070,7 +25914,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "devOptional": true + "dev": true }, "expect": { "version": "26.6.2", @@ -26589,27 +26433,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "devOptional": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "optional": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "optional": true, - "requires": { - "yallist": "^4.0.0" - } - } - } + "dev": true }, "fs.realpath": { "version": "1.0.0", @@ -26618,14 +26442,11 @@ "dev": true }, "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - } + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true }, "function-bind": { "version": "1.1.1", @@ -26637,7 +26458,7 @@ "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "devOptional": true, + "dev": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -26653,7 +26474,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "devOptional": true, + "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -26662,7 +26483,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "devOptional": true, + "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -26743,7 +26564,7 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", - "devOptional": true + "dev": true }, "gl-matrix": { "version": "3.3.0", @@ -26899,7 +26720,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "devOptional": true + "dev": true }, "has-value": { "version": "1.0.0", @@ -27281,7 +27102,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "devOptional": true + "dev": true }, "internal-ip": { "version": "4.3.0", @@ -27480,7 +27301,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "devOptional": true + "dev": true }, "is-function": { "version": "1.0.2", @@ -27626,7 +27447,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "devOptional": true + "dev": true }, "isexe": { "version": "2.0.0", @@ -29619,8 +29440,7 @@ "dev": true }, "leaflet.heightgraph": { - "version": "git+https://easbar@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", - "integrity": "sha512-tLP00wuPdjJnHr8eCvZFIir5yOD7b9Anb3TrfbWDlji925iS5oN3TU9p8exnsn1jtxjO4TXc2X/3LaeznSxP3w==", + "version": "git+ssh://git@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", "from": "leaflet.heightgraph@git+https://easbar@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", "requires": { "d3": "^5.16.0", @@ -29974,7 +29794,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "devOptional": true + "dev": true }, "min-document": { "version": "2.19.0", @@ -30005,45 +29825,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "minipass": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.7.0.tgz", - "integrity": "sha512-+CbZuJ4uEiuTL9s5Z/ULkuRg1O9AvVqVvceaBrhbYHIy1R3dPO7FMmG0nZLD0//ZzZq0MUOjwdBQvk+w1JHUqQ==", - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "optional": true - } - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "optional": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "optional": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -30069,7 +29850,7 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "devOptional": true, + "dev": true, "requires": { "minimist": "^1.2.5" } @@ -30078,7 +29859,7 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "devOptional": true + "dev": true }, "ms": { "version": "2.1.2", @@ -30107,12 +29888,6 @@ "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=" }, - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "optional": true - }, "nanoid": { "version": "3.1.23", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", @@ -30142,7 +29917,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "devOptional": true + "dev": true }, "natural-compare": { "version": "1.4.0", @@ -30196,7 +29971,7 @@ "version": "2.26.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.26.0.tgz", "integrity": "sha512-ag/Vos/mXXpWLLAYWsAoQdgS+gW7IwvgMLOgqopm/DbzAjazLltzgzpVMsFlgmo9TzG5hGXeaBZx2AI731RIsQ==", - "devOptional": true, + "dev": true, "requires": { "semver": "^5.4.1" }, @@ -30205,7 +29980,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "devOptional": true + "dev": true } } }, @@ -30300,7 +30075,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", - "devOptional": true + "dev": true }, "normalize-package-data": { "version": "2.5.0", @@ -30346,7 +30121,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "devOptional": true, + "dev": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -30367,7 +30142,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "devOptional": true + "dev": true }, "nwsapi": { "version": "2.2.0", @@ -30729,7 +30504,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "devOptional": true, + "dev": true, "requires": { "wrappy": "1" } @@ -31187,29 +30962,6 @@ "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.1.tgz", "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" }, - "prebuild-install": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz", - "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==", - "optional": true, - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - } - }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -31292,7 +31044,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "devOptional": true + "dev": true }, "promise-polyfill": { "version": "8.2.0", @@ -31351,7 +31103,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "devOptional": true, + "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -31434,7 +31186,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "devOptional": true, + "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -32134,7 +31886,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "devOptional": true + "dev": true }, "send": { "version": "0.17.1", @@ -32269,7 +32021,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "devOptional": true + "dev": true }, "set-value": { "version": "2.0.1", @@ -32314,23 +32066,6 @@ "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" }, - "sharp": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.23.4.tgz", - "integrity": "sha512-fJMagt6cT0UDy9XCsgyLi0eiwWWhQRxbwGmqQT6sY8Av4s0SVsT/deg8fobBQCTDU5iXRgz0rAeXoE2LBZ8g+Q==", - "optional": true, - "requires": { - "color": "^3.1.2", - "detect-libc": "^1.0.3", - "nan": "^2.14.0", - "npmlog": "^4.1.2", - "prebuild-install": "^5.3.3", - "semver": "^6.3.0", - "simple-get": "^3.1.0", - "tar": "^5.0.5", - "tunnel-agent": "^0.6.0" - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -32357,19 +32092,19 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "devOptional": true + "dev": true }, "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "devOptional": true + "dev": true }, "simple-get": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "devOptional": true, + "dev": true, "requires": { "decompress-response": "^4.2.0", "once": "^1.3.1", @@ -32380,7 +32115,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "devOptional": true, + "dev": true, "requires": { "is-arrayish": "^0.3.1" }, @@ -32389,7 +32124,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "devOptional": true + "dev": true } } }, @@ -32887,7 +32622,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "devOptional": true, + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -32914,7 +32649,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "devOptional": true + "dev": true }, "style-loader": { "version": "2.0.0", @@ -33031,36 +32766,11 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, - "tar": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.5.tgz", - "integrity": "sha512-MNIgJddrV2TkuwChwcSNds/5E9VijOiw7kAc1y5hTNJoLDSuIyid2QtLYiCYNnICebpuvjhPQZsXwUL0O3l7OQ==", - "optional": true, - "requires": { - "chownr": "^1.1.3", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.0", - "mkdirp": "^0.5.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "optional": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, "tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "devOptional": true, + "dev": true, "requires": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -33072,7 +32782,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "devOptional": true, + "dev": true, "requires": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -33363,7 +33073,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "devOptional": true, + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -34212,17 +33922,11 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "optional": true - }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "devOptional": true, + "dev": true, "requires": { "string-width": "^1.0.2 || 2" }, @@ -34231,13 +33935,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "devOptional": true + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "devOptional": true, + "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -34247,7 +33951,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "devOptional": true, + "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -34298,7 +34002,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "devOptional": true + "dev": true }, "write-file-atomic": { "version": "3.0.3", @@ -34383,7 +34087,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true + "dev": true }, "yaml": { "version": "1.10.2", diff --git a/package.json b/package.json index 5f4a4d41..56e5645b 100644 --- a/package.json +++ b/package.json @@ -16,12 +16,6 @@ "react-dom": "^17.0.1", "react-responsive": "^8.2.0" }, - "optionalDependencies": { - "fsevents": "1.2.9", - "minipass": "2.7.0", - "sharp": "^0.23.0" - }, - "_comment": "fsevent,minipass and sharp are locked due to dependency problems with npm ci", "devDependencies": { "@svgr/webpack": "^5.5.0", "@types/mapbox-gl": "^1.13.0", From 38c72c962fba87e53c85e65df65aee1782a1527c Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 11:43:22 +0200 Subject: [PATCH 029/322] removed all incorrect heightgraph occurances in package-lock.json and ran npm install to use this strange https://user notation to force https --- package-lock.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index c4449ef1..bce1c9e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12653,7 +12653,11 @@ } }, "node_modules/leaflet.heightgraph": { - "resolved": "git+ssh://git@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", + "name": "heightgraph", + "version": "0.0.1", + "resolved": "git+https://easbar@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", + "integrity": "sha512-tLP00wuPdjJnHr8eCvZFIir5yOD7b9Anb3TrfbWDlji925iS5oN3TU9p8exnsn1jtxjO4TXc2X/3LaeznSxP3w==", + "license": "ISC", "dependencies": { "d3": "^5.16.0", "d3-selection-multi": "^1.0.1" @@ -29440,7 +29444,8 @@ "dev": true }, "leaflet.heightgraph": { - "version": "git+ssh://git@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", + "version": "git+https://easbar@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", + "integrity": "sha512-tLP00wuPdjJnHr8eCvZFIir5yOD7b9Anb3TrfbWDlji925iS5oN3TU9p8exnsn1jtxjO4TXc2X/3LaeznSxP3w==", "from": "leaflet.heightgraph@git+https://easbar@github.com/easbar/Leaflet.Heightgraph.git#82cff7b3013dd73d7221521c5b404ded6439e050", "requires": { "d3": "^5.16.0", From 28afc2f0c46cfdc6423b6f9d761fa61ee2f9b176 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 21 May 2021 16:16:32 +0200 Subject: [PATCH 030/322] added SpeechSynthesizer --- src/App.tsx | 2 +- src/SpeechSynthesizer.ts | 66 +++++++++++++++++++++++++++ src/index.tsx | 4 +- src/stores/LocationStore.ts | 11 ++++- src/turnNavigation/TurnNavigation.tsx | 8 ++-- 5 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 src/SpeechSynthesizer.ts diff --git a/src/App.tsx b/src/App.tsx index d5c62ba8..22751573 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -83,7 +83,7 @@ export default function App() { />
- +
{ + this.initSound(xhr.response) + } + xhr.send() + } + + private async initSound(blob: any) { + const arrayBuffer = await blob.arrayBuffer() + this.audioCtx.decodeAudioData( + arrayBuffer, + (audioData: any) => { + this.playSound(audioData) + }, + function (e: any) { + console.log('Error decoding file', e) + } + ) + } + + private playSound(audioBuffer: any) { + if (this.source) this.source.stop() + + // this would skip too many stuff + // this.source.onended = (event) => { console.log("sound ENDED"); this.playSoundInProgress = false; } + + // the source needs to be freshly created otherwise we get: Cannot set the buffer attribute of an AudioBufferSourceNode with an AudioBuffer more than once + this.source = this.audioCtx.createBufferSource() + this.source.buffer = audioBuffer + this.source.loop = false + this.source.connect(this.audioCtx.destination) + this.source.start() + } +} diff --git a/src/index.tsx b/src/index.tsx index 859b65f1..656baa83 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -20,7 +20,9 @@ import { ApiImpl } from '@/api/Api' import ErrorStore from '@/stores/ErrorStore' import MapOptionsStore from '@/stores/MapOptionsStore' import LocationStore from '@/stores/LocationStore' +import { SpeechSynthesizer } from './SpeechSynthesizer' +let speechSynthesizer = new SpeechSynthesizer(navigator.language) // set up state management const api = new ApiImpl() const queryStore = new QueryStore(api) @@ -30,7 +32,7 @@ setStores({ infoStore: new ApiInfoStore(), errorStore: new ErrorStore(), mapOptionsStore: new MapOptionsStore(), - locationStore: new LocationStore() + locationStore: new LocationStore(speechSynthesizer) }) // register stores at dispatcher to receive actions diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 070088cb..bd6553d7 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -3,6 +3,7 @@ import Store from '@/stores/Store' import { LocationUpdate } from '@/actions/Actions' import Dispatcher, { Action } from '@/stores/Dispatcher' import NoSleep from 'nosleep.js' +import { SpeechSynthesizer } from '@/SpeechSynthesizer' export interface LocationStoreState { turnNavigation: boolean @@ -13,6 +14,12 @@ export default class LocationStore extends Store { private watchId: any = undefined private interval: any private noSleep: any + private speechSynthesizer: SpeechSynthesizer + + constructor(speechSynthesizer: SpeechSynthesizer) { + super() + this.speechSynthesizer = speechSynthesizer + } protected getInitialState(): LocationStoreState { return { @@ -33,6 +40,8 @@ export default class LocationStore extends Store { // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car public initFake() { + this.speechSynthesizer.synthesize('Unechtes Willkommen!') + // TODO randomize a route const latlon: number[][] = [ [51.439291, 14.245254], @@ -66,7 +75,7 @@ export default class LocationStore extends Store { console.log('location not supported. In firefox I had to set geo.enabled=true in about:config') } else { console.log('location init') - + this.speechSynthesizer.synthesize('Willkommen!') // force calling clearWatch can help to find GPS fix more reliable in android firefox if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index bae2d5d8..b298e8c9 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -6,13 +6,15 @@ import styles from '@/turnNavigation/TurnNavigation.module.css' import { Coordinate } from '@/stores/QueryStore' import endNavigation from '@/turnNavigation/end_turn_navigation.png' import { getLocationStore } from '@/stores/Stores' +import { LocationStoreState } from '@/stores/LocationStore' type TurnNavigationProps = { path: Path - currentLocation: Coordinate + location: LocationStoreState } -export default function ({ path, currentLocation }: TurnNavigationProps) { +export default function ({ path, location }: TurnNavigationProps) { + let currentLocation = location.coordinate if (currentLocation.lat == 0 && currentLocation.lng == 0) return Searching GPS... const { instructionIndex, distanceNext } = getCurrentInstruction(path.instructions, currentLocation) @@ -28,7 +30,7 @@ export default function ({ path, currentLocation }: TurnNavigationProps) { const min = arrivalDate.getMinutes() return ( <> -
+
From fa3aa75b53b4f07a1fe2d979387d6c4eec53db51 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 8 Jul 2021 15:23:22 +0200 Subject: [PATCH 031/322] add CurrentLocationLayer to show it --- src/App.tsx | 4 ++- src/layers/CurrentLocationLayer.tsx | 46 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/layers/CurrentLocationLayer.tsx diff --git a/src/App.tsx b/src/App.tsx index 88c59812..037d4d66 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -29,6 +29,7 @@ import { ViewportStoreState } from '@/stores/ViewportStore' import createPathDetailsLayer from '@/layers/PathDetailsLayer' import createQueryPointsLayer from '@/layers/QueryPointsLayer' import createPathsLayer from '@/layers/PathsLayer' +import createCurrentLocationLayer from '@/layers/CurrentLocationLayer' import { MapLayer } from '@/layers/MapLayer' import { LocationStoreState } from './stores/LocationStore' @@ -77,7 +78,8 @@ export default function App() { const mapLayers: MapLayer[] = [ createQueryPointsLayer(query.queryPoints), - createPathsLayer(route.selectedPath, route.routingResult.paths) + createPathsLayer(route.selectedPath, route.routingResult.paths), + createCurrentLocationLayer(location.coordinate) ] if (!isSmallScreen) mapLayers.push(createPathDetailsLayer(pathDetails)) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx new file mode 100644 index 00000000..c7a54f71 --- /dev/null +++ b/src/layers/CurrentLocationLayer.tsx @@ -0,0 +1,46 @@ +import React from 'react' +import { Coordinate } from '@/stores/QueryStore' + +import { FeatureCollection } from 'geojson' +import { Layer, Source } from 'react-map-gl' +import { MapLayer } from '@/layers/MapLayer' + +// const currentLocationSourceKey = 'currentLocationSource' +const currentLocationLayerKey = 'currentLocationLayer' + +export default function (coordinate: Coordinate): MapLayer { + // console.log("NOW change location on map ", coordinate) + const featureCollection: FeatureCollection = { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + properties: {}, + geometry: { type: 'Point', coordinates: [coordinate.lng, coordinate.lat] } + } + ] + } + + return { + interactiveLayerIds: coordinate.lat === 0 && coordinate.lng == 0 ? [] : [currentLocationLayerKey], + onClick: (feature: any) => { + // select an alternative path if clicked + if (feature.layer.id === currentLocationLayerKey) { + } + }, + layer: ( + + + + ) + } +} From 968182f542b6dff0329ea0d684abe6287497035e Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 8 Jul 2021 17:05:58 +0200 Subject: [PATCH 032/322] show turn navigation panel background properly --- src/App.module.css | 6 +++++ src/App.tsx | 53 ++++++++++++++++++++----------------- src/stores/LocationStore.ts | 2 +- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/App.module.css b/src/App.module.css index 9fad9623..d26a1831 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -45,6 +45,12 @@ grid-row: 1 / span 1; z-index: 5; max-height: 7em; + + margin: 0.5rem; + padding: 0.5rem; + background-color: white; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); + border-radius: 0.5rem; } .mapOptions { diff --git a/src/App.tsx b/src/App.tsx index 037d4d66..668f5a7c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -139,14 +139,14 @@ function LargeScreenLayout({ query, route, location, viewport, mapLayers, error,
-
-
-
{!error.isDismissed && }
- {location.turnNavigation ? ( -
- -
- ) : ( + {location.turnNavigation ? ( +
+ +
+ ) : ( +
+
+
{!error.isDismissed && }
- )} +
-
+ )} +
@@ -196,21 +197,25 @@ function SmallScreenLayout({ query, route, location, viewport, mapLayers, error,
+ ) : ( +
+ +
+ )} + {!location.turnNavigation ? ( +
+ +
+ ) : null} + {!location.turnNavigation ? ( +
+ +
) : null} -
- -
-
- -
- -
- -
) } diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index fe40ee91..f17c0de8 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -51,7 +51,7 @@ export default class LocationStore extends Store { [51.438668, 14.246092], [51.438226, 14.246972], [51.436795, 14.24592], - [51.435029, 14.243259], + [51.435029, 14.243259], // TODO NOW incorrect turn instruction "right" <- still shows previous!? [51.435203, 14.241006], [51.434788, 14.238882], [51.434146, 14.237745], From 33b0dbf36ff01d6cbe11524733ccea6892e8d9c4 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 10 Jul 2021 16:39:15 +0200 Subject: [PATCH 033/322] fix instruction problem when road segment is long and straight --- .prettierrc | 1 - src/api/Api.ts | 4 +- src/stores/LocationStore.ts | 35 ++--- src/turnNavigation/GeoMethods.ts | 129 ++++++++++++++++++ src/turnNavigation/TurnNavigation.tsx | 42 +----- test/turnNavigation/GeoMethods.test.ts | 21 +++ .../turnNavigation/response-hoyerswerda1.json | 77 +++++++++++ 7 files changed, 247 insertions(+), 62 deletions(-) create mode 100644 src/turnNavigation/GeoMethods.ts create mode 100644 test/turnNavigation/GeoMethods.test.ts create mode 100644 test/turnNavigation/response-hoyerswerda1.json diff --git a/.prettierrc b/.prettierrc index c256036b..c52df244 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,7 +2,6 @@ "printWidth": 120, "tabWidth": 4, "singleQuote": true, - "trailingComma": "none", "arrowParens": "avoid", "semi": false } diff --git a/src/api/Api.ts b/src/api/Api.ts index a142e7ae..d906472a 100644 --- a/src/api/Api.ts +++ b/src/api/Api.ts @@ -183,7 +183,7 @@ export class ApiImpl implements Api { } } - private static decodeResult(result: RawResult, is3D: boolean) { + public static decodeResult(result: RawResult, is3D: boolean) { return result.paths .map((path: RawPath) => { return { @@ -275,8 +275,6 @@ export class ApiImpl implements Api { array.push([lng * 1e-5, lat * 1e-5, ele / 100]) } else array.push([lng * 1e-5, lat * 1e-5]) } - // var end = new Date().getTime(); - // console.log("decoded " + len + " coordinates in " + ((end - start) / 1000) + "s"); return array } } diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index f17c0de8..5c312826 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -1,6 +1,6 @@ import { Coordinate } from '@/stores/QueryStore' import Store from '@/stores/Store' -import { LocationUpdate } from '@/actions/Actions' +import { LocationUpdate, SetViewportToPoint } from '@/actions/Actions' import Dispatcher, { Action } from '@/stores/Dispatcher' import NoSleep from 'nosleep.js' import { SpeechSynthesizer } from '@/SpeechSynthesizer' @@ -25,7 +25,7 @@ export default class LocationStore extends Store { protected getInitialState(): LocationStoreState { return { turnNavigation: false, - coordinate: { lat: 0, lng: 0 } + coordinate: { lat: 0, lng: 0 }, } } @@ -33,7 +33,7 @@ export default class LocationStore extends Store { if (action instanceof LocationUpdate) { return { turnNavigation: action.turnNavigation, - coordinate: action.coordinate + coordinate: action.coordinate, } } return state @@ -51,26 +51,31 @@ export default class LocationStore extends Store { [51.438668, 14.246092], [51.438226, 14.246972], [51.436795, 14.24592], - [51.435029, 14.243259], // TODO NOW incorrect turn instruction "right" <- still shows previous!? + [51.435029, 14.243259], [51.435203, 14.241006], [51.434788, 14.238882], [51.434146, 14.237745], [51.433959, 14.235985], - [51.43322, 14.234999] + [51.43322, 14.234999], ] - var currentIndex: number = 0 - - Dispatcher.dispatch(new LocationUpdate({ lat: latlon[currentIndex][0], lng: latlon[currentIndex][1] }, true)) + let currentIndex: number = 0 + this.locationUpdate({ coords: { latitude: latlon[currentIndex][0], longitude: latlon[currentIndex][1] } }) this.interval = setInterval(() => { currentIndex++ currentIndex %= latlon.length - Dispatcher.dispatch( - new LocationUpdate({ lat: latlon[currentIndex][0], lng: latlon[currentIndex][1] }, true) - ) + console.log(currentIndex) + this.locationUpdate({ coords: { latitude: latlon[currentIndex][0], longitude: latlon[currentIndex][1] } }) }, 3000) } + private locationUpdate(pos: any) { + console.log('location success handler') + let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } + Dispatcher.dispatch(new LocationUpdate(c, true)) + Dispatcher.dispatch(new SetViewportToPoint(c, 16)) + } + public initReal() { if (!navigator.geolocation) { console.log('location not supported. In firefox I had to set geo.enabled=true in about:config') @@ -80,13 +85,9 @@ export default class LocationStore extends Store { // force calling clearWatch can help to find GPS fix more reliable in android firefox if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) - var success = (pos: any) => { - console.log('location success handler start') - Dispatcher.dispatch(new LocationUpdate({ lat: pos.coords.latitude, lng: pos.coords.longitude }, true)) - } - var options = { enableHighAccuracy: false, timeout: 5000, maximumAge: 5000 } + let options = { enableHighAccuracy: false, timeout: 5000, maximumAge: 5000 } this.watchId = navigator.geolocation.watchPosition( - success, + this.locationUpdate, function (err) { console.log('location watch error', err) }, diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts new file mode 100644 index 00000000..065638d5 --- /dev/null +++ b/src/turnNavigation/GeoMethods.ts @@ -0,0 +1,129 @@ +import { Instruction } from '@/api/graphhopper' +import { Coordinate } from '@/stores/QueryStore' + +export function getCurrentInstruction( + instructions: Instruction[], + currentLocation: Coordinate +): { instructionIndex: number; distanceNext: number } { + let instructionIndex = -1 + let smallestDist = Number.MAX_VALUE + let distanceNext = 10.0 + // find instruction nearby and very simple method (pick first point) + for (let instrIdx = 0; instrIdx < instructions.length; instrIdx++) { + const points: number[][] = instructions[instrIdx].points + + for (let pIdx = 0; pIdx < points.length; pIdx++) { + const p: number[] = points[pIdx] + let loc = currentLocation + let dist = distCalc(p[1], p[0], loc.lat, loc.lng) + // if not the last point of the instruction we can calulate the snapped point + if (pIdx + 1 < points.length) { + const next: number[] = points[pIdx + 1] + if (validEdgeDistance(loc.lat, loc.lng, p[1], p[0], next[1], next[0])) { + loc = calcCrossingPointToEdge(loc.lat, loc.lng, p[1], p[0], next[1], next[0]) + dist = Math.min(dist, distCalc(loc.lat, loc.lng, currentLocation.lat, currentLocation.lng)) + } + } + + if (dist < smallestDist) { + smallestDist = dist + // use next instruction or finish + instructionIndex = instrIdx + 1 < instructions.length ? instrIdx + 1 : instrIdx + + const last: number[] = points[points.length - 1] + distanceNext = Math.round(distCalc(last[1], last[0], loc.lat, loc.lng)) + } + } + } + return { instructionIndex, distanceNext } +} + +function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: number): number { + const sinDeltaLat: number = Math.sin(toRadians(toLat - fromLat) / 2) + const sinDeltaLon: number = Math.sin(toRadians(toLng - fromLng) / 2) + const normedDist: number = + sinDeltaLat * sinDeltaLat + + sinDeltaLon * sinDeltaLon * Math.cos(toRadians(fromLat)) * Math.cos(toRadians(toLat)) + return 6371000 * 2 * Math.asin(Math.sqrt(normedDist)) +} + +function toRadians(deg: number): number { + return (deg * Math.PI) / 180.0 +} + +function validEdgeDistance( + r_lat_deg: number, + r_lon_deg: number, + a_lat_deg: number, + a_lon_deg: number, + b_lat_deg: number, + b_lon_deg: number +): boolean { + let shrinkFactor = calcShrinkFactor(a_lat_deg, b_lat_deg) + let a_lat = a_lat_deg + let a_lon = a_lon_deg * shrinkFactor + + let b_lat = b_lat_deg + let b_lon = b_lon_deg * shrinkFactor + + let r_lat = r_lat_deg + let r_lon = r_lon_deg * shrinkFactor + + let ar_x = r_lon - a_lon + let ar_y = r_lat - a_lat + let ab_x = b_lon - a_lon + let ab_y = b_lat - a_lat + let ab_ar = ar_x * ab_x + ar_y * ab_y + + let rb_x = b_lon - r_lon + let rb_y = b_lat - r_lat + let ab_rb = rb_x * ab_x + rb_y * ab_y + + // calculate the exact degree alpha(ar, ab) and beta(rb,ab) if it is case 1 then both angles are <= 90° + // double ab_ar_norm = Math.sqrt(ar_x * ar_x + ar_y * ar_y) * Math.sqrt(ab_x * ab_x + ab_y * ab_y); + // double ab_rb_norm = Math.sqrt(rb_x * rb_x + rb_y * rb_y) * Math.sqrt(ab_x * ab_x + ab_y * ab_y); + // return Math.acos(ab_ar / ab_ar_norm) <= Math.PI / 2 && Math.acos(ab_rb / ab_rb_norm) <= Math.PI / 2; + return ab_ar > 0 && ab_rb > 0 +} + +function calcShrinkFactor(a_lat_deg: number, b_lat_deg: number): number { + return Math.cos(toRadians((a_lat_deg + b_lat_deg) / 2)) +} + +function calcCrossingPointToEdge( + r_lat_deg: number, + r_lon_deg: number, + a_lat_deg: number, + a_lon_deg: number, + b_lat_deg: number, + b_lon_deg: number +) { + let shrinkFactor = calcShrinkFactor(a_lat_deg, b_lat_deg) + let a_lat = a_lat_deg + let a_lon = a_lon_deg * shrinkFactor + + let b_lat = b_lat_deg + let b_lon = b_lon_deg * shrinkFactor + + let r_lat = r_lat_deg + let r_lon = r_lon_deg * shrinkFactor + + let delta_lon = b_lon - a_lon + let delta_lat = b_lat - a_lat + + if (delta_lat == 0) + // special case: horizontal edge + return { lat: a_lat_deg, lng: r_lon_deg } + + if (delta_lon == 0) + // special case: vertical edge + return { lat: r_lat_deg, lng: a_lon_deg } + + let norm = delta_lon * delta_lon + delta_lat * delta_lat + let factor = ((r_lon - a_lon) * delta_lon + (r_lat - a_lat) * delta_lat) / norm + + // x,y is projection of r onto segment a-b + let c_lon = a_lon + factor * delta_lon + let c_lat = a_lat + factor * delta_lat + return { lat: c_lat, lng: c_lon / shrinkFactor } +} diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index b298e8c9..8b71f944 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -2,8 +2,8 @@ import React from 'react' import { Path, Instruction } from '@/api/graphhopper' import { metersToText, milliSecondsToText } from '@/Converters' import { getSignName } from '@/sidebar/instructions/Instructions' +import { getCurrentInstruction } from './GeoMethods' import styles from '@/turnNavigation/TurnNavigation.module.css' -import { Coordinate } from '@/stores/QueryStore' import endNavigation from '@/turnNavigation/end_turn_navigation.png' import { getLocationStore } from '@/stores/Stores' import { LocationStoreState } from '@/stores/LocationStore' @@ -54,43 +54,3 @@ export default function ({ path, location }: TurnNavigationProps) { ) } - -function getCurrentInstruction( - instructions: Instruction[], - currentLocation: Coordinate -): { instructionIndex: number; distanceNext: number } { - var instructionIndex = -1 - var smallestDist = Number.MAX_VALUE - var distanceNext = 10.0 - // find instruction nearby and very simple method (pick first point) - for (var instrIdx = 0; instrIdx < instructions.length; instrIdx++) { - const points: number[][] = instructions[instrIdx].points - - for (var pIdx = 0; pIdx < points.length; pIdx++) { - const p: number[] = points[pIdx] - const dist = distCalc(p[1], p[0], currentLocation.lat, currentLocation.lng) - if (dist < smallestDist) { - smallestDist = dist - // use next instruction or finish - instructionIndex = instrIdx + 1 < instructions.length ? instrIdx + 1 : instrIdx - - const last: number[] = points[points.length - 1] - distanceNext = Math.round(distCalc(last[1], last[0], currentLocation.lat, currentLocation.lng)) - } - } - } - return { instructionIndex, distanceNext } -} - -function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: number): number { - const sinDeltaLat: number = Math.sin(toRadians(toLat - fromLat) / 2) - const sinDeltaLon: number = Math.sin(toRadians(toLng - fromLng) / 2) - const normedDist: number = - sinDeltaLat * sinDeltaLat + - sinDeltaLon * sinDeltaLon * Math.cos(toRadians(fromLat)) * Math.cos(toRadians(toLat)) - return 6371000 * 2 * Math.asin(Math.sqrt(normedDist)) -} - -function toRadians(deg: number): number { - return (deg * Math.PI) / 180.0 -} diff --git a/test/turnNavigation/GeoMethods.test.ts b/test/turnNavigation/GeoMethods.test.ts new file mode 100644 index 00000000..5d313695 --- /dev/null +++ b/test/turnNavigation/GeoMethods.test.ts @@ -0,0 +1,21 @@ +import { getCurrentInstruction } from '../../src/turnNavigation/GeoMethods' +import Dispatcher from '../../src/stores/Dispatcher' +import { ApiImpl } from '../../src/api/Api' + +let responseHoyerswerda1 = require('./response-hoyerswerda1.json') + +afterEach(() => Dispatcher.clear()) + +describe('calculate instruction', () => { + // http://localhost:3000/?point=51.437233%2C14.246489&point=51.435514%2C14.239923&profile=car + it('second instruction should not be "right turn"', () => { + let path = ApiImpl.decodeResult(responseHoyerswerda1, true)[0] + const { instructionIndex, distanceNext } = getCurrentInstruction(path.instructions, { + lat: 51.435029, + lng: 14.243259, + }) + + expect(distanceNext).toEqual(236) + expect(path.instructions[instructionIndex].text).toEqual('Ziel erreicht') + }) +}) diff --git a/test/turnNavigation/response-hoyerswerda1.json b/test/turnNavigation/response-hoyerswerda1.json new file mode 100644 index 00000000..feb0c9c4 --- /dev/null +++ b/test/turnNavigation/response-hoyerswerda1.json @@ -0,0 +1,77 @@ +{ + "hints": { + "visited_nodes.sum": 32, + "visited_nodes.average": 32 + }, + "info": { + "copyrights": ["GraphHopper", "OpenStreetMap contributors"], + "took": 3 + }, + "paths": [ + { + "distance": 592.059, + "weight": 113.150171, + "time": 104263, + "transfers": 0, + "points_encoded": true, + "bbox": [14.239917, 51.43518, 14.246426, 51.437275], + "points": "}i}xHco}uA_gVRb@e@P\\c@`AnBkBfAnC|C^d@vBdDlA|Dj@@\\g@|OyJO~HnC", + "instructions": [ + { + "distance": 291.902, + "heading": 227.3, + "sign": 0, + "interval": [0, 7], + "text": "Dem Straßenverlauf von Fischerstraße folgen", + "time": 65675, + "street_name": "Fischerstraße" + }, + { + "distance": 300.157, + "sign": 2, + "interval": [7, 9], + "text": "Rechts abbiegen auf Salomon-Gottlob-Frentzel-Straße", + "time": 38588, + "street_name": "Salomon-Gottlob-Frentzel-Straße" + }, + { + "distance": 0, + "sign": 4, + "last_heading": 274.4983500692261, + "interval": [9, 9], + "text": "Ziel erreicht", + "time": 0, + "street_name": "" + } + ], + "legs": [], + "details": { + "surface": [ + [0, 3, "missing"], + [3, 7, "cobblestone"], + [7, 9, "missing"] + ], + "road_environment": [ + [0, 1, "road"], + [1, 2, "bridge"], + [2, 9, "road"] + ], + "max_speed": [ + [0, 7, 30], + [7, 9, null] + ], + "road_class": [ + [0, 7, "residential"], + [7, 9, "tertiary"] + ], + "average_speed": [ + [0, 7, 16], + [7, 9, 28] + ] + }, + "ascend": 2.881000518798828, + "descend": 3.296001434326172, + "snapped_waypoints": "}i}xHco}uA_gVhJtg@pA" + } + ] +} From da6bfd78bf41af81921c61eec275f726f0dd95d4 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 10 Jul 2021 16:48:37 +0200 Subject: [PATCH 034/322] init real --- src/sidebar/RoutingResults.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 05cde9dc..2e5f7831 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -45,7 +45,7 @@ function RoutingResult({ path, isSelected }: { path: Path; isSelected: boolean } {metersToText(path.distance)}
- getLocationStore().initFake()} src={startNavigation} /> + getLocationStore().initReal()} src={startNavigation} />
{isSelected && ( setExpanded(!isExpanded)}> From 8ee0f97faaa5cb290aa4540198b303c6aca2204d Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 11 Jul 2021 00:12:58 +0200 Subject: [PATCH 035/322] NoSleep goes to sleep after 5 minutes. Try something else --- src/stores/LocationStore.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 5c312826..b4632969 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -14,7 +14,7 @@ export interface LocationStoreState { export default class LocationStore extends Store { private watchId: any = undefined private interval: any - private noSleep: any + private noSleep = new NoSleep() private speechSynthesizer: SpeechSynthesizer constructor(speechSynthesizer: SpeechSynthesizer) { @@ -77,6 +77,7 @@ export default class LocationStore extends Store { } public initReal() { + this.noSleep.enable() if (!navigator.geolocation) { console.log('location not supported. In firefox I had to set geo.enabled=true in about:config') } else { @@ -94,9 +95,6 @@ export default class LocationStore extends Store { options ) } - - if (!this.noSleep) this.noSleep = new NoSleep() - this.noSleep.enable() } public stop() { @@ -107,7 +105,7 @@ export default class LocationStore extends Store { // directly writing the state does not work: this.state.turnNavigation = false Dispatcher.dispatch(new LocationUpdate({ lat: 0, lng: 0 }, false)) - if (!this.noSleep) this.noSleep.disable() + this.noSleep.disable() console.log('stopped location updates ' + this.watchId + ', ' + this.interval) } From 3385138b8f0c38a811fbf6cf79351aa20c02b8e2 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 11 Jul 2021 00:18:07 +0200 Subject: [PATCH 036/322] do not show current location if 0,0 --- src/App.tsx | 5 +++-- src/layers/CurrentLocationLayer.tsx | 11 +++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 668f5a7c..9d6f3bb6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -9,7 +9,7 @@ import { getQueryStore, getRouteStore, getViewportStore, - getLocationStore + getLocationStore, } from '@/stores/Stores' import TurnNavigation from '@/turnNavigation/TurnNavigation' import MapComponent from '@/map/Map' @@ -79,8 +79,9 @@ export default function App() { const mapLayers: MapLayer[] = [ createQueryPointsLayer(query.queryPoints), createPathsLayer(route.selectedPath, route.routingResult.paths), - createCurrentLocationLayer(location.coordinate) ] + if (location.coordinate.lat != 0 && location.coordinate.lng != 0) + mapLayers.push(createCurrentLocationLayer(location.coordinate)) if (!isSmallScreen) mapLayers.push(createPathDetailsLayer(pathDetails)) return ( diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index c7a54f71..ceb55a86 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -9,16 +9,15 @@ import { MapLayer } from '@/layers/MapLayer' const currentLocationLayerKey = 'currentLocationLayer' export default function (coordinate: Coordinate): MapLayer { - // console.log("NOW change location on map ", coordinate) const featureCollection: FeatureCollection = { type: 'FeatureCollection', features: [ { type: 'Feature', properties: {}, - geometry: { type: 'Point', coordinates: [coordinate.lng, coordinate.lat] } - } - ] + geometry: { type: 'Point', coordinates: [coordinate.lng, coordinate.lat] }, + }, + ], } return { @@ -37,10 +36,10 @@ export default function (coordinate: Coordinate): MapLayer { 'circle-color': '#385af5', 'circle-radius': 8, 'circle-stroke-color': 'white', - 'circle-stroke-width': 4 + 'circle-stroke-width': 4, }} /> - ) + ), } } From fe940807e7f9d7db08b8205c418a3a0faa1b54a0 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 11 Jul 2021 00:31:49 +0200 Subject: [PATCH 037/322] revert NoSleep change --- src/layers/CurrentLocationLayer.tsx | 8 ++------ src/stores/LocationStore.ts | 5 +++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index ceb55a86..8a8ea682 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -21,12 +21,8 @@ export default function (coordinate: Coordinate): MapLayer { } return { - interactiveLayerIds: coordinate.lat === 0 && coordinate.lng == 0 ? [] : [currentLocationLayerKey], - onClick: (feature: any) => { - // select an alternative path if clicked - if (feature.layer.id === currentLocationLayerKey) { - } - }, + interactiveLayerIds: [currentLocationLayerKey], + onClick: (feature: any) => {}, layer: ( { private watchId: any = undefined private interval: any - private noSleep = new NoSleep() + private noSleep: any private speechSynthesizer: SpeechSynthesizer constructor(speechSynthesizer: SpeechSynthesizer) { @@ -77,6 +77,7 @@ export default class LocationStore extends Store { } public initReal() { + if (!this.noSleep) this.noSleep = new NoSleep() this.noSleep.enable() if (!navigator.geolocation) { console.log('location not supported. In firefox I had to set geo.enabled=true in about:config') @@ -105,7 +106,7 @@ export default class LocationStore extends Store { // directly writing the state does not work: this.state.turnNavigation = false Dispatcher.dispatch(new LocationUpdate({ lat: 0, lng: 0 }, false)) - this.noSleep.disable() + if (this.noSleep) this.noSleep.disable() console.log('stopped location updates ' + this.watchId + ', ' + this.interval) } From aa7f6d23d3c881983c4f6f13db7606f2efcf3abf Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 12 Jul 2021 10:19:04 +0200 Subject: [PATCH 038/322] reduce jitter a bit for updating current location --- src/stores/ViewportStore.ts | 19 +++++++++++++------ src/turnNavigation/GeoMethods.ts | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/stores/ViewportStore.ts b/src/stores/ViewportStore.ts index 107e366d..f359736b 100644 --- a/src/stores/ViewportStore.ts +++ b/src/stores/ViewportStore.ts @@ -1,4 +1,5 @@ import Store from '@/stores/Store' +import { distCalc } from '@/turnNavigation/GeoMethods' import { Action } from '@/stores/Dispatcher' import { InfoReceived, @@ -56,12 +57,18 @@ export default class ViewportStore extends Store { if (action instanceof SetViewport) { return action.viewport } else if (action instanceof SetViewportToPoint) { - return { - ...state, - longitude: action.coordinate.lng, - latitude: action.coordinate.lat, - zoom: action.zoom, - } + let newCoord = action.coordinate + if ( + action.zoom != state.zoom || + // avoid jitter a bit if location is permanently updated + distCalc(newCoord.lat, newCoord.lng, state.latitude, state.longitude) > 5 + ) + return { + ...state, + longitude: newCoord.lng, + latitude: newCoord.lat, + zoom: action.zoom, + } } else if (action instanceof InfoReceived) { return calculateLatLngFromBbox(state, action.result.bbox, isSmallScreen) } else if (action instanceof RouteRequestSuccess) { diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 065638d5..82a24461 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -38,7 +38,7 @@ export function getCurrentInstruction( return { instructionIndex, distanceNext } } -function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: number): number { +export function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: number): number { const sinDeltaLat: number = Math.sin(toRadians(toLat - fromLat) / 2) const sinDeltaLon: number = Math.sin(toRadians(toLng - fromLng) / 2) const normedDist: number = From d7dc35089d4c93fc377b716b2c1faad6c9c123d9 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 21 Aug 2021 14:36:28 +0200 Subject: [PATCH 039/322] initial version --- src/Converters.ts | 31 ++-- src/sidebar/search/AddressInput.tsx | 28 +++- src/sidebar/search/GeocodingResult.module.css | 18 ++- src/sidebar/search/GeocodingResult.tsx | 17 ++- src/sidebar/search/current-location.svg | 1 + src/translation/tr.json | 136 ++++++++++++------ 6 files changed, 160 insertions(+), 71 deletions(-) create mode 100644 src/sidebar/search/current-location.svg diff --git a/src/Converters.ts b/src/Converters.ts index 3e80248c..fdaa4031 100644 --- a/src/Converters.ts +++ b/src/Converters.ts @@ -18,33 +18,32 @@ export function metersToText(meters: number) { } export function convertToQueryText(hit: GeocodingHit) { - let result = convertToName(hit, ', ') - result += convertToStreet(hit, ', ') - result += convertToCity(hit, ', ') - result += convertToCountry(hit) - + let result = convertToName(hit) + result += convertToStreet(hit, result.length > 0 ? ', ' : '') + result += convertToCity(hit, result.length > 0 ? ', ' : '') + result += convertToCountry(hit, result.length > 0 ? ', ' : '') return result } -function convertToName(hit: GeocodingHit, appendix: string) { - return hit.name === hit.street ? '' : hit.name + appendix +function convertToName(hit: GeocodingHit) { + return hit.name === hit.street ? '' : hit.name } -function convertToStreet(hit: GeocodingHit, appendix: string) { - if (hit.housenumber && hit.street) return hit.street + ' ' + hit.housenumber + appendix - if (hit.street) return hit.street + appendix +function convertToStreet(hit: GeocodingHit, prefix: string) { + if (hit.housenumber && hit.street) return (prefix.length > 0 ? prefix : '') + hit.street + ' ' + hit.housenumber + if (hit.street) return (prefix.length > 0 ? prefix : '') + hit.street return '' } -function convertToCity(hit: GeocodingHit, appendix: string) { - if (hit.city && hit.postcode) return hit.postcode + ' ' + hit.city + appendix - if (hit.city) return hit.city + appendix - if (hit.postcode) return hit.postcode + appendix +function convertToCity(hit: GeocodingHit, prefix: string) { + if (hit.city && hit.postcode) return (prefix.length > 0 ? prefix : '') + hit.postcode + ' ' + hit.city + if (hit.city) return (prefix.length > 0 ? prefix : '') + hit.city + if (hit.postcode) return (prefix.length > 0 ? prefix : '') + hit.postcode return '' } -function convertToCountry(hit: GeocodingHit) { - return hit.country ? hit.country : '' +function convertToCountry(hit: GeocodingHit, prefix: string) { + return hit.country ? (prefix.length > 0 ? prefix : '') + hit.country : '' } export function coordinateToText(coord: Coordinate): string { diff --git a/src/sidebar/search/AddressInput.tsx b/src/sidebar/search/AddressInput.tsx index ec3b48de..e53cd875 100644 --- a/src/sidebar/search/AddressInput.tsx +++ b/src/sidebar/search/AddressInput.tsx @@ -1,7 +1,9 @@ import React, { useCallback, useEffect, useRef, useState } from 'react' import { QueryPoint, QueryPointType } from '@/stores/QueryStore' import { GeocodingHit } from '@/api/graphhopper' +import { ErrorAction } from '@/actions/Actions' import GeocodingResult from '@/sidebar/search/GeocodingResult' +import Dispatcher from '@/stores/Dispatcher' import styles from './AddressInput.module.css' import { ApiImpl } from '@/api/Api' @@ -62,6 +64,12 @@ export default function AddressInput(props: AddressInputProps) { const [hasFocus, setHasFocus] = useState(false) const containerClass = hasFocus ? styles.container + ' ' + styles.fullscreen : styles.container const type = props.point.type + if (hasFocus && text.length == 0 && geocodingResults.length == 0) + geocodingResults.push({ + osm_id: 'current_location', // required for react (for the "key" attribute of the list) + name: tr('current_location'), + osm_type: 'current_location', // required to internally identify the special geocoding result + } as GeocodingHit) return (
@@ -99,9 +107,25 @@ export default function AddressInput(props: AddressInputProps) { hits={geocodingResults} highlightedHit={geocodingResults[highlightedResult]} onSelectHit={hit => { - // it seems like the order of the following two statments is important... + // it seems like the order of the blur and onAddressSelected statement is important... searchInput.current!.blur() - props.onAddressSelected(hit) + if (hit.osm_type === 'current_location') { + if (!navigator.geolocation) throw new Error('Cannot get current location') + navigator.geolocation.getCurrentPosition( + position => { + props.onAddressSelected({ + ...hit, + point: { lat: position.coords.latitude, lng: position.coords.longitude }, + }) + }, + () => { + Dispatcher.dispatch(new ErrorAction('Cannot get current location')) + }, + { timeout: 15000 } + ) + } else { + props.onAddressSelected(hit) + } }} />
diff --git a/src/sidebar/search/GeocodingResult.module.css b/src/sidebar/search/GeocodingResult.module.css index 038fe7ea..3f4cc9e9 100644 --- a/src/sidebar/search/GeocodingResult.module.css +++ b/src/sidebar/search/GeocodingResult.module.css @@ -1,6 +1,3 @@ -.geocodingList { -} - .geocodingListItem:not(:last-child) { border-bottom: 1px lightgray solid; } @@ -27,6 +24,21 @@ background-color: #c6c6c6; } +.currentLocationEntry { + display: flex; + flex-direction: row; + text-align: start; + margin: 0.5rem 0.5rem; +} + +.currentLocationIcon { + padding-right: 0.2em; +} + +.currentLocationHide { + display: none; +} + .geocodingEntry { display: flex; flex-direction: column; diff --git a/src/sidebar/search/GeocodingResult.tsx b/src/sidebar/search/GeocodingResult.tsx index 7131f496..a93cc1eb 100644 --- a/src/sidebar/search/GeocodingResult.tsx +++ b/src/sidebar/search/GeocodingResult.tsx @@ -1,6 +1,8 @@ import { GeocodingHit } from '@/api/graphhopper' +import PlainButton from '@/PlainButton' import styles from './GeocodingResult.module.css' import React, { useState } from 'react' +import CurrentLocationIcon from './current-location.svg' export default function GeocodingResult({ hits, @@ -59,10 +61,17 @@ const GeocodingEntry = ({ e.preventDefault() }} > -
- {convertToMainText(entry)} - {convertToSecondaryText(entry)} -
+ {entry.osm_type === 'current_location' ? ( +
+ + {convertToMainText(entry)} +
+ ) : ( +
+ {convertToMainText(entry)} + {convertToSecondaryText(entry)} +
+ )} ) diff --git a/src/sidebar/search/current-location.svg b/src/sidebar/search/current-location.svg new file mode 100644 index 00000000..579d631e --- /dev/null +++ b/src/sidebar/search/current-location.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/translation/tr.json b/src/translation/tr.json index 037a7af3..4be12d50 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -38,7 +38,8 @@ "zoom_out":"Zoom out", "drag_to_reorder":"Drag to reorder", "route_timed_out":"Route calculation timed out", -"route_request_failed":"Route request failed" +"route_request_failed":"Route request failed", +"current_location":"Current Location" }, "ar":{ "search_button":"ابحث", @@ -80,7 +81,8 @@ "zoom_out":"تصغير", "drag_to_reorder":"اسحب لاعادة الترتيب", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "ast":{ "search_button":"Buscar", @@ -122,7 +124,8 @@ "zoom_out":"Alloñar", "drag_to_reorder":"Abasnar pa cambiar l'orde", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "bg":{ "search_button":"Търсене", @@ -164,7 +167,8 @@ "zoom_out":"", "drag_to_reorder":"", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "bn_BN":{ "search_button":"", @@ -206,7 +210,8 @@ "zoom_out":"", "drag_to_reorder":"", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "ca":{ "search_button":"Cerca", @@ -247,8 +252,9 @@ "zoom_in":"Apropa", "zoom_out":"Allunya", "drag_to_reorder":"Arrossega per canviar l'ordre", -"route_timed_out":"", -"route_request_failed":"" +"route_timed_out":"S'ha esgotat el temps de càlcul de la ruta", +"route_request_failed":"Ha fallat la resolució de la ruta.", +"current_location":"" }, "cs_CZ":{ "search_button":"Vyhledat", @@ -290,7 +296,8 @@ "zoom_out":"Oddálit", "drag_to_reorder":"Přetažením změníte pořadí", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "da_DK":{ "search_button":"Søg", @@ -332,7 +339,8 @@ "zoom_out":"Zoom ud", "drag_to_reorder":"Træk for at ændre rækkefølgen", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "de_DE":{ "search_button":"Suche", @@ -374,7 +382,8 @@ "zoom_out":"Verkleinern", "drag_to_reorder":"Zum Ändern der Reihenfolge ziehen", "route_timed_out":"Zeitlimit für Routenberechnung überschritten", -"route_request_failed":"Route konnte nicht berechnet werden" +"route_request_failed":"Route konnte nicht berechnet werden", +"current_location":"Aktueller Standort" }, "el":{ "search_button":"Αναζήτηση", @@ -416,7 +425,8 @@ "zoom_out":"Σμίκρυνση", "drag_to_reorder":"Σύρετε για αναδιάταξη", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "eo":{ "search_button":"Serĉi", @@ -458,7 +468,8 @@ "zoom_out":"Malgrandigi", "drag_to_reorder":"Trenu por reordigi", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "es":{ "search_button":"Buscar", @@ -499,8 +510,9 @@ "zoom_in":"Acercar", "zoom_out":"Alejar", "drag_to_reorder":"Arrastra para cambiar el orden", -"route_timed_out":"", -"route_request_failed":"" +"route_timed_out":"Se ha agotado el tiempo de cálculo de la ruta", +"route_request_failed":"Solicitud de ruta fallida", +"current_location":"" }, "fa":{ "search_button":"جست‌وجو", @@ -542,7 +554,8 @@ "zoom_out":"کوچک‌نمایی", "drag_to_reorder":"برای مرتب‌سازی جابه‌جا کنید", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "fil":{ "search_button":"Paghahanap", @@ -584,7 +597,8 @@ "zoom_out":"", "drag_to_reorder":"", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "fi":{ "search_button":"Etsi", @@ -626,7 +640,8 @@ "zoom_out":"", "drag_to_reorder":"", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "fr_FR":{ "search_button":"Rechercher", @@ -668,7 +683,8 @@ "zoom_out":"Zoom arrière", "drag_to_reorder":"Faire glisser pour réorganiser", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "fr_CH":{ "search_button":"Rechercher", @@ -710,7 +726,8 @@ "zoom_out":"Zoom arrière", "drag_to_reorder":"Faire glisser pour réorganiser", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "gl":{ "search_button":"buscar", @@ -752,7 +769,8 @@ "zoom_out":"", "drag_to_reorder":"", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "he":{ "search_button":"חיפוש", @@ -794,7 +812,8 @@ "zoom_out":"התרחקות", "drag_to_reorder":"יש לגרור כדי לסדר מחדש", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "hr_HR":{ "search_button":"Pretraži", @@ -836,7 +855,8 @@ "zoom_out":"", "drag_to_reorder":"", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "hsb":{ "search_button":"pytaj", @@ -878,7 +898,8 @@ "zoom_out":"", "drag_to_reorder":"", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "hu_HU":{ "search_button":"Keresés", @@ -920,7 +941,8 @@ "zoom_out":"Kicsinyítés", "drag_to_reorder":"Húzza el az átrendezéshez", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "in_ID":{ "search_button":"pencarian", @@ -962,7 +984,8 @@ "zoom_out":"Pengecilan", "drag_to_reorder":"Drag untuk mengatur urutan", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "it":{ "search_button":"Ricerca", @@ -1004,7 +1027,8 @@ "zoom_out":"Zoom indietro", "drag_to_reorder":"Trascina per riordinare", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "ja":{ "search_button":"検索", @@ -1046,7 +1070,8 @@ "zoom_out":"縮小", "drag_to_reorder":"", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "ko":{ "search_button":"탐색", @@ -1088,7 +1113,8 @@ "zoom_out":"축소", "drag_to_reorder":"드래그하여 재정렬", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "lt_LT":{ "search_button":"Ieškoti", @@ -1130,7 +1156,8 @@ "zoom_out":"Atitolinti", "drag_to_reorder":"Tempkite, kad pakeistumėte eilės tvarką", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "ne":{ "search_button":"खोज ", @@ -1172,7 +1199,8 @@ "zoom_out":"", "drag_to_reorder":"", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "nl":{ "search_button":"zoek", @@ -1214,7 +1242,8 @@ "zoom_out":"Zoom uit", "drag_to_reorder":"Slepen om opnieuw te organiseren", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "pl_PL":{ "search_button":"Szukaj", @@ -1256,7 +1285,8 @@ "zoom_out":"Oddal", "drag_to_reorder":"Przeciągnij, aby przestawić", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "pt_BR":{ "search_button":"Pesquisar", @@ -1298,7 +1328,8 @@ "zoom_out":"Reduzir zoom", "drag_to_reorder":"Arraste para reordenar", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "pt_PT":{ "search_button":"Pesquisar", @@ -1340,7 +1371,8 @@ "zoom_out":"", "drag_to_reorder":"", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "ro":{ "search_button":"Caută", @@ -1382,7 +1414,8 @@ "zoom_out":"Micșorează", "drag_to_reorder":"", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "ru":{ "search_button":"Поиск", @@ -1424,7 +1457,8 @@ "zoom_out":"Отдалить", "drag_to_reorder":"Переместите путевую точку", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "sk":{ "search_button":"Vyhľadať", @@ -1466,7 +1500,8 @@ "zoom_out":"Oddialiť", "drag_to_reorder":"Ťahaj pre zmenu poradia", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "sl_SI":{ "search_button":"Išči", @@ -1508,7 +1543,8 @@ "zoom_out":"Pomanjšaj", "drag_to_reorder":"Povlecite za spremembo vrstnega reda", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "sr_RS":{ "search_button":"Pretraži", @@ -1550,7 +1586,8 @@ "zoom_out":"", "drag_to_reorder":"", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "sv_SE":{ "search_button":"Sök", @@ -1592,7 +1629,8 @@ "zoom_out":"Zooma ut", "drag_to_reorder":"Dra för att ändra ordning", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "tr":{ "search_button":"Ara", @@ -1634,7 +1672,8 @@ "zoom_out":"Uzaklaştır ", "drag_to_reorder":"Yeniden sıralamak için sürükle bırak", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "uk":{ "search_button":"Пошук", @@ -1676,7 +1715,8 @@ "zoom_out":"Віддалити", "drag_to_reorder":"Перемістіть шляхову точку", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "vi_VN":{ "search_button":"Tìm", @@ -1718,7 +1758,8 @@ "zoom_out":"Thu nhỏ", "drag_to_reorder":"Kéo để sắp xếp lại", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "zh_CN":{ "search_button":"搜索", @@ -1760,7 +1801,8 @@ "zoom_out":"缩小", "drag_to_reorder":"拖动可重新排序", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "zh_HK":{ "search_button":"搜尋", @@ -1802,7 +1844,8 @@ "zoom_out":"縮小", "drag_to_reorder":"", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }, "zh_TW":{ "search_button":"搜尋", @@ -1844,5 +1887,6 @@ "zoom_out":"縮小", "drag_to_reorder":"拖曳排序", "route_timed_out":"", -"route_request_failed":"" +"route_request_failed":"", +"current_location":"" }} \ No newline at end of file From ba247e58002c772639d99ad8300a36bfa4490922 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 21 Aug 2021 16:24:10 +0200 Subject: [PATCH 040/322] svg was taken from google fonts --- NOTICE.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NOTICE.md b/NOTICE.md index 65e64f21..4d89caa2 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -3,3 +3,8 @@ GraphHopper Maps licensed under the Apache license, Version 2.0 Copyright 2020 - 2021 GraphHopper GmbH + +It includes the following software and creative work: + + * see package.json for the direct dependencies + * "my location" image from Google Fonts - Apache License 2.0 \ No newline at end of file From 56790884caeeca41457d9f95b8ae7d49bda407ca Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 21 Aug 2021 16:44:24 +0200 Subject: [PATCH 041/322] make pure keyboard selection working - at least if location retrieval was accepted before --- src/sidebar/search/AddressInput.tsx | 43 ++++++++++++++++------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/sidebar/search/AddressInput.tsx b/src/sidebar/search/AddressInput.tsx index e53cd875..1e8195f4 100644 --- a/src/sidebar/search/AddressInput.tsx +++ b/src/sidebar/search/AddressInput.tsx @@ -51,9 +51,10 @@ export default function AddressInput(props: AddressInputProps) { case 'Tab': // by default use the first result, otherwise the highlighted one const index = highlightedResult >= 0 ? highlightedResult : 0 - // it seems like the order of the following two statments is important... + + // it seems like the order of the blur and onAddressSelected statement is important... searchInput.current!.blur() - props.onAddressSelected(geocodingResults[index]) + selectHit(props, geocodingResults[index]) break } }, @@ -109,23 +110,7 @@ export default function AddressInput(props: AddressInputProps) { onSelectHit={hit => { // it seems like the order of the blur and onAddressSelected statement is important... searchInput.current!.blur() - if (hit.osm_type === 'current_location') { - if (!navigator.geolocation) throw new Error('Cannot get current location') - navigator.geolocation.getCurrentPosition( - position => { - props.onAddressSelected({ - ...hit, - point: { lat: position.coords.latitude, lng: position.coords.longitude }, - }) - }, - () => { - Dispatcher.dispatch(new ErrorAction('Cannot get current location')) - }, - { timeout: 15000 } - ) - } else { - props.onAddressSelected(hit) - } + selectHit(props, hit) }} />
@@ -134,6 +119,26 @@ export default function AddressInput(props: AddressInputProps) { ) } +function selectHit(props: AddressInputProps, hit: GeocodingHit) { + if (hit.osm_type === 'current_location') { + if (!navigator.geolocation) throw new Error('Cannot get current location') + navigator.geolocation.getCurrentPosition( + position => { + props.onAddressSelected({ + ...hit, + point: { lat: position.coords.latitude, lng: position.coords.longitude }, + }) + }, + () => { + Dispatcher.dispatch(new ErrorAction('Cannot get current location')) + }, + { timeout: 15000 } + ) + } else { + props.onAddressSelected(hit) + } +} + function calculateHighlightedIndex(length: number, currentIndex: number, incrementBy: number) { const nextIndex = currentIndex + incrementBy if (nextIndex >= length) return 0 From 86ea9488e54f4fde194e3d86021c37d3823396c8 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 21 Aug 2021 22:02:46 +0200 Subject: [PATCH 042/322] on focus select all text in input to easily remove it --- src/sidebar/search/AddressInput.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sidebar/search/AddressInput.tsx b/src/sidebar/search/AddressInput.tsx index ec3b48de..8ed3669b 100644 --- a/src/sidebar/search/AddressInput.tsx +++ b/src/sidebar/search/AddressInput.tsx @@ -76,7 +76,10 @@ export default function AddressInput(props: AddressInputProps) { props.onChange(e.target.value) }} onKeyDown={onKeypress} - onFocus={() => setHasFocus(true)} + onFocus={event => { + setHasFocus(true) + event.target.select() + }} onBlur={() => { geocoder.cancel() setHasFocus(false) From 5ebb83ac4c34303ed54c0565e1828cedd382fbf3 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 21 Aug 2021 22:59:41 +0200 Subject: [PATCH 043/322] include searching location text while location unclear --- src/sidebar/search/AddressInput.tsx | 11 ++- src/sidebar/search/GeocodingResult.tsx | 1 - src/sidebar/search/Search.tsx | 18 ++-- src/translation/tr.json | 132 ++++++++++++++++--------- 4 files changed, 108 insertions(+), 54 deletions(-) diff --git a/src/sidebar/search/AddressInput.tsx b/src/sidebar/search/AddressInput.tsx index 1e8195f4..fa717a08 100644 --- a/src/sidebar/search/AddressInput.tsx +++ b/src/sidebar/search/AddressInput.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react' import { QueryPoint, QueryPointType } from '@/stores/QueryStore' import { GeocodingHit } from '@/api/graphhopper' -import { ErrorAction } from '@/actions/Actions' +import { ErrorAction, SetPoint } from '@/actions/Actions' import GeocodingResult from '@/sidebar/search/GeocodingResult' import Dispatcher from '@/stores/Dispatcher' @@ -67,7 +67,7 @@ export default function AddressInput(props: AddressInputProps) { const type = props.point.type if (hasFocus && text.length == 0 && geocodingResults.length == 0) geocodingResults.push({ - osm_id: 'current_location', // required for react (for the "key" attribute of the list) + osm_id: 'current_location', // required for React (for the "key" attribute of the list) name: tr('current_location'), osm_type: 'current_location', // required to internally identify the special geocoding result } as GeocodingHit) @@ -122,6 +122,11 @@ export default function AddressInput(props: AddressInputProps) { function selectHit(props: AddressInputProps, hit: GeocodingHit) { if (hit.osm_type === 'current_location') { if (!navigator.geolocation) throw new Error('Cannot get current location') + props.onAddressSelected({ + ...hit, + name: tr('searching_location') + ' ...', + }) + navigator.geolocation.getCurrentPosition( position => { props.onAddressSelected({ @@ -132,7 +137,7 @@ function selectHit(props: AddressInputProps, hit: GeocodingHit) { () => { Dispatcher.dispatch(new ErrorAction('Cannot get current location')) }, - { timeout: 15000 } + { timeout: 15_000, maximumAge: 2_000 } ) } else { props.onAddressSelected(hit) diff --git a/src/sidebar/search/GeocodingResult.tsx b/src/sidebar/search/GeocodingResult.tsx index a93cc1eb..998451b4 100644 --- a/src/sidebar/search/GeocodingResult.tsx +++ b/src/sidebar/search/GeocodingResult.tsx @@ -1,5 +1,4 @@ import { GeocodingHit } from '@/api/graphhopper' -import PlainButton from '@/PlainButton' import styles from './GeocodingResult.module.css' import React, { useState } from 'react' import CurrentLocationIcon from './current-location.svg' diff --git a/src/sidebar/search/Search.tsx b/src/sidebar/search/Search.tsx index f5eb3d19..adca629f 100644 --- a/src/sidebar/search/Search.tsx +++ b/src/sidebar/search/Search.tsx @@ -70,12 +70,18 @@ const SearchBox = ({ onCancel={() => console.log('cancel')} onAddressSelected={hit => Dispatcher.dispatch( - new SetPoint({ - ...point, - isInitialized: true, - queryText: convertToQueryText(hit), - coordinate: hit.point, - }) + hit.point + ? new SetPoint({ + ...point, + isInitialized: true, + queryText: convertToQueryText(hit), + coordinate: hit.point, + }) + : new SetPoint({ + ...point, + isInitialized: false, + queryText: hit.name, + }) ) } onChange={onChange} diff --git a/src/translation/tr.json b/src/translation/tr.json index 4be12d50..7e380a01 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -39,7 +39,8 @@ "drag_to_reorder":"Drag to reorder", "route_timed_out":"Route calculation timed out", "route_request_failed":"Route request failed", -"current_location":"Current Location" +"current_location":"Current Location", +"searching_location":"Searching Location" }, "ar":{ "search_button":"ابحث", @@ -82,7 +83,8 @@ "drag_to_reorder":"اسحب لاعادة الترتيب", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "ast":{ "search_button":"Buscar", @@ -125,7 +127,8 @@ "drag_to_reorder":"Abasnar pa cambiar l'orde", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "bg":{ "search_button":"Търсене", @@ -168,7 +171,8 @@ "drag_to_reorder":"", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "bn_BN":{ "search_button":"", @@ -211,7 +215,8 @@ "drag_to_reorder":"", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "ca":{ "search_button":"Cerca", @@ -254,7 +259,8 @@ "drag_to_reorder":"Arrossega per canviar l'ordre", "route_timed_out":"S'ha esgotat el temps de càlcul de la ruta", "route_request_failed":"Ha fallat la resolució de la ruta.", -"current_location":"" +"current_location":"", +"searching_location":"" }, "cs_CZ":{ "search_button":"Vyhledat", @@ -297,7 +303,8 @@ "drag_to_reorder":"Přetažením změníte pořadí", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "da_DK":{ "search_button":"Søg", @@ -340,7 +347,8 @@ "drag_to_reorder":"Træk for at ændre rækkefølgen", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "de_DE":{ "search_button":"Suche", @@ -383,7 +391,8 @@ "drag_to_reorder":"Zum Ändern der Reihenfolge ziehen", "route_timed_out":"Zeitlimit für Routenberechnung überschritten", "route_request_failed":"Route konnte nicht berechnet werden", -"current_location":"Aktueller Standort" +"current_location":"Aktueller Standort", +"searching_location":"Suche Standort" }, "el":{ "search_button":"Αναζήτηση", @@ -426,7 +435,8 @@ "drag_to_reorder":"Σύρετε για αναδιάταξη", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "eo":{ "search_button":"Serĉi", @@ -469,7 +479,8 @@ "drag_to_reorder":"Trenu por reordigi", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "es":{ "search_button":"Buscar", @@ -512,7 +523,8 @@ "drag_to_reorder":"Arrastra para cambiar el orden", "route_timed_out":"Se ha agotado el tiempo de cálculo de la ruta", "route_request_failed":"Solicitud de ruta fallida", -"current_location":"" +"current_location":"", +"searching_location":"" }, "fa":{ "search_button":"جست‌وجو", @@ -555,7 +567,8 @@ "drag_to_reorder":"برای مرتب‌سازی جابه‌جا کنید", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "fil":{ "search_button":"Paghahanap", @@ -598,7 +611,8 @@ "drag_to_reorder":"", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "fi":{ "search_button":"Etsi", @@ -641,7 +655,8 @@ "drag_to_reorder":"", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "fr_FR":{ "search_button":"Rechercher", @@ -684,7 +699,8 @@ "drag_to_reorder":"Faire glisser pour réorganiser", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "fr_CH":{ "search_button":"Rechercher", @@ -727,7 +743,8 @@ "drag_to_reorder":"Faire glisser pour réorganiser", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "gl":{ "search_button":"buscar", @@ -770,7 +787,8 @@ "drag_to_reorder":"", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "he":{ "search_button":"חיפוש", @@ -813,7 +831,8 @@ "drag_to_reorder":"יש לגרור כדי לסדר מחדש", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "hr_HR":{ "search_button":"Pretraži", @@ -856,7 +875,8 @@ "drag_to_reorder":"", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "hsb":{ "search_button":"pytaj", @@ -899,7 +919,8 @@ "drag_to_reorder":"", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "hu_HU":{ "search_button":"Keresés", @@ -942,7 +963,8 @@ "drag_to_reorder":"Húzza el az átrendezéshez", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "in_ID":{ "search_button":"pencarian", @@ -985,7 +1007,8 @@ "drag_to_reorder":"Drag untuk mengatur urutan", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "it":{ "search_button":"Ricerca", @@ -1028,7 +1051,8 @@ "drag_to_reorder":"Trascina per riordinare", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "ja":{ "search_button":"検索", @@ -1071,7 +1095,8 @@ "drag_to_reorder":"", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "ko":{ "search_button":"탐색", @@ -1114,7 +1139,8 @@ "drag_to_reorder":"드래그하여 재정렬", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "lt_LT":{ "search_button":"Ieškoti", @@ -1157,7 +1183,8 @@ "drag_to_reorder":"Tempkite, kad pakeistumėte eilės tvarką", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "ne":{ "search_button":"खोज ", @@ -1200,7 +1227,8 @@ "drag_to_reorder":"", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "nl":{ "search_button":"zoek", @@ -1243,7 +1271,8 @@ "drag_to_reorder":"Slepen om opnieuw te organiseren", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "pl_PL":{ "search_button":"Szukaj", @@ -1286,7 +1315,8 @@ "drag_to_reorder":"Przeciągnij, aby przestawić", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "pt_BR":{ "search_button":"Pesquisar", @@ -1329,7 +1359,8 @@ "drag_to_reorder":"Arraste para reordenar", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "pt_PT":{ "search_button":"Pesquisar", @@ -1372,7 +1403,8 @@ "drag_to_reorder":"", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "ro":{ "search_button":"Caută", @@ -1415,7 +1447,8 @@ "drag_to_reorder":"", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "ru":{ "search_button":"Поиск", @@ -1458,7 +1491,8 @@ "drag_to_reorder":"Переместите путевую точку", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "sk":{ "search_button":"Vyhľadať", @@ -1501,7 +1535,8 @@ "drag_to_reorder":"Ťahaj pre zmenu poradia", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "sl_SI":{ "search_button":"Išči", @@ -1544,7 +1579,8 @@ "drag_to_reorder":"Povlecite za spremembo vrstnega reda", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "sr_RS":{ "search_button":"Pretraži", @@ -1587,7 +1623,8 @@ "drag_to_reorder":"", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "sv_SE":{ "search_button":"Sök", @@ -1630,7 +1667,8 @@ "drag_to_reorder":"Dra för att ändra ordning", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "tr":{ "search_button":"Ara", @@ -1673,7 +1711,8 @@ "drag_to_reorder":"Yeniden sıralamak için sürükle bırak", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "uk":{ "search_button":"Пошук", @@ -1716,7 +1755,8 @@ "drag_to_reorder":"Перемістіть шляхову точку", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "vi_VN":{ "search_button":"Tìm", @@ -1759,7 +1799,8 @@ "drag_to_reorder":"Kéo để sắp xếp lại", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "zh_CN":{ "search_button":"搜索", @@ -1802,7 +1843,8 @@ "drag_to_reorder":"拖动可重新排序", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "zh_HK":{ "search_button":"搜尋", @@ -1845,7 +1887,8 @@ "drag_to_reorder":"", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }, "zh_TW":{ "search_button":"搜尋", @@ -1888,5 +1931,6 @@ "drag_to_reorder":"拖曳排序", "route_timed_out":"", "route_request_failed":"", -"current_location":"" +"current_location":"", +"searching_location":"" }} \ No newline at end of file From 86a53fa55a56835c29a761e7b934afcc020f0754 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 21 Aug 2021 23:10:15 +0200 Subject: [PATCH 044/322] update input if location search failed --- src/sidebar/search/AddressInput.tsx | 7 +- src/translation/tr.json | 132 ++++++++++++++++++---------- 2 files changed, 93 insertions(+), 46 deletions(-) diff --git a/src/sidebar/search/AddressInput.tsx b/src/sidebar/search/AddressInput.tsx index fa717a08..85e82885 100644 --- a/src/sidebar/search/AddressInput.tsx +++ b/src/sidebar/search/AddressInput.tsx @@ -135,9 +135,12 @@ function selectHit(props: AddressInputProps, hit: GeocodingHit) { }) }, () => { - Dispatcher.dispatch(new ErrorAction('Cannot get current location')) + props.onAddressSelected({ + ...hit, + name: tr('searching_location_failed'), + }) }, - { timeout: 15_000, maximumAge: 2_000 } + { timeout: 60_000, maximumAge: 2_000 } ) } else { props.onAddressSelected(hit) diff --git a/src/translation/tr.json b/src/translation/tr.json index 7e380a01..2c0270ee 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -40,7 +40,8 @@ "route_timed_out":"Route calculation timed out", "route_request_failed":"Route request failed", "current_location":"Current Location", -"searching_location":"Searching Location" +"searching_location":"Searching location", +"searching_location_failed":"Searching location failed" }, "ar":{ "search_button":"ابحث", @@ -84,7 +85,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "ast":{ "search_button":"Buscar", @@ -128,7 +130,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "bg":{ "search_button":"Търсене", @@ -172,7 +175,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "bn_BN":{ "search_button":"", @@ -216,7 +220,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "ca":{ "search_button":"Cerca", @@ -260,7 +265,8 @@ "route_timed_out":"S'ha esgotat el temps de càlcul de la ruta", "route_request_failed":"Ha fallat la resolució de la ruta.", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "cs_CZ":{ "search_button":"Vyhledat", @@ -304,7 +310,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "da_DK":{ "search_button":"Søg", @@ -348,7 +355,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "de_DE":{ "search_button":"Suche", @@ -392,7 +400,8 @@ "route_timed_out":"Zeitlimit für Routenberechnung überschritten", "route_request_failed":"Route konnte nicht berechnet werden", "current_location":"Aktueller Standort", -"searching_location":"Suche Standort" +"searching_location":"Suche Standort", +"searching_location_failed":"Standortsuche fehlgeschlagen" }, "el":{ "search_button":"Αναζήτηση", @@ -436,7 +445,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "eo":{ "search_button":"Serĉi", @@ -480,7 +490,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "es":{ "search_button":"Buscar", @@ -524,7 +535,8 @@ "route_timed_out":"Se ha agotado el tiempo de cálculo de la ruta", "route_request_failed":"Solicitud de ruta fallida", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "fa":{ "search_button":"جست‌وجو", @@ -568,7 +580,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "fil":{ "search_button":"Paghahanap", @@ -612,7 +625,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "fi":{ "search_button":"Etsi", @@ -656,7 +670,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "fr_FR":{ "search_button":"Rechercher", @@ -700,7 +715,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "fr_CH":{ "search_button":"Rechercher", @@ -744,7 +760,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "gl":{ "search_button":"buscar", @@ -788,7 +805,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "he":{ "search_button":"חיפוש", @@ -832,7 +850,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "hr_HR":{ "search_button":"Pretraži", @@ -876,7 +895,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "hsb":{ "search_button":"pytaj", @@ -920,7 +940,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "hu_HU":{ "search_button":"Keresés", @@ -964,7 +985,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "in_ID":{ "search_button":"pencarian", @@ -1008,7 +1030,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "it":{ "search_button":"Ricerca", @@ -1052,7 +1075,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "ja":{ "search_button":"検索", @@ -1096,7 +1120,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "ko":{ "search_button":"탐색", @@ -1140,7 +1165,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "lt_LT":{ "search_button":"Ieškoti", @@ -1184,7 +1210,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "ne":{ "search_button":"खोज ", @@ -1228,7 +1255,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "nl":{ "search_button":"zoek", @@ -1272,7 +1300,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "pl_PL":{ "search_button":"Szukaj", @@ -1316,7 +1345,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "pt_BR":{ "search_button":"Pesquisar", @@ -1360,7 +1390,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "pt_PT":{ "search_button":"Pesquisar", @@ -1404,7 +1435,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "ro":{ "search_button":"Caută", @@ -1448,7 +1480,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "ru":{ "search_button":"Поиск", @@ -1492,7 +1525,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "sk":{ "search_button":"Vyhľadať", @@ -1536,7 +1570,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "sl_SI":{ "search_button":"Išči", @@ -1580,7 +1615,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "sr_RS":{ "search_button":"Pretraži", @@ -1624,7 +1660,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "sv_SE":{ "search_button":"Sök", @@ -1668,7 +1705,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "tr":{ "search_button":"Ara", @@ -1712,7 +1750,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "uk":{ "search_button":"Пошук", @@ -1756,7 +1795,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "vi_VN":{ "search_button":"Tìm", @@ -1800,7 +1840,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "zh_CN":{ "search_button":"搜索", @@ -1844,7 +1885,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "zh_HK":{ "search_button":"搜尋", @@ -1888,7 +1930,8 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }, "zh_TW":{ "search_button":"搜尋", @@ -1932,5 +1975,6 @@ "route_timed_out":"", "route_request_failed":"", "current_location":"", -"searching_location":"" +"searching_location":"", +"searching_location_failed":"" }} \ No newline at end of file From 00016f9a4af463c705be15d6a3a87a62db6a50ed Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 21 Aug 2021 23:37:53 +0200 Subject: [PATCH 045/322] improve curr loc --- src/sidebar/search/AddressInput.tsx | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/sidebar/search/AddressInput.tsx b/src/sidebar/search/AddressInput.tsx index 2dcf870e..dbe605b7 100644 --- a/src/sidebar/search/AddressInput.tsx +++ b/src/sidebar/search/AddressInput.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react' import { QueryPoint, QueryPointType } from '@/stores/QueryStore' import { GeocodingHit } from '@/api/graphhopper' -import { ErrorAction, SetPoint } from '@/actions/Actions' +import { ErrorAction } from '@/actions/Actions' import GeocodingResult from '@/sidebar/search/GeocodingResult' import Dispatcher from '@/stores/Dispatcher' @@ -124,12 +124,13 @@ export default function AddressInput(props: AddressInputProps) { function selectHit(props: AddressInputProps, hit: GeocodingHit) { if (hit.osm_type === 'current_location') { - if (!navigator.geolocation) throw new Error('Cannot get current location') - props.onAddressSelected({ - ...hit, - name: tr('searching_location') + ' ...', - }) + if (!navigator.geolocation) { + Dispatcher.dispatch(new ErrorAction('Location search not available in this browser')) + return + } + props.onAddressSelected({ ...hit, name: tr('searching_location') + ' ...' }) + // Warning: getCurrentPosition() and watchPosition() might interfer (call clearWatch properly) navigator.geolocation.getCurrentPosition( position => { props.onAddressSelected({ @@ -137,13 +138,11 @@ function selectHit(props: AddressInputProps, hit: GeocodingHit) { point: { lat: position.coords.latitude, lng: position.coords.longitude }, }) }, - () => { - props.onAddressSelected({ - ...hit, - name: tr('searching_location_failed'), - }) + error => { + Dispatcher.dispatch(new ErrorAction(tr('searching_location_failed') + ': ' + error.message)) + props.onAddressSelected({ ...hit, name: '' }) }, - { timeout: 60_000, maximumAge: 2_000 } + { timeout: 300_000, maximumAge: 5_000 } ) } else { props.onAddressSelected(hit) From 8fb4288c538b14c0d40246d0ac19b0131239e4de Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 21 Aug 2021 23:40:14 +0200 Subject: [PATCH 046/322] try again curr loc --- src/sidebar/search/AddressInput.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sidebar/search/AddressInput.tsx b/src/sidebar/search/AddressInput.tsx index dbe605b7..3dba94f0 100644 --- a/src/sidebar/search/AddressInput.tsx +++ b/src/sidebar/search/AddressInput.tsx @@ -141,8 +141,8 @@ function selectHit(props: AddressInputProps, hit: GeocodingHit) { error => { Dispatcher.dispatch(new ErrorAction(tr('searching_location_failed') + ': ' + error.message)) props.onAddressSelected({ ...hit, name: '' }) - }, - { timeout: 300_000, maximumAge: 5_000 } + } + //{ timeout: 300_000, maximumAge: 5_000 } ) } else { props.onAddressSelected(hit) From 1613c4ebae8a0ba4579d61875900eeb856aa1133 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 21 Aug 2021 23:58:42 +0200 Subject: [PATCH 047/322] fix problems on mobile firefox --- src/sidebar/search/AddressInput.tsx | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/sidebar/search/AddressInput.tsx b/src/sidebar/search/AddressInput.tsx index 85e82885..29cf3eff 100644 --- a/src/sidebar/search/AddressInput.tsx +++ b/src/sidebar/search/AddressInput.tsx @@ -121,12 +121,13 @@ export default function AddressInput(props: AddressInputProps) { function selectHit(props: AddressInputProps, hit: GeocodingHit) { if (hit.osm_type === 'current_location') { - if (!navigator.geolocation) throw new Error('Cannot get current location') - props.onAddressSelected({ - ...hit, - name: tr('searching_location') + ' ...', - }) + if (!navigator.geolocation) { + Dispatcher.dispatch(new ErrorAction('Location search not available in this browser')) + return + } + props.onAddressSelected({ ...hit, name: tr('searching_location') + ' ...' }) + // TODO: getCurrentPosition() and watchPosition() might interfer (call clearWatch properly or test if current location already exists) navigator.geolocation.getCurrentPosition( position => { props.onAddressSelected({ @@ -134,13 +135,12 @@ function selectHit(props: AddressInputProps, hit: GeocodingHit) { point: { lat: position.coords.latitude, lng: position.coords.longitude }, }) }, - () => { - props.onAddressSelected({ - ...hit, - name: tr('searching_location_failed'), - }) + error => { + Dispatcher.dispatch(new ErrorAction(tr('searching_location_failed') + ': ' + error.message)) + props.onAddressSelected({ ...hit, name: '' }) }, - { timeout: 60_000, maximumAge: 2_000 } + // DO NOT use e.g. maximumAge: 5_000 -> getCurrentPosition will then never return on mobile firefox!? + { timeout: 300_000 } ) } else { props.onAddressSelected(hit) From ae811162b801efe0c0b8b90badb6f2e454d3aaea Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 22 Aug 2021 16:53:12 +0200 Subject: [PATCH 048/322] improve remaining time and distance for navigation and set pitch+bearing --- src/actions/Actions.ts | 6 ++- src/layers/CurrentLocationLayer.tsx | 1 - src/map/Popup.tsx | 2 +- src/stores/LocationStore.ts | 54 +++++++++++++++++--------- src/stores/ViewportStore.ts | 4 ++ src/turnNavigation/GeoMethods.ts | 53 ++++++++++++++++++------- src/turnNavigation/TurnNavigation.tsx | 19 ++++++--- test/stores/ViewportStore.test.ts | 3 +- test/turnNavigation/GeoMethods.test.ts | 27 ++++++++++--- 9 files changed, 122 insertions(+), 47 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 883c9c65..60898e40 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -130,10 +130,14 @@ export class SetViewport implements Action { export class SetViewportToPoint implements Action { readonly coordinate: Coordinate readonly zoom: number + readonly pitch: number + readonly bearing: number - constructor(coordinate: Coordinate, zoom: number) { + constructor(coordinate: Coordinate, zoom: number, pitch: number, bearing: number) { this.coordinate = coordinate this.zoom = zoom + this.pitch = pitch + this.bearing = bearing } } diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index 8a8ea682..17bc6b08 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -5,7 +5,6 @@ import { FeatureCollection } from 'geojson' import { Layer, Source } from 'react-map-gl' import { MapLayer } from '@/layers/MapLayer' -// const currentLocationSourceKey = 'currentLocationSource' const currentLocationLayerKey = 'currentLocationLayer' export default function (coordinate: Coordinate): MapLayer { diff --git a/src/map/Popup.tsx b/src/map/Popup.tsx index 8c576698..7f0b4ac9 100644 --- a/src/map/Popup.tsx +++ b/src/map/Popup.tsx @@ -67,7 +67,7 @@ export function PopupComponent({ className={styles.entry} onClick={() => { onSelect() - Dispatcher.dispatch(new SetViewportToPoint(coordinate, 8)) + Dispatcher.dispatch(new SetViewportToPoint(coordinate, 8, 0, 0)) }} > Center map diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 938e883e..92205029 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -1,6 +1,6 @@ import { Coordinate } from '@/stores/QueryStore' import Store from '@/stores/Store' -import { LocationUpdate, SetViewportToPoint } from '@/actions/Actions' +import { ErrorAction, LocationUpdate, SetViewportToPoint } from '@/actions/Actions' import Dispatcher, { Action } from '@/stores/Dispatcher' import NoSleep from 'nosleep.js' import { SpeechSynthesizer } from '@/SpeechSynthesizer' @@ -31,6 +31,7 @@ export default class LocationStore extends Store { reduce(state: LocationStoreState, action: Action): LocationStoreState { if (action instanceof LocationUpdate) { + console.log('LocationUpdate {}', action) return { turnNavigation: action.turnNavigation, coordinate: action.coordinate, @@ -45,35 +46,49 @@ export default class LocationStore extends Store { // TODO randomize a route const latlon: number[][] = [ - [51.439291, 14.245254], - [51.438989, 14.245405], - [51.438694, 14.245577], - [51.438668, 14.246092], - [51.438226, 14.246972], - [51.436795, 14.24592], - [51.435029, 14.243259], - [51.435203, 14.241006], - [51.434788, 14.238882], - [51.434146, 14.237745], - [51.433959, 14.235985], - [51.43322, 14.234999], + [51.439291, 14.245254, 180], + [51.438989, 14.245405, 180], + [51.438694, 14.245577, 90], + [51.438668, 14.246092, 90], + [51.438226, 14.246972, 180], + [51.436795, 14.245921, 180], + [51.435029, 14.243259, 270], + [51.435203, 14.241006, 270], + [51.434788, 14.238882, 180], + [51.434146, 14.237745, 270], + [51.433959, 14.235985, 180], + [51.43322, 14.2349991, 270], ] let currentIndex: number = 0 - this.locationUpdate({ coords: { latitude: latlon[currentIndex][0], longitude: latlon[currentIndex][1] } }) + this.locationUpdate({ + coords: { + latitude: latlon[currentIndex][0], + longitude: latlon[currentIndex][1], + heading: latlon[currentIndex][2], + }, + }) this.interval = setInterval(() => { currentIndex++ currentIndex %= latlon.length console.log(currentIndex) - this.locationUpdate({ coords: { latitude: latlon[currentIndex][0], longitude: latlon[currentIndex][1] } }) + this.locationUpdate({ + coords: { + latitude: latlon[currentIndex][0], + longitude: latlon[currentIndex][1], + heading: latlon[currentIndex][2], + }, + }) }, 3000) } private locationUpdate(pos: any) { - console.log('location success handler') + console.log('locationUpdate = success handler') let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } Dispatcher.dispatch(new LocationUpdate(c, true)) - Dispatcher.dispatch(new SetViewportToPoint(c, 16)) + let bearing: number = pos.coords.heading + if (Number.isNaN(bearing)) bearing = 0 + Dispatcher.dispatch(new SetViewportToPoint(c, 17, 50, bearing)) } public initReal() { @@ -91,7 +106,7 @@ export default class LocationStore extends Store { this.watchId = navigator.geolocation.watchPosition( this.locationUpdate, function (err) { - console.log('location watch error', err) + Dispatcher.dispatch(new ErrorAction('location watch error: ' + err.message)) }, options ) @@ -103,6 +118,9 @@ export default class LocationStore extends Store { if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) + // exit "navigation view" => use no pitch and no bearing (rotation) + Dispatcher.dispatch(new SetViewportToPoint(this.state.coordinate, 15, 0, 0)) + // directly writing the state does not work: this.state.turnNavigation = false Dispatcher.dispatch(new LocationUpdate({ lat: 0, lng: 0 }, false)) diff --git a/src/stores/ViewportStore.ts b/src/stores/ViewportStore.ts index f359736b..d0a7f10e 100644 --- a/src/stores/ViewportStore.ts +++ b/src/stores/ViewportStore.ts @@ -18,6 +18,7 @@ export interface ViewportStoreState { longitude: number latitude: number zoom: number + pitch: number width: number height: number altitude?: number @@ -50,6 +51,7 @@ export default class ViewportStore extends Store { longitude: 11, latitude: 48, zoom: 5, + pitch: 0, } } reduce(state: ViewportStoreState, action: Action): ViewportStoreState { @@ -68,6 +70,8 @@ export default class ViewportStore extends Store { longitude: newCoord.lng, latitude: newCoord.lat, zoom: action.zoom, + bearing: action.bearing, + pitch: action.pitch, } } else if (action instanceof InfoReceived) { return calculateLatLngFromBbox(state, action.result.bbox, isSmallScreen) diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 82a24461..8b880410 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -3,25 +3,31 @@ import { Coordinate } from '@/stores/QueryStore' export function getCurrentInstruction( instructions: Instruction[], - currentLocation: Coordinate -): { instructionIndex: number; distanceNext: number } { + location: Coordinate +): { + instructionIndex: number + timeToNext: number + distanceToNext: number + remainingTime: number + remainingDistance: number +} { let instructionIndex = -1 let smallestDist = Number.MAX_VALUE - let distanceNext = 10.0 - // find instruction nearby and very simple method (pick first point) + let distanceToNext = 10.0 + for (let instrIdx = 0; instrIdx < instructions.length; instrIdx++) { const points: number[][] = instructions[instrIdx].points for (let pIdx = 0; pIdx < points.length; pIdx++) { const p: number[] = points[pIdx] - let loc = currentLocation - let dist = distCalc(p[1], p[0], loc.lat, loc.lng) - // if not the last point of the instruction we can calulate the snapped point + let snapped = { lat: p[1], lng: p[0] } + let dist = distCalc(p[1], p[0], location.lat, location.lng) + // calulate the snapped point, TODO use first point of next instruction for "next" if last point of current instruction if (pIdx + 1 < points.length) { const next: number[] = points[pIdx + 1] - if (validEdgeDistance(loc.lat, loc.lng, p[1], p[0], next[1], next[0])) { - loc = calcCrossingPointToEdge(loc.lat, loc.lng, p[1], p[0], next[1], next[0]) - dist = Math.min(dist, distCalc(loc.lat, loc.lng, currentLocation.lat, currentLocation.lng)) + if (validEdgeDistance(location.lat, location.lng, p[1], p[0], next[1], next[0])) { + snapped = calcCrossingPointToEdge(location.lat, location.lng, p[1], p[0], next[1], next[0]) + dist = Math.min(dist, distCalc(snapped.lat, snapped.lng, location.lat, location.lng)) } } @@ -29,13 +35,32 @@ export function getCurrentInstruction( smallestDist = dist // use next instruction or finish instructionIndex = instrIdx + 1 < instructions.length ? instrIdx + 1 : instrIdx - const last: number[] = points[points.length - 1] - distanceNext = Math.round(distCalc(last[1], last[0], loc.lat, loc.lng)) + distanceToNext = Math.round(distCalc(last[1], last[0], snapped.lat, snapped.lng)) } } } - return { instructionIndex, distanceNext } + + let timeToNext = 0 + let remainingTime = 0 + let remainingDistance = distanceToNext + if (instructionIndex >= 0) { + if (instructionIndex > 0) { + // proportional estimate the time to the next instruction, TODO use time from path details instead + let prevInstruction = instructions[instructionIndex - 1] + timeToNext = + prevInstruction.distance > 0 ? prevInstruction.time * (distanceToNext / prevInstruction.distance) : 0 + // console.log('time: ' + prevInstruction.time + ', ' + distanceToNext + ', ' + prevInstruction.distance) + } + remainingTime = timeToNext + remainingDistance = distanceToNext + for (let instrIdx = instructionIndex; instrIdx < instructions.length; instrIdx++) { + remainingTime += instructions[instrIdx].time + remainingDistance += instructions[instrIdx].distance + } + } + + return { instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance } } export function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: number): number { @@ -97,7 +122,7 @@ function calcCrossingPointToEdge( a_lon_deg: number, b_lat_deg: number, b_lon_deg: number -) { +): Coordinate { let shrinkFactor = calcShrinkFactor(a_lat_deg, b_lat_deg) let a_lat = a_lat_deg let a_lon = a_lon_deg * shrinkFactor diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 8b71f944..74214b0b 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -7,6 +7,7 @@ import styles from '@/turnNavigation/TurnNavigation.module.css' import endNavigation from '@/turnNavigation/end_turn_navigation.png' import { getLocationStore } from '@/stores/Stores' import { LocationStoreState } from '@/stores/LocationStore' +import { tr } from '@/translation/Translation' type TurnNavigationProps = { path: Path @@ -17,7 +18,12 @@ export default function ({ path, location }: TurnNavigationProps) { let currentLocation = location.coordinate if (currentLocation.lat == 0 && currentLocation.lng == 0) return Searching GPS... - const { instructionIndex, distanceNext } = getCurrentInstruction(path.instructions, currentLocation) + const { instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance } = getCurrentInstruction( + path.instructions, + currentLocation + ) + + console.log('remaining distance: ' + remainingDistance + ', time: ' + remainingTime) // TODO too far from route - recalculate? if (instructionIndex < 0) return <>Cannot find instruction @@ -26,7 +32,7 @@ export default function ({ path, location }: TurnNavigationProps) { // TODO better approximation via estimating taken time const arrivalDate = new Date() - arrivalDate.setMilliseconds(arrivalDate.getSeconds() + path.time) + arrivalDate.setMilliseconds(arrivalDate.getSeconds() + remainingTime) const min = arrivalDate.getMinutes() return ( <> @@ -36,16 +42,17 @@ export default function ({ path, location }: TurnNavigationProps) {
{'turn
-
{metersToText(distanceNext)}
+
{metersToText(distanceToNext)}
+
{milliSecondsToText(timeToNext)}
{nextInstruction.text}
- {arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)} Uhr + {arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min) + ' ' + tr('Uhr')}
-
{milliSecondsToText(path.time)}
-
{metersToText(path.distance)}
+
{milliSecondsToText(remainingTime)}
+
{metersToText(remainingDistance)}
getLocationStore().stop()}>
diff --git a/test/stores/ViewportStore.test.ts b/test/stores/ViewportStore.test.ts index ccb57156..0617c257 100644 --- a/test/stores/ViewportStore.test.ts +++ b/test/stores/ViewportStore.test.ts @@ -8,13 +8,14 @@ describe('ViewportStore', () => { const initialState: ViewportStoreState = { longitude: 10, latitude: 45, + pitch: 0, zoom: 8, width: 1400, height: 1000, } { // simply set to point - const newState = store.reduce(initialState, new SetViewportToPoint({ lng: 13, lat: 48 }, 11)) + const newState = store.reduce(initialState, new SetViewportToPoint({ lng: 13, lat: 48 }, 11, 0, 0)) expect(newState.longitude).toEqual(13) expect(newState.latitude).toEqual(48) expect(newState.zoom).toEqual(11) diff --git a/test/turnNavigation/GeoMethods.test.ts b/test/turnNavigation/GeoMethods.test.ts index 5d313695..fd1574ea 100644 --- a/test/turnNavigation/GeoMethods.test.ts +++ b/test/turnNavigation/GeoMethods.test.ts @@ -10,12 +10,29 @@ describe('calculate instruction', () => { // http://localhost:3000/?point=51.437233%2C14.246489&point=51.435514%2C14.239923&profile=car it('second instruction should not be "right turn"', () => { let path = ApiImpl.decodeResult(responseHoyerswerda1, true)[0] - const { instructionIndex, distanceNext } = getCurrentInstruction(path.instructions, { - lat: 51.435029, - lng: 14.243259, - }) + const { instructionIndex, distanceToNext, remainingTime, remainingDistance } = getCurrentInstruction( + path.instructions, + { + lat: 51.435029, + lng: 14.243259, + } + ) + + expect(distanceToNext).toEqual(236) + expect(remainingDistance).toEqual(236) + expect(Math.round(remainingTime / 1000)).toEqual(30) - expect(distanceNext).toEqual(236) expect(path.instructions[instructionIndex].text).toEqual('Ziel erreicht') }) + + it('remaining time should be correct', () => { + let path = ApiImpl.decodeResult(responseHoyerswerda1, true)[0] + const { remainingTime, remainingDistance } = getCurrentInstruction(path.instructions, { + lat: 51.439291, + lng: 14.245254, + }) + + expect(Math.round(remainingTime / 1000)).toEqual(101) + expect(Math.round(remainingDistance)).toEqual(578) + }) }) From dd9440aace59b6c6c23ae5007a375b83e5105152 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 23 Aug 2021 15:10:11 +0200 Subject: [PATCH 049/322] initial bearing --- src/stores/ViewportStore.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/stores/ViewportStore.ts b/src/stores/ViewportStore.ts index d0a7f10e..494096d8 100644 --- a/src/stores/ViewportStore.ts +++ b/src/stores/ViewportStore.ts @@ -51,6 +51,7 @@ export default class ViewportStore extends Store { longitude: 11, latitude: 48, zoom: 5, + bearing: 0, pitch: 0, } } From c62b1d42ab2682c99c2911a93e72b2717a26f870 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 23 Aug 2021 15:40:20 +0200 Subject: [PATCH 050/322] make bearing required in ViewportStoreState --- src/map/Map.tsx | 4 ++-- src/stores/ViewportStore.ts | 2 +- test/stores/ViewportStore.test.ts | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/map/Map.tsx b/src/map/Map.tsx index 7d5e4ba3..f213f4f5 100644 --- a/src/map/Map.tsx +++ b/src/map/Map.tsx @@ -46,8 +46,8 @@ export default function ({ viewport, styleOption, queryPoints, mapLayers }: MapP setPopupCoordinate(null) // restrict zoom/pan such that we never see empty space left of/right of/above/under the map const bounds = new WebMercatorViewport(nextViewport).getBounds() - if (bounds[0][0] < -180 || bounds[0][1] < -90 || bounds[1][0] > 180 || bounds[1][1] > 90) return - Dispatcher.dispatch(new SetViewport(nextViewport)) + if (bounds[0][0] < -180 || bounds[0][1] < -90 || bounds[1][0] > 180 || bounds[1][1] > 90) + return Dispatcher.dispatch(new SetViewport(nextViewport)) }} // todo: minor glitch: when we hover the map before the path got loaded we get an error in the console interactiveLayerIds={interactiveLayerIds} diff --git a/src/stores/ViewportStore.ts b/src/stores/ViewportStore.ts index 494096d8..0ea51a9c 100644 --- a/src/stores/ViewportStore.ts +++ b/src/stores/ViewportStore.ts @@ -19,10 +19,10 @@ export interface ViewportStoreState { latitude: number zoom: number pitch: number + bearing: number width: number height: number altitude?: number - bearing?: number minZoom?: number maxZoom?: number minPitch?: number diff --git a/test/stores/ViewportStore.test.ts b/test/stores/ViewportStore.test.ts index 0617c257..0bed7487 100644 --- a/test/stores/ViewportStore.test.ts +++ b/test/stores/ViewportStore.test.ts @@ -9,6 +9,7 @@ describe('ViewportStore', () => { longitude: 10, latitude: 45, pitch: 0, + bearing: 0, zoom: 8, width: 1400, height: 1000, From 911fea288c0919cf6821ea1f08447a082a88b0a7 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 23 Aug 2021 16:44:01 +0200 Subject: [PATCH 051/322] do not show watch error if location retrieval was already stopped --- src/stores/LocationStore.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 92205029..761ba435 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -16,6 +16,7 @@ export default class LocationStore extends Store { private interval: any private noSleep: any private speechSynthesizer: SpeechSynthesizer + private started: boolean = false constructor(speechSynthesizer: SpeechSynthesizer) { super() @@ -42,6 +43,7 @@ export default class LocationStore extends Store { // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car public initFake() { + this.started = true this.speechSynthesizer.synthesize(tr('fake_welcome')) // TODO randomize a route @@ -92,6 +94,7 @@ export default class LocationStore extends Store { } public initReal() { + this.started = true if (!this.noSleep) this.noSleep = new NoSleep() this.noSleep.enable() if (!navigator.geolocation) { @@ -105,8 +108,8 @@ export default class LocationStore extends Store { let options = { enableHighAccuracy: false, timeout: 5000, maximumAge: 5000 } this.watchId = navigator.geolocation.watchPosition( this.locationUpdate, - function (err) { - Dispatcher.dispatch(new ErrorAction('location watch error: ' + err.message)) + err => { + if (this.started) Dispatcher.dispatch(new ErrorAction('location watch error: ' + err.message)) }, options ) @@ -114,6 +117,7 @@ export default class LocationStore extends Store { } public stop() { + this.started = false if (this.interval) clearInterval(this.interval) if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) From fb54204df8aaef349ac344c4fadbf17de4d3fa5f Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 23 Aug 2021 17:34:15 +0200 Subject: [PATCH 052/322] move navigation panel to bottom and a bit restyle --- src/App.tsx | 14 ++++++------ src/turnNavigation/TurnNavigation.module.css | 24 ++++++++++++-------- src/turnNavigation/TurnNavigation.tsx | 23 ++++++++++--------- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 68e4069e..20269eef 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -193,16 +193,16 @@ function SmallScreenLayout({ query, route, location, viewport, mapLayers, error,
- {location.turnNavigation ? ( -
- -
- ) : ( + {location.turnNavigation ? null : (
)} - {!location.turnNavigation ? ( + {location.turnNavigation ? ( +
+ +
+ ) : (
- ) : null} + )} {!location.turnNavigation ? (
diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 4a8aa274..aca5dbc5 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -1,36 +1,40 @@ .turnInfo { display: flex; - flex-direction: row; padding: 0.5rem; } .turnSign img { - max-height: 2rem; + max-height: 2.5rem; } + .turnSign { + padding-left: 0.3rem; font-size: smaller; min-width: 20%; flex-direction: column; + font-weight: bold; } .turnText { - padding: 0.5rem; - flex-direction: column; + padding: 0.5rem 0.8rem; } -.arrival div { - padding: 0.5rem; -} .arrival { + width: 100%; display: flex; - flex-direction: row; font-size: larger; + flex-direction: row; + justify-content: space-between; } -.arrival_date { +.arrivalDuration { font-weight: bold; } -.navicon { +.arrivalTime { + padding-left: 1rem; +} + +.endnavicon img { max-height: 20px; } diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 74214b0b..88aea9ed 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -43,20 +43,21 @@ export default function ({ path, location }: TurnNavigationProps) { {'turn
{metersToText(distanceToNext)}
-
{milliSecondsToText(timeToNext)}
-
{nextInstruction.text}
-
-
-
- {arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min) + ' ' + tr('Uhr')} -
-
{milliSecondsToText(remainingTime)}
-
{metersToText(remainingDistance)}
-
getLocationStore().stop()}> - +
+
+
{milliSecondsToText(remainingTime)}
+
{metersToText(remainingDistance)}
+
+
+ {arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)} +
+
getLocationStore().stop()}> + +
+
{nextInstruction.text}
) From 22f1ba40c497b5744ab94a6f0d15533779ff3d62 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 23 Aug 2021 17:42:16 +0200 Subject: [PATCH 053/322] use pure street name for vis (without instruction) --- src/api/graphhopper.d.ts | 1 + src/turnNavigation/TurnNavigation.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/api/graphhopper.d.ts b/src/api/graphhopper.d.ts index 378930c7..1c0003f7 100644 --- a/src/api/graphhopper.d.ts +++ b/src/api/graphhopper.d.ts @@ -81,6 +81,7 @@ export interface Instruction { readonly points: number[][] readonly sign: number readonly text: string + readonly street_name: string readonly time: number } diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 88aea9ed..90a87250 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -57,7 +57,7 @@ export default function ({ path, location }: TurnNavigationProps) {
-
{nextInstruction.text}
+
{nextInstruction.street_name}
) From 650a766793fc929291b8e5fe4171c95585b3ea7d Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 23 Aug 2021 18:07:39 +0200 Subject: [PATCH 054/322] let's go fullscreen on navigation --- src/stores/LocationStore.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 761ba435..24a59e99 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -94,6 +94,14 @@ export default class LocationStore extends Store { } public initReal() { + try { + let el = document.documentElement + let requestFullscreenFct = el.requestFullscreen + requestFullscreenFct.call(el) + } catch (e) { + console.log(e) + } + this.started = true if (!this.noSleep) this.noSleep = new NoSleep() this.noSleep.enable() @@ -117,6 +125,8 @@ export default class LocationStore extends Store { } public stop() { + if (document.fullscreenElement) document.exitFullscreen() + this.started = false if (this.interval) clearInterval(this.interval) From 0df89462dd780fb4a6d6df789784402f62bf1c03 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 23 Aug 2021 20:56:01 +0200 Subject: [PATCH 055/322] use same GPS retrieval settings for watchPosition and getCurrentPosition --- src/sidebar/search/AddressInput.tsx | 2 +- src/stores/LocationStore.ts | 21 ++++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/sidebar/search/AddressInput.tsx b/src/sidebar/search/AddressInput.tsx index a7fea05b..045d025b 100644 --- a/src/sidebar/search/AddressInput.tsx +++ b/src/sidebar/search/AddressInput.tsx @@ -143,7 +143,7 @@ function selectHit(props: AddressInputProps, hit: GeocodingHit) { props.onAddressSelected({ ...hit, name: '' }) }, // DO NOT use e.g. maximumAge: 5_000 -> getCurrentPosition will then never return on mobile firefox!? - { timeout: 300_000 } + { timeout: 120_000 } ) } else { props.onAddressSelected(hit) diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 24a59e99..2ad88f0e 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -94,14 +94,6 @@ export default class LocationStore extends Store { } public initReal() { - try { - let el = document.documentElement - let requestFullscreenFct = el.requestFullscreen - requestFullscreenFct.call(el) - } catch (e) { - console.log(e) - } - this.started = true if (!this.noSleep) this.noSleep = new NoSleep() this.noSleep.enable() @@ -113,7 +105,11 @@ export default class LocationStore extends Store { // force calling clearWatch can help to find GPS fix more reliable in android firefox if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) - let options = { enableHighAccuracy: false, timeout: 5000, maximumAge: 5000 } + let options = { + timeout: 120_000, + // maximumAge is not a problem here like with getCurrentPosition but let's use identical settings + // enableHighAccuracy: false + } this.watchId = navigator.geolocation.watchPosition( this.locationUpdate, err => { @@ -121,6 +117,13 @@ export default class LocationStore extends Store { }, options ) + try { + let el = document.documentElement + let requestFullscreenFct = el.requestFullscreen + requestFullscreenFct.call(el) + } catch (e) { + console.log(e) + } } } From 7c4f7d70d09f1239c9fe5b6c6a4239b0a6a6a932 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 24 Aug 2021 13:22:49 +0200 Subject: [PATCH 056/322] map cannot be moved - for now avoid restriction --- src/map/Map.tsx | 8 +++++--- src/stores/ViewportStore.ts | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/map/Map.tsx b/src/map/Map.tsx index f213f4f5..c99be1e4 100644 --- a/src/map/Map.tsx +++ b/src/map/Map.tsx @@ -44,10 +44,12 @@ export default function ({ viewport, styleOption, queryPoints, mapLayers }: MapP onViewportChange={(nextViewport: ViewportStoreState) => { // close the context menu when we move the map setPopupCoordinate(null) + + // TODO NOW bearing and/or pitch makes problems together with this restriction: // restrict zoom/pan such that we never see empty space left of/right of/above/under the map - const bounds = new WebMercatorViewport(nextViewport).getBounds() - if (bounds[0][0] < -180 || bounds[0][1] < -90 || bounds[1][0] > 180 || bounds[1][1] > 90) - return Dispatcher.dispatch(new SetViewport(nextViewport)) + // const bounds = new WebMercatorViewport(nextViewport).getBounds() + // if (bounds[0][0] < -180 || bounds[0][1] < -90 || bounds[1][0] > 180 || bounds[1][1] > 90) + return Dispatcher.dispatch(new SetViewport(nextViewport)) }} // todo: minor glitch: when we hover the map before the path got loaded we get an error in the console interactiveLayerIds={interactiveLayerIds} diff --git a/src/stores/ViewportStore.ts b/src/stores/ViewportStore.ts index 0ea51a9c..07519920 100644 --- a/src/stores/ViewportStore.ts +++ b/src/stores/ViewportStore.ts @@ -62,6 +62,8 @@ export default class ViewportStore extends Store { } else if (action instanceof SetViewportToPoint) { let newCoord = action.coordinate if ( + action.bearing != state.bearing || + action.pitch != state.pitch || action.zoom != state.zoom || // avoid jitter a bit if location is permanently updated distCalc(newCoord.lat, newCoord.lng, state.latitude, state.longitude) > 5 From 956d4164857e1afbbe7f8f9874e377d0040bfd8a Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 25 Aug 2021 12:56:18 +0200 Subject: [PATCH 057/322] make turn sign larger, move street to right --- src/App.module.css | 2 +- src/turnNavigation/TurnNavigation.module.css | 17 +++++++------- src/turnNavigation/TurnNavigation.tsx | 24 +++++++++++--------- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/App.module.css b/src/App.module.css index d26a1831..ef39f296 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -44,7 +44,7 @@ grid-column: 1 / span 1; grid-row: 1 / span 1; z-index: 5; - max-height: 7em; + max-height: 6em; margin: 0.5rem; padding: 0.5rem; diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index aca5dbc5..abf10cea 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -3,24 +3,25 @@ padding: 0.5rem; } +.turnInfoRightSide { + display: flex; + width: 100%; + flex-direction: column; + justify-content: space-between; +} + .turnSign img { - max-height: 2.5rem; + max-height: 4rem; } .turnSign { padding-left: 0.3rem; - font-size: smaller; - min-width: 20%; + min-width: 25%; flex-direction: column; font-weight: bold; } -.turnText { - padding: 0.5rem 0.8rem; -} - .arrival { - width: 100%; display: flex; font-size: larger; flex-direction: row; diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 90a87250..a55e33d6 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -44,20 +44,22 @@ export default function ({ path, location }: TurnNavigationProps) {
{metersToText(distanceToNext)}
-
-
-
{milliSecondsToText(remainingTime)}
-
{metersToText(remainingDistance)}
-
-
- {arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)} -
-
getLocationStore().stop()}> - +
+
+
+
{milliSecondsToText(remainingTime)}
+
{metersToText(remainingDistance)}
+
+
+ {arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)} +
+
getLocationStore().stop()}> + +
+
{nextInstruction.street_name}
-
{nextInstruction.street_name}
) From 9941099b2ba6935e8ed22b51036a27fecf2b53e9 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 25 Aug 2021 16:14:59 +0200 Subject: [PATCH 058/322] before turn speak out instruction text, not sure if this is a misusage of useEffect and useState ... --- src/App.tsx | 2 +- src/stores/LocationStore.ts | 6 +++++- src/turnNavigation/TurnNavigation.tsx | 10 ++++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 20269eef..63af3461 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react' +import React, { Dispatch, SetStateAction, useEffect, useState } from 'react' import PathDetails from '@/pathDetails/PathDetails' import styles from './App.module.css' import { diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 2ad88f0e..2be5f250 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -15,7 +15,7 @@ export default class LocationStore extends Store { private watchId: any = undefined private interval: any private noSleep: any - private speechSynthesizer: SpeechSynthesizer + private readonly speechSynthesizer: SpeechSynthesizer private started: boolean = false constructor(speechSynthesizer: SpeechSynthesizer) { @@ -23,6 +23,10 @@ export default class LocationStore extends Store { this.speechSynthesizer = speechSynthesizer } + public getSpeechSynthesizer(): SpeechSynthesizer { + return this.speechSynthesizer + } + protected getInitialState(): LocationStoreState { return { turnNavigation: false, diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index a55e33d6..26da665b 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, { useEffect, useState } from 'react' import { Path, Instruction } from '@/api/graphhopper' import { metersToText, milliSecondsToText } from '@/Converters' import { getSignName } from '@/sidebar/instructions/Instructions' @@ -7,7 +7,6 @@ import styles from '@/turnNavigation/TurnNavigation.module.css' import endNavigation from '@/turnNavigation/end_turn_navigation.png' import { getLocationStore } from '@/stores/Stores' import { LocationStoreState } from '@/stores/LocationStore' -import { tr } from '@/translation/Translation' type TurnNavigationProps = { path: Path @@ -30,6 +29,13 @@ export default function ({ path, location }: TurnNavigationProps) { const nextInstruction: Instruction = path.instructions[instructionIndex] + // after render if index changed and distance is close next instruction speak text out loud + const [oldIndex] = useState(-1) + useEffect(() => { + if (distanceToNext < 40 && oldIndex != instructionIndex) + getLocationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) + }, [oldIndex, distanceToNext]) + // TODO better approximation via estimating taken time const arrivalDate = new Date() arrivalDate.setMilliseconds(arrivalDate.getSeconds() + remainingTime) From 29fcf0e15ba34d74f750682c9c478ab29a8a6ac4 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 25 Aug 2021 16:42:59 +0200 Subject: [PATCH 059/322] allow to disable sound --- NOTICE.md | 4 ++-- src/sidebar/RoutingResults.tsx | 2 +- src/turnNavigation/TurnNavigation.tsx | 9 ++++++++- src/turnNavigation/volume_off.svg | 1 + src/turnNavigation/volume_up.svg | 1 + 5 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 src/turnNavigation/volume_off.svg create mode 100644 src/turnNavigation/volume_up.svg diff --git a/NOTICE.md b/NOTICE.md index 4d89caa2..21c1f26c 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -6,5 +6,5 @@ Copyright 2020 - 2021 GraphHopper GmbH It includes the following software and creative work: - * see package.json for the direct dependencies - * "my location" image from Google Fonts - Apache License 2.0 \ No newline at end of file +- see package.json for the direct dependencies +- "my location" and "volume up/off" images from Google Fonts - Apache License 2.0 diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 2e5f7831..05cde9dc 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -45,7 +45,7 @@ function RoutingResult({ path, isSelected }: { path: Path; isSelected: boolean } {metersToText(path.distance)}
- getLocationStore().initReal()} src={startNavigation} /> + getLocationStore().initFake()} src={startNavigation} />
{isSelected && ( setExpanded(!isExpanded)}> diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 26da665b..c2498dbb 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -5,8 +5,11 @@ import { getSignName } from '@/sidebar/instructions/Instructions' import { getCurrentInstruction } from './GeoMethods' import styles from '@/turnNavigation/TurnNavigation.module.css' import endNavigation from '@/turnNavigation/end_turn_navigation.png' +import VolumeUpIcon from '@/turnNavigation/volume_up.svg' +import VolumeOffIcon from '@/turnNavigation/volume_off.svg' import { getLocationStore } from '@/stores/Stores' import { LocationStoreState } from '@/stores/LocationStore' +import PlainButton from '@/PlainButton' type TurnNavigationProps = { path: Path @@ -31,8 +34,9 @@ export default function ({ path, location }: TurnNavigationProps) { // after render if index changed and distance is close next instruction speak text out loud const [oldIndex] = useState(-1) + const [sound, setSound] = useState(true) useEffect(() => { - if (distanceToNext < 40 && oldIndex != instructionIndex) + if (distanceToNext < 40 && oldIndex != instructionIndex && sound) getLocationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) }, [oldIndex, distanceToNext]) @@ -52,6 +56,9 @@ export default function ({ path, location }: TurnNavigationProps) {
+ setSound(!sound)}> + {sound ? : } +
{milliSecondsToText(remainingTime)}
{metersToText(remainingDistance)}
diff --git a/src/turnNavigation/volume_off.svg b/src/turnNavigation/volume_off.svg new file mode 100644 index 00000000..85e11a55 --- /dev/null +++ b/src/turnNavigation/volume_off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/turnNavigation/volume_up.svg b/src/turnNavigation/volume_up.svg new file mode 100644 index 00000000..cb56f655 --- /dev/null +++ b/src/turnNavigation/volume_up.svg @@ -0,0 +1 @@ + \ No newline at end of file From 50746bac3c14e1409f297b279724d940f70b6ac3 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 25 Aug 2021 16:43:29 +0200 Subject: [PATCH 060/322] use real coords --- src/sidebar/RoutingResults.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 05cde9dc..2e5f7831 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -45,7 +45,7 @@ function RoutingResult({ path, isSelected }: { path: Path; isSelected: boolean } {metersToText(path.distance)}
- getLocationStore().initFake()} src={startNavigation} /> + getLocationStore().initReal()} src={startNavigation} />
{isSelected && ( setExpanded(!isExpanded)}> From d93c40c3b29c22538961a4c6979484d2f02e184d Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 25 Aug 2021 17:55:50 +0200 Subject: [PATCH 061/322] avoid reading instructions close the turn --- src/stores/LocationStore.ts | 1 + src/turnNavigation/TurnNavigation.tsx | 30 ++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 2be5f250..cf16f2f5 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -54,6 +54,7 @@ export default class LocationStore extends Store { const latlon: number[][] = [ [51.439291, 14.245254, 180], [51.438989, 14.245405, 180], + [51.438895, 14.245191, 180], [51.438694, 14.245577, 90], [51.438668, 14.246092, 90], [51.438226, 14.246972, 180], diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index c2498dbb..c778b6c6 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react' +import React, { useState, useReducer, useEffect } from 'react' import { Path, Instruction } from '@/api/graphhopper' import { metersToText, milliSecondsToText } from '@/Converters' import { getSignName } from '@/sidebar/instructions/Instructions' @@ -32,13 +32,33 @@ export default function ({ path, location }: TurnNavigationProps) { const nextInstruction: Instruction = path.instructions[instructionIndex] - // after render if index changed and distance is close next instruction speak text out loud - const [oldIndex] = useState(-1) const [sound, setSound] = useState(true) + // not sure how to access old state with useState alone + function reducer( + state: { distanceToNext: number; index: number }, + action: { distanceToNext: number; index: number } + ) { + return action + } + const [state, dispatch] = useReducer(reducer, { index: -1, distanceToNext: -1 }) + + // after render if index changed and distance is close next instruction speak text out loud useEffect(() => { - if (distanceToNext < 40 && oldIndex != instructionIndex && sound) + console.log( + 'useEffect', + state, + { index: instructionIndex, distanceToNext: distanceToNext }, + nextInstruction.text + ) + dispatch({ index: instructionIndex, distanceToNext: distanceToNext }) + + if ( + sound && + distanceToNext < 40 && + ((distanceToNext < 40 && state.distanceToNext > 40) || instructionIndex != state.index) + ) getLocationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) - }, [oldIndex, distanceToNext]) + }, [instructionIndex, distanceToNext]) // TODO better approximation via estimating taken time const arrivalDate = new Date() From 072195dc2ad4614de1c2b3d00ec04e53527cd307 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 25 Aug 2021 18:00:10 +0200 Subject: [PATCH 062/322] remove duplicate info in if statement --- src/turnNavigation/TurnNavigation.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index c778b6c6..8a66f814 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -52,11 +52,7 @@ export default function ({ path, location }: TurnNavigationProps) { ) dispatch({ index: instructionIndex, distanceToNext: distanceToNext }) - if ( - sound && - distanceToNext < 40 && - ((distanceToNext < 40 && state.distanceToNext > 40) || instructionIndex != state.index) - ) + if (sound && distanceToNext < 40 && (state.distanceToNext > 40 || instructionIndex != state.index)) getLocationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) }, [instructionIndex, distanceToNext]) From dc181d8f5f4242fbcdcecd5396673eced21b3428 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 25 Aug 2021 22:17:06 +0200 Subject: [PATCH 063/322] show speed from GPS --- src/actions/Actions.ts | 4 ++- src/stores/LocationStore.ts | 35 +++++++++++++++------------ src/turnNavigation/TurnNavigation.tsx | 5 +++- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 60898e40..045e145b 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -17,10 +17,12 @@ export class InfoReceived implements Action { export class LocationUpdate implements Action { readonly coordinate: Coordinate readonly turnNavigation: boolean + readonly speed: number - constructor(coordinate: Coordinate, turnNavigation: boolean) { + constructor(coordinate: Coordinate, turnNavigation: boolean, speed: number) { this.coordinate = coordinate this.turnNavigation = turnNavigation + this.speed = speed } } diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index cf16f2f5..e2060a58 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -9,6 +9,7 @@ import { tr } from '@/translation/Translation' export interface LocationStoreState { turnNavigation: boolean coordinate: Coordinate + speed: number } export default class LocationStore extends Store { @@ -31,6 +32,7 @@ export default class LocationStore extends Store { return { turnNavigation: false, coordinate: { lat: 0, lng: 0 }, + speed: 0, } } @@ -40,6 +42,7 @@ export default class LocationStore extends Store { return { turnNavigation: action.turnNavigation, coordinate: action.coordinate, + speed: action.speed, } } return state @@ -52,19 +55,19 @@ export default class LocationStore extends Store { // TODO randomize a route const latlon: number[][] = [ - [51.439291, 14.245254, 180], - [51.438989, 14.245405, 180], - [51.438895, 14.245191, 180], - [51.438694, 14.245577, 90], - [51.438668, 14.246092, 90], - [51.438226, 14.246972, 180], - [51.436795, 14.245921, 180], - [51.435029, 14.243259, 270], - [51.435203, 14.241006, 270], - [51.434788, 14.238882, 180], - [51.434146, 14.237745, 270], - [51.433959, 14.235985, 180], - [51.43322, 14.2349991, 270], + [51.439291, 14.245254, 180, 0], + [51.438989, 14.245405, 180, 10], + [51.438895, 14.245191, 180, 10], + [51.438694, 14.245577, 90, 30], + [51.438668, 14.246092, 90, 30], + [51.438226, 14.246972, 180, 40], + [51.436795, 14.245921, 180, 40], + [51.435029, 14.243259, 270, 40], + [51.435203, 14.241006, 270, 35], + [51.434788, 14.238882, 180, 20], + [51.434146, 14.237745, 270, 10], + [51.433959, 14.235985, 180, 20], + [51.43322, 14.2349991, 270, 10], ] let currentIndex: number = 0 this.locationUpdate({ @@ -72,6 +75,7 @@ export default class LocationStore extends Store { latitude: latlon[currentIndex][0], longitude: latlon[currentIndex][1], heading: latlon[currentIndex][2], + speed: latlon[currentIndex][3], }, }) @@ -84,6 +88,7 @@ export default class LocationStore extends Store { latitude: latlon[currentIndex][0], longitude: latlon[currentIndex][1], heading: latlon[currentIndex][2], + speed: latlon[currentIndex][3], }, }) }, 3000) @@ -92,7 +97,7 @@ export default class LocationStore extends Store { private locationUpdate(pos: any) { console.log('locationUpdate = success handler') let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } - Dispatcher.dispatch(new LocationUpdate(c, true)) + Dispatcher.dispatch(new LocationUpdate(c, true, pos.coords.speed)) let bearing: number = pos.coords.heading if (Number.isNaN(bearing)) bearing = 0 Dispatcher.dispatch(new SetViewportToPoint(c, 17, 50, bearing)) @@ -144,7 +149,7 @@ export default class LocationStore extends Store { Dispatcher.dispatch(new SetViewportToPoint(this.state.coordinate, 15, 0, 0)) // directly writing the state does not work: this.state.turnNavigation = false - Dispatcher.dispatch(new LocationUpdate({ lat: 0, lng: 0 }, false)) + Dispatcher.dispatch(new LocationUpdate({ lat: 0, lng: 0 }, false, 0)) if (this.noSleep) this.noSleep.disable() diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 8a66f814..ae51a8c7 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -80,7 +80,10 @@ export default function ({ path, location }: TurnNavigationProps) {
{metersToText(remainingDistance)}
- {arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)} +
{arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)}
+
+ {Math.round(location.speed)} km/h +
getLocationStore().stop()}> From 600926664b20891ff6f9c19c4d0da43302626345 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 26 Aug 2021 11:29:54 +0200 Subject: [PATCH 064/322] speed: fix unit --- src/actions/Actions.ts | 2 +- src/turnNavigation/TurnNavigation.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 045e145b..2a9aaae0 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -22,7 +22,7 @@ export class LocationUpdate implements Action { constructor(coordinate: Coordinate, turnNavigation: boolean, speed: number) { this.coordinate = coordinate this.turnNavigation = turnNavigation - this.speed = speed + this.speed = !speed || speed == null ? 0 : speed } } diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index ae51a8c7..e11919b4 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -82,7 +82,7 @@ export default function ({ path, location }: TurnNavigationProps) {
{arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)}
- {Math.round(location.speed)} km/h + {Math.round(location.speed * 3.6)} km/h
getLocationStore().stop()}> From 5542e21acbb46faf790fa0c79c4d851aa5a64fa3 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 27 Aug 2021 12:15:18 +0200 Subject: [PATCH 065/322] attempt to fix dragging bug; avoid setting bearing forcefully to 0 if standing still while navigation; improved LocationUpdate action --- src/actions/Actions.ts | 12 ++++-------- src/layers/CurrentLocationLayer.tsx | 2 +- src/stores/LocationStore.ts | 27 ++++++++++++--------------- src/stores/ViewportStore.ts | 10 ++++++++-- 4 files changed, 25 insertions(+), 26 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 2a9aaae0..2ddcbea4 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -4,6 +4,7 @@ import { ApiInfo, Bbox, Path, RoutingArgs, RoutingProfile, RoutingResult } from import { StyleOption } from '@/stores/MapOptionsStore' import { PathDetailsPoint } from '@/stores/PathDetailsStore' import { ViewportStoreState } from '@/stores/ViewportStore' +import { LocationStoreState } from '@/stores/LocationStore' export class InfoReceived implements Action { readonly result: ApiInfo @@ -13,16 +14,11 @@ export class InfoReceived implements Action { } } -// TODO identical to LocationStoreState? export class LocationUpdate implements Action { - readonly coordinate: Coordinate - readonly turnNavigation: boolean - readonly speed: number + readonly location: LocationStoreState - constructor(coordinate: Coordinate, turnNavigation: boolean, speed: number) { - this.coordinate = coordinate - this.turnNavigation = turnNavigation - this.speed = !speed || speed == null ? 0 : speed + constructor(location: LocationStoreState) { + this.location = location } } diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index 17bc6b08..89c837b5 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -20,7 +20,7 @@ export default function (coordinate: Coordinate): MapLayer { } return { - interactiveLayerIds: [currentLocationLayerKey], + interactiveLayerIds: [], onClick: (feature: any) => {}, layer: ( diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index e2060a58..f2d292aa 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -38,12 +38,8 @@ export default class LocationStore extends Store { reduce(state: LocationStoreState, action: Action): LocationStoreState { if (action instanceof LocationUpdate) { - console.log('LocationUpdate {}', action) - return { - turnNavigation: action.turnNavigation, - coordinate: action.coordinate, - speed: action.speed, - } + console.log('LocationUpdate action {}', action.location) + return action.location } return state } @@ -95,12 +91,14 @@ export default class LocationStore extends Store { } private locationUpdate(pos: any) { - console.log('locationUpdate = success handler') + // TODO NOW: 'this is undefined' if called from watchPosition: if (!this.started) return + let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } - Dispatcher.dispatch(new LocationUpdate(c, true, pos.coords.speed)) + Dispatcher.dispatch(new LocationUpdate({ coordinate: c, turnNavigation: true, speed: pos.coords.speed })) let bearing: number = pos.coords.heading - if (Number.isNaN(bearing)) bearing = 0 - Dispatcher.dispatch(new SetViewportToPoint(c, 17, 50, bearing)) + + if (Number.isNaN(bearing)) console.log('skip dispatching SetViewportToPoint because bearing is ' + bearing) + else Dispatcher.dispatch(new SetViewportToPoint(c, 17, 50, bearing)) } public initReal() { @@ -110,8 +108,8 @@ export default class LocationStore extends Store { if (!navigator.geolocation) { console.log('location not supported. In firefox I had to set geo.enabled=true in about:config') } else { - console.log('location init') - this.speechSynthesizer.synthesize(tr('welcome')) + console.log('location init ', this.watchId) + // this.speechSynthesizer.synthesize(tr('welcome')) // force calling clearWatch can help to find GPS fix more reliable in android firefox if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) @@ -138,6 +136,7 @@ export default class LocationStore extends Store { } public stop() { + console.log('LocationStore.stop', this.watchId, this.interval) if (document.fullscreenElement) document.exitFullscreen() this.started = false @@ -149,10 +148,8 @@ export default class LocationStore extends Store { Dispatcher.dispatch(new SetViewportToPoint(this.state.coordinate, 15, 0, 0)) // directly writing the state does not work: this.state.turnNavigation = false - Dispatcher.dispatch(new LocationUpdate({ lat: 0, lng: 0 }, false, 0)) + Dispatcher.dispatch(new LocationUpdate({ coordinate: { lat: 0, lng: 0 }, turnNavigation: false, speed: 0 })) if (this.noSleep) this.noSleep.disable() - - console.log('stopped location updates ' + this.watchId + ', ' + this.interval) } } diff --git a/src/stores/ViewportStore.ts b/src/stores/ViewportStore.ts index 07519920..7f05121a 100644 --- a/src/stores/ViewportStore.ts +++ b/src/stores/ViewportStore.ts @@ -56,13 +56,19 @@ export default class ViewportStore extends Store { } } reduce(state: ViewportStoreState, action: Action): ViewportStoreState { + console.log('ViewportStore.reduce', Object.getPrototypeOf(action).constructor.name, action) const isSmallScreen = this.isSmallScreenQuery() if (action instanceof SetViewport) { return action.viewport } else if (action instanceof SetViewportToPoint) { + // if bearing is null it would cause an exception "bearing must be supplied for transition" while dragging the current location + // out of the current view port and the complete screen gets gray after that although location updates still happen + let bearing = action.bearing + if (bearing == null) bearing = action.pitch > 0 ? state.bearing : 0 // use old bearing if turn navigation (i.e. pitch > 0) + let newCoord = action.coordinate if ( - action.bearing != state.bearing || + bearing != state.bearing || action.pitch != state.pitch || action.zoom != state.zoom || // avoid jitter a bit if location is permanently updated @@ -73,7 +79,7 @@ export default class ViewportStore extends Store { longitude: newCoord.lng, latitude: newCoord.lat, zoom: action.zoom, - bearing: action.bearing, + bearing: bearing, pitch: action.pitch, } } else if (action instanceof InfoReceived) { From 731f3f1081505cd5f8ae1b44e751e895985262e4 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 27 Aug 2021 13:45:01 +0200 Subject: [PATCH 066/322] debug info in UI --- src/stores/LocationStore.ts | 52 +++++++++++++++++---------- src/turnNavigation/TurnNavigation.tsx | 26 ++++++++++---- 2 files changed, 53 insertions(+), 25 deletions(-) diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index f2d292aa..c9895e15 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -44,27 +44,41 @@ export default class LocationStore extends Store { return state } - // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car public initFake() { this.started = true - this.speechSynthesizer.synthesize(tr('fake_welcome')) - - // TODO randomize a route - const latlon: number[][] = [ - [51.439291, 14.245254, 180, 0], - [51.438989, 14.245405, 180, 10], - [51.438895, 14.245191, 180, 10], - [51.438694, 14.245577, 90, 30], - [51.438668, 14.246092, 90, 30], - [51.438226, 14.246972, 180, 40], - [51.436795, 14.245921, 180, 40], - [51.435029, 14.243259, 270, 40], - [51.435203, 14.241006, 270, 35], - [51.434788, 14.238882, 180, 20], - [51.434146, 14.237745, 270, 10], - [51.433959, 14.235985, 180, 20], - [51.43322, 14.2349991, 270, 10], - ] + + let route = 2 + let latlon: number[][] + if (route == 1) { + // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car + latlon = [ + [51.439291, 14.245254, 180, 0], + [51.438989, 14.245405, 180, 3], + [51.438895, 14.245191, 180, 3], + [51.438694, 14.245577, 90, 8], + [51.438668, 14.246092, 90, 8], + [51.438226, 14.246972, 180, 11], + [51.436795, 14.245921, 180, 11], + [51.435029, 14.243259, 270, 11], + [51.435203, 14.241006, 270, 10], + [51.434788, 14.238882, 180, 4], + [51.434146, 14.237745, 270, 2], + [51.433959, 14.235985, 180, 5], + [51.43322, 14.2349991, 270, 3], + ] + } else { + // http://localhost:3000/?point=51.438818%2C14.243717&point=51.437858%2C14.244785&point=51.438181%2C14.242442&profile=foot + latlon = [ + [51.4388, 14.243857, 110, 1], + [51.438727, 14.244184, 200, 1], + [51.43836, 14.243954, 200, 1], + [51.438176, 14.244002, 120, 1], + [51.438108, 14.244266, 120, 1], + [51.43801, 14.244584, 120, 1], + [51.43791, 14.244783, 150, 1], + [51.437733, 14.244692, 210, 2], + ] + } let currentIndex: number = 0 this.locationUpdate({ coords: { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index e11919b4..73429389 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -35,12 +35,12 @@ export default function ({ path, location }: TurnNavigationProps) { const [sound, setSound] = useState(true) // not sure how to access old state with useState alone function reducer( - state: { distanceToNext: number; index: number }, - action: { distanceToNext: number; index: number } + state: { distanceToNext: number; index: number; spokeText: string }, + action: { distanceToNext: number; index: number; spokeText: string } ) { return action } - const [state, dispatch] = useReducer(reducer, { index: -1, distanceToNext: -1 }) + const [state, dispatch] = useReducer(reducer, { index: -1, distanceToNext: -1, spokeText: '' }) // after render if index changed and distance is close next instruction speak text out loud useEffect(() => { @@ -50,10 +50,24 @@ export default function ({ path, location }: TurnNavigationProps) { { index: instructionIndex, distanceToNext: distanceToNext }, nextInstruction.text ) - dispatch({ index: instructionIndex, distanceToNext: distanceToNext }) - if (sound && distanceToNext < 40 && (state.distanceToNext > 40 || instructionIndex != state.index)) + let info = + 'dist=' + + distanceToNext + + '(' + + state.distanceToNext + + '), idx=' + + instructionIndex + + '(' + + state.index + + ')' + let nowText = ', ' + info + if (sound && distanceToNext < 40 && (state.distanceToNext > 40 || instructionIndex != state.index)) { getLocationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) + nowText = nextInstruction.text + ', ' + info + } + + dispatch({ index: instructionIndex, distanceToNext: distanceToNext, spokeText: nowText }) }, [instructionIndex, distanceToNext]) // TODO better approximation via estimating taken time @@ -89,7 +103,7 @@ export default function ({ path, location }: TurnNavigationProps) {
-
{nextInstruction.street_name}
+
{state.spokeText}
From a6c731bd5640dd3f1a6f95b9fcd3ec144f8ae74f Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 27 Aug 2021 13:55:33 +0200 Subject: [PATCH 067/322] bug fix to avoid skipping sound --- src/turnNavigation/TurnNavigation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 73429389..287ce593 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -62,7 +62,7 @@ export default function ({ path, location }: TurnNavigationProps) { state.index + ')' let nowText = ', ' + info - if (sound && distanceToNext < 40 && (state.distanceToNext > 40 || instructionIndex != state.index)) { + if (sound && distanceToNext <= 40 && (state.distanceToNext > 40 || instructionIndex != state.index)) { getLocationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) nowText = nextInstruction.text + ', ' + info } From cea2793253dcddbd9df4da0ff72f8a5d8a1b3f1f Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 27 Aug 2021 14:36:56 +0200 Subject: [PATCH 068/322] earlier instruction for car --- src/stores/LocationStore.ts | 3 +-- src/turnNavigation/TurnNavigation.tsx | 39 +++++++++++++-------------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index c9895e15..ec5a5de6 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -4,7 +4,6 @@ import { ErrorAction, LocationUpdate, SetViewportToPoint } from '@/actions/Actio import Dispatcher, { Action } from '@/stores/Dispatcher' import NoSleep from 'nosleep.js' import { SpeechSynthesizer } from '@/SpeechSynthesizer' -import { tr } from '@/translation/Translation' export interface LocationStoreState { turnNavigation: boolean @@ -47,7 +46,7 @@ export default class LocationStore extends Store { public initFake() { this.started = true - let route = 2 + let route = 1 let latlon: number[][] if (route == 1) { // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 287ce593..2bf1ad47 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -35,14 +35,14 @@ export default function ({ path, location }: TurnNavigationProps) { const [sound, setSound] = useState(true) // not sure how to access old state with useState alone function reducer( - state: { distanceToNext: number; index: number; spokeText: string }, - action: { distanceToNext: number; index: number; spokeText: string } + state: { distanceToNext: number; index: number; text: string }, + action: { distanceToNext: number; index: number; text: string } ) { return action } - const [state, dispatch] = useReducer(reducer, { index: -1, distanceToNext: -1, spokeText: '' }) + const [state, dispatch] = useReducer(reducer, { index: -1, distanceToNext: -1, text: '' }) - // after render if index changed and distance is close next instruction speak text out loud + // speak text out loud after render only if index changed and distance is close next instruction useEffect(() => { console.log( 'useEffect', @@ -51,23 +51,22 @@ export default function ({ path, location }: TurnNavigationProps) { nextInstruction.text ) - let info = - 'dist=' + - distanceToNext + - '(' + - state.distanceToNext + - '), idx=' + - instructionIndex + - '(' + - state.index + - ')' - let nowText = ', ' + info - if (sound && distanceToNext <= 40 && (state.distanceToNext > 40 || instructionIndex != state.index)) { - getLocationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) - nowText = nextInstruction.text + ', ' + info + let text = nextInstruction.street_name + if (sound) { + // making closeDistance dependent on location.speed is tricky because then it can change while driving, so pick the constant average speed + let averageSpeed = (path.distance / (path.time / 1000)) * 3.6 + let closeDistance = 40 + 2 * Math.round(averageSpeed / 10) * 10 + if ( + distanceToNext <= closeDistance && + (state.distanceToNext > closeDistance || instructionIndex != state.index) + ) { + getLocationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) + //TODO enable debugging to UI via URL param: + //text = closeDistance + ', ' + distanceToNext + ', ' + instructionIndex + } } - dispatch({ index: instructionIndex, distanceToNext: distanceToNext, spokeText: nowText }) + dispatch({ index: instructionIndex, distanceToNext: distanceToNext, text: text }) }, [instructionIndex, distanceToNext]) // TODO better approximation via estimating taken time @@ -103,7 +102,7 @@ export default function ({ path, location }: TurnNavigationProps) { -
{state.spokeText}
+
{state.text}
From 63941ee2bc82f70c3ebb93f97ec598b3b6ae41d4 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 27 Aug 2021 14:37:40 +0200 Subject: [PATCH 069/322] this TODO is already done --- src/turnNavigation/TurnNavigation.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 2bf1ad47..b629000c 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -69,7 +69,6 @@ export default function ({ path, location }: TurnNavigationProps) { dispatch({ index: instructionIndex, distanceToNext: distanceToNext, text: text }) }, [instructionIndex, distanceToNext]) - // TODO better approximation via estimating taken time const arrivalDate = new Date() arrivalDate.setMilliseconds(arrivalDate.getSeconds() + remainingTime) const min = arrivalDate.getMinutes() From f0148d2fe9eb20d2dc97e49e717613327f2c4ffd Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 28 Aug 2021 10:48:26 +0200 Subject: [PATCH 070/322] smaller closeDistance --- src/turnNavigation/TurnNavigation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index b629000c..91470324 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -55,7 +55,7 @@ export default function ({ path, location }: TurnNavigationProps) { if (sound) { // making closeDistance dependent on location.speed is tricky because then it can change while driving, so pick the constant average speed let averageSpeed = (path.distance / (path.time / 1000)) * 3.6 - let closeDistance = 40 + 2 * Math.round(averageSpeed / 10) * 10 + let closeDistance = 10 + 2 * Math.round(averageSpeed / 5) * 5 if ( distanceToNext <= closeDistance && (state.distanceToNext > closeDistance || instructionIndex != state.index) From 4bce917a93805ffda2cdba4e4fbb4e34e9a42d6b Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 5 Sep 2021 15:03:26 +0200 Subject: [PATCH 071/322] second announcement 1km before turn --- src/translation/tr.json | 836 +++++++++++++++++++------- src/turnNavigation/TurnNavigation.tsx | 27 +- update-translations.py | 2 + 3 files changed, 639 insertions(+), 226 deletions(-) diff --git a/src/translation/tr.json b/src/translation/tr.json index 2c0270ee..efa8b5c4 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -1,11 +1,11 @@ {"en_US":{ -"search_button":"Search", -"from_hint":"From", "via_hint":"Via", -"to_hint":"To", -"more_button":"more", +"from_hint":"From", "gpx_export_button":"GPX export", +"to_hint":"To", "route_info":"%1$s will take %2$s", +"search_button":"Search", +"more_button":"more", "pt_route_info":"arrives at %1$s with %2$s transfers (%3$s)", "pt_route_info_walking":"arrives at %1$s with just walking (%2$s)", "locations_not_found":"Routing not possible. Location(s) not found in the area.", @@ -41,16 +41,25 @@ "route_request_failed":"Route request failed", "current_location":"Current Location", "searching_location":"Searching location", -"searching_location_failed":"Searching location failed" +"searching_location_failed":"Searching location failed", +"in_km_singular":"In 1 kilometer", +"in_km":"In %1$s kilometers", +"in_m":"In %1$s meters", +"for_km":"for %1$s kilometers", +"then":"then", +"in_mi_singular":"In 1 mile", +"in_mi":"In %1$s miles", +"in_ft":"In %1$s feet", +"for_mi":"for %1$s miles" }, "ar":{ -"search_button":"ابحث", -"from_hint":"من", "via_hint":"خلال", -"to_hint":"إلي", -"more_button":"المزيد", +"from_hint":"من", "gpx_export_button":"GPX التصدير", +"to_hint":"إلي", "route_info":"%1$s ستاخذ %2$s", +"search_button":"ابحث", +"more_button":"المزيد", "pt_route_info":"وصول سعت %1$s مع %2$s انتقال (%3$s)", "pt_route_info_walking":"الوصول عند %1$s مشياً (%2$s)", "locations_not_found":"لا يوجد طريق من هذه المنطقة", @@ -86,16 +95,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "ast":{ -"search_button":"Buscar", -"from_hint":"Dende", "via_hint":"Pasando per", -"to_hint":"Fasta", -"more_button":"más", +"from_hint":"Dende", "gpx_export_button":"Esportar GPX", +"to_hint":"Fasta", "route_info":"%1$s tardaràs %2$s", +"search_button":"Buscar", +"more_button":"más", "pt_route_info":"llegada a les %1$s con %2$s tresbordos (%3$s)", "pt_route_info_walking":"llegada a les %1$s sólo caminando (%2$s)", "locations_not_found":"Nun se puede trazar una ruta. Dalgún llugar nun s'alcuentra nel área", @@ -131,16 +149,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "bg":{ -"search_button":"Търсене", -"from_hint":"От", "via_hint":"през", -"to_hint":"До", -"more_button":"още", +"from_hint":"От", "gpx_export_button":"GPX експорт", +"to_hint":"До", "route_info":"%1$s ще отнемат %2$s", +"search_button":"Търсене", +"more_button":"още", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"Не са изтеглени упътвания. Търсеното местоположение не е открито.", @@ -176,16 +203,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "bn_BN":{ -"search_button":"", -"from_hint":"", "via_hint":"", -"to_hint":"", -"more_button":"", +"from_hint":"", "gpx_export_button":"", +"to_hint":"", "route_info":"", +"search_button":"", +"more_button":"", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"", @@ -221,16 +257,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "ca":{ -"search_button":"Cerca", -"from_hint":"Des de", "via_hint":"Passant per", -"to_hint":"Cap a", -"more_button":"més", +"from_hint":"Des de", "gpx_export_button":"Exporta a GPX", +"to_hint":"Cap a", "route_info":"%1$s trigaràs %2$s", +"search_button":"Cerca", +"more_button":"més", "pt_route_info":"arriba a les %1$s amb %2$s transbordaments (%3$s)", "pt_route_info_walking":"arriba caminant a les %1$s (%2$s)", "locations_not_found":"No hi ha cap ruta. El destí no es troba dins l'àrea.", @@ -266,16 +311,25 @@ "route_request_failed":"Ha fallat la resolució de la ruta.", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"En un quilòmetre", +"in_km":"En %1$s quilòmetres", +"in_m":"En %1$s metres", +"for_km":"per %1$s quilòmetres", +"then":"després", +"in_mi_singular":"En una milla", +"in_mi":"En %1$s milles", +"in_ft":"En %1$s peus", +"for_mi":"per %1$s milles" }, "cs_CZ":{ -"search_button":"Vyhledat", -"from_hint":"Z", "via_hint":"Přes ", -"to_hint":"Do", -"more_button":"více", +"from_hint":"Z", "gpx_export_button":"Export do GPX", +"to_hint":"Do", "route_info":"%1$s bude trvat %2$s", +"search_button":"Vyhledat", +"more_button":"více", "pt_route_info":"dorazí v %1$s, %2$s přestup(y) (%3$s) ", "pt_route_info_walking":"dorazí v %1$s (%2$s)", "locations_not_found":"Navigování není dostupné. Pozice nenalezena v této oblasti.", @@ -311,16 +365,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "da_DK":{ -"search_button":"Søg", -"from_hint":"Fra ", "via_hint":"Via", -"to_hint":"Til", -"more_button":"mere", +"from_hint":"Fra ", "gpx_export_button":"Eksportér GPX-fil", +"to_hint":"Til", "route_info":"%1$s med køretid %2$s", +"search_button":"Søg", +"more_button":"mere", "pt_route_info":"ankommer %1$s med %2$s omstigninger (%3$s)", "pt_route_info_walking":"ankommer til fods %1$s (%2$s)", "locations_not_found":"Kan ikke beregne ruten. Lokation(erne) kan ikke findes i området.", @@ -356,16 +419,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "de_DE":{ -"search_button":"Suche", -"from_hint":"Von", "via_hint":"Über", -"to_hint":"Nach", -"more_button":"mehr", +"from_hint":"Von", "gpx_export_button":"GPX export", +"to_hint":"Nach", "route_info":"%1$s werden %2$s brauchen", +"search_button":"Suche", +"more_button":"mehr", "pt_route_info":"Ankunft %1$s mit %2$s Umstiegen (%3$s)", "pt_route_info_walking":"Ankunft zu Fuß %1$s (%2$s)", "locations_not_found":"Routing war nicht möglich. Ort(e) nicht gefunden in diesem Gebiet.", @@ -401,16 +473,25 @@ "route_request_failed":"Route konnte nicht berechnet werden", "current_location":"Aktueller Standort", "searching_location":"Suche Standort", -"searching_location_failed":"Standortsuche fehlgeschlagen" +"searching_location_failed":"Standortsuche fehlgeschlagen", +"in_km_singular":"In 1 Kilometer", +"in_km":"In %1$s Kilometern", +"in_m":"In %1$s Metern", +"for_km":"für %1$s Kilometer", +"then":"dann", +"in_mi_singular":"In 1 Meile", +"in_mi":"In %1$s Meilen", +"in_ft":"In %1$s Fuß", +"for_mi":"für %1$s Meilen" }, "el":{ -"search_button":"Αναζήτηση", -"from_hint":"Αφετηρία", "via_hint":"Μέσω", -"to_hint":"Προορισμός", -"more_button":"περισσότερα", +"from_hint":"Αφετηρία", "gpx_export_button":"Εξαγωγή GPX", +"to_hint":"Προορισμός", "route_info":"%1$s σε %2$s", +"search_button":"Αναζήτηση", +"more_button":"περισσότερα", "pt_route_info":"φτάνει στις %1$s με %2$s μεταβιβάσεις (%3$s)", "pt_route_info_walking":"φτάνει στις %1$s απλά περπατώντας (%2$s)", "locations_not_found":"Η δρομολόγηση δεν είναι δυνατή. Οι τοποθεσίες δεν βρέθηκαν στην περιοχή.", @@ -446,16 +527,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "eo":{ -"search_button":"Serĉi", -"from_hint":"El", "via_hint":"Tra", -"to_hint":"Al", -"more_button":"pli", +"from_hint":"El", "gpx_export_button":"Elporti GPX", +"to_hint":"Al", "route_info":"%1$s daŭros %2$s", +"search_button":"Serĉi", +"more_button":"pli", "pt_route_info":"alveno je %1$s kun %2$s transveturiliĝoj (%3$s)", "pt_route_info_walking":"alveno je %1$s nur perpiede (%2$s)", "locations_not_found":"Vojdifinado ne eblas. Ne trovis loko(j)n en la ĉirkaŭaĵo.", @@ -491,16 +581,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "es":{ -"search_button":"Buscar", -"from_hint":"Desde", "via_hint":"Pasando por", -"to_hint":"Hasta", -"more_button":"más", +"from_hint":"Desde", "gpx_export_button":"Exportar GPX", +"to_hint":"Hasta", "route_info":"%1$s tardará %2$s ", +"search_button":"Buscar", +"more_button":"más", "pt_route_info":"llega a las %1$s con %2$s transferencias (%3$s)", "pt_route_info_walking":"llega sólo caminando a las %1$s (%2$s)", "locations_not_found":"No se ha encontrado la ruta. El destino no se encuentra en el área.", @@ -536,16 +635,25 @@ "route_request_failed":"Solicitud de ruta fallida", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"En un kilómetro", +"in_km":"En %1$s kilómetros", +"in_m":"En %1$s metros", +"for_km":"por %1$s kilómetros", +"then":"luego", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "fa":{ -"search_button":"جست‌وجو", -"from_hint":"از", "via_hint":"با گذر از", -"to_hint":"به", -"more_button":"بیشتر", +"from_hint":"از", "gpx_export_button":"دریافت در قالب GPX", +"to_hint":"به", "route_info":"%1$s %2$s طول می‌کشد", +"search_button":"جست‌وجو", +"more_button":"بیشتر", "pt_route_info":"با %2$s جابه‌جایی در ساعت %1$s می‌رسید (%3$s)", "pt_route_info_walking":"ساعت %1$s می‌رسید، فقط پیاده (%2$s)", "locations_not_found":"مسیریابی ممکن نیست. مکان(ها) در ناحیهٔ موردنظر پیدا نشد.", @@ -581,16 +689,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "fil":{ -"search_button":"Paghahanap", -"from_hint":"mula sa ", "via_hint":"", -"to_hint":"upang sa", -"more_button":"mas", +"from_hint":"mula sa ", "gpx_export_button":"GPX Export", +"to_hint":"upang sa", "route_info":"%1$s ay magdadala sa %2$s", +"search_button":"Paghahanap", +"more_button":"mas", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"Routing hindi maaari, hindi nahanap Lokasyon sa lugar.", @@ -626,16 +743,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "fi":{ -"search_button":"Etsi", -"from_hint":"Lähtöpaikka", "via_hint":"Reittipiste", -"to_hint":"Määränpää", -"more_button":"lisää", +"from_hint":"Lähtöpaikka", "gpx_export_button":"GPX-tuonti", +"to_hint":"Määränpää", "route_info":"%1$s kestää %2$s", +"search_button":"Etsi", +"more_button":"lisää", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"Reittiohjeiden luonti epäonnistui. Paikkaa ei löydy tältä alueelta.", @@ -671,16 +797,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "fr_FR":{ -"search_button":"Rechercher", -"from_hint":"De", "via_hint":"Via", -"to_hint":"À", -"more_button":"plus", +"from_hint":"De", "gpx_export_button":"Export GPX", +"to_hint":"À", "route_info":"%1$s durera %2$s ", +"search_button":"Rechercher", +"more_button":"plus", "pt_route_info":"arrivée à %1$s avec %2$s changements (%3$s)", "pt_route_info_walking":"arrivée à pied à %1$s (%2$s)", "locations_not_found":"Calcul d'itinéraire impossible. Position(s) non trouvée(s) dans la zone.", @@ -716,16 +851,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "fr_CH":{ -"search_button":"Rechercher", -"from_hint":"De", "via_hint":"Via", -"to_hint":"À", -"more_button":"plus", +"from_hint":"De", "gpx_export_button":"Export GPX", +"to_hint":"À", "route_info":"%1$s durera %2$s ", +"search_button":"Rechercher", +"more_button":"plus", "pt_route_info":"arrivée à %1$s avec %2$s changements (%3$s)", "pt_route_info_walking":"arrivée à pied à %1$s (%2$s)", "locations_not_found":"Calcul d'itinéraire impossible. Position(s) non trouvée(s) dans la zone.", @@ -761,16 +905,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "gl":{ -"search_button":"buscar", -"from_hint":"dende", "via_hint":"Vía", -"to_hint":"ata", -"more_button":"máis", +"from_hint":"dende", "gpx_export_button":"GPX Exportación", +"to_hint":"ata", "route_info":"%1$s tardará %2$s", +"search_button":"buscar", +"more_button":"máis", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"Non se atopou a ruta. O destino non se atopa na área", @@ -806,16 +959,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "he":{ -"search_button":"חיפוש", -"from_hint":"מוצא", "via_hint":"דרך", -"to_hint":"יעד", -"more_button":"עוד", +"from_hint":"מוצא", "gpx_export_button":"ייצוא GPX", +"to_hint":"יעד", "route_info":"%1$s ייקחו %2$s", +"search_button":"חיפוש", +"more_button":"עוד", "pt_route_info":"מגיע ב־%1$s עם %2$s החלפות (%3$s)", "pt_route_info_walking":"מגיע ב־%1$s עם הליכה (%3$s)", "locations_not_found":"אין נתיב ישיר אל היעד. המיקום לא נמצא באזור.", @@ -851,16 +1013,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "hr_HR":{ -"search_button":"Pretraži", -"from_hint":"Od", "via_hint":"Preko", -"to_hint":"Do", -"more_button":"više", +"from_hint":"Od", "gpx_export_button":"Izvezi kao GPX", +"to_hint":"Do", "route_info":"%1$s trajat će %2$s", +"search_button":"Pretraži", +"more_button":"više", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"Rutiranje nije moguće. Lokacije nisu pronađene na ovome području.", @@ -896,16 +1067,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "hsb":{ -"search_button":"pytaj", -"from_hint":"wot", "via_hint":"přez", -"to_hint":"do", -"more_button":"wjac", +"from_hint":"wot", "gpx_export_button":"eksport do GPX", +"to_hint":"do", "route_info":"za %1$s so trjeba %2$s", +"search_button":"pytaj", +"more_button":"wjac", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"Čara njeje móžna. Městno so w tutej kónčinje njenamaka.", @@ -941,16 +1121,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "hu_HU":{ -"search_button":"Keresés", -"from_hint":"Innen", "via_hint":"Ezen keresztül", -"to_hint":"Ide", -"more_button":"tovább", +"from_hint":"Innen", "gpx_export_button":"GPX export", +"to_hint":"Ide", "route_info":"%1$s ennyi ideig tart: %2$s", +"search_button":"Keresés", +"more_button":"tovább", "pt_route_info":"érkezés %1$s órakor, %2$s átszállással (%3$s)", "pt_route_info_walking":"érkezés %1$s órakor, csak gyalog (%2$s)", "locations_not_found":"Útvonaltervezés nem lehetséges. A megadott hely(ek) nem található(k) meg a területen.", @@ -986,16 +1175,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "in_ID":{ -"search_button":"pencarian", -"from_hint":"dari", "via_hint":"melalui", -"to_hint":"ke", -"more_button":"lebih lanjut", +"from_hint":"dari", "gpx_export_button":"Ekspor GPX", +"to_hint":"ke", "route_info":"%1$s berada dalam waktu %2$s", +"search_button":"pencarian", +"more_button":"lebih lanjut", "pt_route_info":"sampai pada %1$s dengan %2$s jarak (%3$s)", "pt_route_info_walking":"sampai pada %1$s dengan berjalan kaki (%2$s)", "locations_not_found":"Penentuan rute tidak dapat dilakukan. Lokasi tidak ditemukan", @@ -1031,16 +1229,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "it":{ -"search_button":"Ricerca", -"from_hint":"Da", "via_hint":"attraverso", -"to_hint":"A", -"more_button":"altro", +"from_hint":"Da", "gpx_export_button":"Esporta GPX", +"to_hint":"A", "route_info":"%1$s in %2$s", +"search_button":"Ricerca", +"more_button":"altro", "pt_route_info":"arrivato alle %1$s con %2$s trasferimenti (%3$s)", "pt_route_info_walking":"arrivato alle %1$s solocamminando (%2$s)", "locations_not_found":"Percorso non calcolabile. Località non trovata(e) nell'area.", @@ -1076,16 +1283,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "ja":{ -"search_button":"検索", -"from_hint":"出発地点", "via_hint":"経由", -"to_hint":"目的地点", -"more_button":"詳細", +"from_hint":"出発地点", "gpx_export_button":"GPX形式でエクスポート", +"to_hint":"目的地点", "route_info":"%1$s 所要時間 %2$s", +"search_button":"検索", +"more_button":"詳細", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"経路を検索できませんでした.指定の地点が存在しません.", @@ -1121,16 +1337,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "ko":{ -"search_button":"탐색", -"from_hint":"출발", "via_hint":"경유", -"to_hint":"도착", -"more_button":"더보기", +"from_hint":"출발", "gpx_export_button":"GPX 내보내기", +"to_hint":"도착", "route_info":"%1$s %2$s 소요", +"search_button":"탐색", +"more_button":"더보기", "pt_route_info":"%1$s회 환승, %2$s에 도착 (%3$s)", "pt_route_info_walking":"도보 이용, %1$s에 도착 (%2$s)", "locations_not_found":"경로를 탐색할 수 없습니다. 이 지역에서 위치를 찾을 수 없습니다.", @@ -1166,16 +1391,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "lt_LT":{ -"search_button":"Ieškoti", -"from_hint":"Nuo", "via_hint":"Per", -"to_hint":"Iki", -"more_button":"dar", +"from_hint":"Nuo", "gpx_export_button":"GPX eksportas", +"to_hint":"Iki", "route_info":"%1$s užtruksite %2$s", +"search_button":"Ieškoti", +"more_button":"dar", "pt_route_info":"Atvyksta %1$s su %2$s persėdimais (%3$s)", "pt_route_info_walking":"Atvyksta %1$s, su ėjimu pėščiomis (%2$s)", "locations_not_found":"Neįmanoma sukurti maršruto. Nurodyti taškai nerasti šioje zonoje.", @@ -1211,16 +1445,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"Už 1 kilometro", +"in_km":"Už %1$s kilometrų", +"in_m":"Už %1$s metrų", +"for_km":"%1$s kilometrus", +"then":"tada", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "ne":{ -"search_button":"खोज ", -"from_hint":"सुरु ", "via_hint":"बाट", -"to_hint":"अन्त्य", -"more_button":"अझै", +"from_hint":"सुरु ", "gpx_export_button":"GPX मा परिबर्तन गर्नुहोस", +"to_hint":"अन्त्य", "route_info":"%1$s को लागि %2$s लाग्नेछ", +"search_button":"खोज ", +"more_button":"अझै", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"ठाउँ नभेटीनाले बाटो पत्ता लगाउन सकिएन", @@ -1256,16 +1499,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "nl":{ -"search_button":"zoek", -"from_hint":"van", "via_hint":"via", -"to_hint":"naar", -"more_button":"meer", +"from_hint":"van", "gpx_export_button":"GPX export", +"to_hint":"naar", "route_info":"%1$s duurt %2$s", +"search_button":"zoek", +"more_button":"meer", "pt_route_info":"aankomst om %1$s met %2$s overstappen (%3$s)", "pt_route_info_walking":"aankomst om %1$s te voet (%2$s)", "locations_not_found":"Route niet mogelijk. Locatie(s) niet gevonden.", @@ -1301,16 +1553,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"Over 1 kilometer", +"in_km":"Over %1$s kilometer", +"in_m":"Over %1$s meter", +"for_km":"Voor %1$s kilometer", +"then":"dan", +"in_mi_singular":"Over 1 mijl", +"in_mi":"Over %1$s mijl", +"in_ft":"Over %1$s voet", +"for_mi":"Voor %1$s mijl" }, "pl_PL":{ -"search_button":"Szukaj", -"from_hint":"Z", "via_hint":"Przez", -"to_hint":"Do", -"more_button":"więcej", +"from_hint":"Z", "gpx_export_button":"Eksportuj GPX", +"to_hint":"Do", "route_info":"%1$s zajmie %2$s", +"search_button":"Szukaj", +"more_button":"więcej", "pt_route_info":"przybycie o %1$s z %2$s przesiadkami (%3$s)", "pt_route_info_walking":"przybycie o %1$s pieszo (%2$s)", "locations_not_found":"Nie można wyznaczyć trasy. Lokalizacja(e) nie została(y) znalezione. ", @@ -1346,16 +1607,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "pt_BR":{ -"search_button":"Pesquisar", -"from_hint":"De", "via_hint":"Via", -"to_hint":"Para", -"more_button":"mais", +"from_hint":"De", "gpx_export_button":"Exportar GPX", +"to_hint":"Para", "route_info":"%1$s levará %2$s", +"search_button":"Pesquisar", +"more_button":"mais", "pt_route_info":"chega às %1$s com %2$s trocas (%3$s)", "pt_route_info_walking":"chega às %1$s caminhando (%2$s)", "locations_not_found":"Rota inviável. Localização(ões) não encontrada(s) na área.", @@ -1391,16 +1661,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "pt_PT":{ -"search_button":"Pesquisar", -"from_hint":"De", "via_hint":"Por", -"to_hint":"Para", -"more_button":"mais", +"from_hint":"De", "gpx_export_button":"Exportar GPX", +"to_hint":"Para", "route_info":"%1$s irá demorar %2$s", +"search_button":"Pesquisar", +"more_button":"mais", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"Roteamento impossível. Localização(ões) não encontrada(s) na área.", @@ -1436,16 +1715,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "ro":{ -"search_button":"Caută", -"from_hint":"De la", "via_hint":"Prin", -"to_hint":"La", -"more_button":"mai mult", +"from_hint":"De la", "gpx_export_button":"Exportă GPX", +"to_hint":"La", "route_info":"%1$s durează %2$s", +"search_button":"Caută", +"more_button":"mai mult", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"Traseul nu este posibil. Locul(locurile) nu pot fi găsite în zonă.", @@ -1481,16 +1769,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "ru":{ -"search_button":"Поиск", -"from_hint":"От", "via_hint":"Через", -"to_hint":"До", -"more_button":"еще", +"from_hint":"От", "gpx_export_button":"Экспорт GPX", +"to_hint":"До", "route_info":"%1$s займет %2$s", +"search_button":"Поиск", +"more_button":"еще", "pt_route_info":"Прибытие в %1$s с %2$s пересадками (%3$s)", "pt_route_info_walking":"Прибытие в %1$s пешком (%2$s) ", "locations_not_found":"Построить маршрут невозможно. Не определено местоположение.", @@ -1526,16 +1823,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"В 1 километре", +"in_km":"В %1$s километрах", +"in_m":"В %1$s метрах", +"for_km":"За %1$s километрах", +"then":"Затем", +"in_mi_singular":"В 1 миле", +"in_mi":"В %1$s милях", +"in_ft":"В %1$s футах", +"for_mi":"В %1$s милях" }, "sk":{ -"search_button":"Vyhľadať", -"from_hint":"Odkiaľ", "via_hint":"Cez", -"to_hint":"Kam", -"more_button":"viac", +"from_hint":"Odkiaľ", "gpx_export_button":"Export do GPX", +"to_hint":"Kam", "route_info":"%1$s zaberie %2$s", +"search_button":"Vyhľadať", +"more_button":"viac", "pt_route_info":"", "pt_route_info_walking":"príchod o %1$s iba chôdzou (%2$s)", "locations_not_found":"Navigovanie nie je možné. Umiestnenie nebolo nájdené v oblasti.", @@ -1571,16 +1877,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "sl_SI":{ -"search_button":"Išči", -"from_hint":"Od ", "via_hint":"Preko", -"to_hint":"Do", -"more_button":"več", +"from_hint":"Od ", "gpx_export_button":"Izvozi GPX", +"to_hint":"Do", "route_info":"%1$s bo trajalo %2$s", +"search_button":"Išči", +"more_button":"več", "pt_route_info":"prispe ob %1$s s/z %2$s-imi prestopi (%3$s)", "pt_route_info_walking":"prispe ob %1$s s samo hojo (%3$s)", "locations_not_found":"Usmerjanje ni mogoče. Lokacije ni bilo mogoče najti na tem območju.", @@ -1616,16 +1931,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "sr_RS":{ -"search_button":"Pretraži", -"from_hint":"Od", "via_hint":"Preko", -"to_hint":"Do", -"more_button":"više", +"from_hint":"Od", "gpx_export_button":"Izvezi kao GPX", +"to_hint":"Do", "route_info":"%1$s trajaće %2$s", +"search_button":"Pretraži", +"more_button":"više", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"Rutiranje nije moguće. Lokacije nisu pronađene na ovome području.", @@ -1661,16 +1985,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "sv_SE":{ -"search_button":"Sök", -"from_hint":"Från", "via_hint":"Via", -"to_hint":"Till", -"more_button":"fler", +"from_hint":"Från", "gpx_export_button":"exportera GPX-fil", +"to_hint":"Till", "route_info":"%1$s med körtid %2$s", +"search_button":"Sök", +"more_button":"fler", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"Kan inte beräkna rutt. Platsen eller platserna kan inte hittas i området.", @@ -1706,16 +2039,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "tr":{ -"search_button":"Ara", -"from_hint":"Şuradan", "via_hint":"Yoluyla", -"to_hint":"Yönüne", -"more_button":"daha fazlası", +"from_hint":"Şuradan", "gpx_export_button":"GPX dışa aktar", +"to_hint":"Yönüne", "route_info":"%1$s alacak %2$s", +"search_button":"Ara", +"more_button":"daha fazlası", "pt_route_info":"%2$s aktarma ile varış saati %1$s (%3$s)", "pt_route_info_walking":"yürüyerek varış saati %1$s (%2$s)", "locations_not_found":"Rota planlanamadı. Bölgede yer bulunamadı.", @@ -1751,16 +2093,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "uk":{ -"search_button":"Пошук", -"from_hint":"Від", "via_hint":"через", -"to_hint":"До", -"more_button":"ще", +"from_hint":"Від", "gpx_export_button":"Експорт в GPX", +"to_hint":"До", "route_info":"%1$s займе %2$s", +"search_button":"Пошук", +"more_button":"ще", "pt_route_info":"Прибуття до %1$s з %2$s пересадками (%3$s)", "pt_route_info_walking":"Прибуття до %1$s пішки (%2$s) ", "locations_not_found":"Побудова маршруту неможлива. Місцезнаходження не визначено.", @@ -1796,16 +2147,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "vi_VN":{ -"search_button":"Tìm", -"from_hint":"Từ", "via_hint":"Qua", -"to_hint":"Đến", -"more_button":"thêm", +"from_hint":"Từ", "gpx_export_button":"Xuất GPX", +"to_hint":"Đến", "route_info":"%1$s mất %2$s", +"search_button":"Tìm", +"more_button":"thêm", "pt_route_info":"Đến lúc %1$s với %2$s phương tiện(tuyến) (%3$s )", "pt_route_info_walking":"Đến lúc %1$s chỉ bằng cách đi bộ (%2$s)", "locations_not_found":"Không tìm thấy lộ trình! Các điểm đã chọn không tìm thấy trong vùng này.", @@ -1841,16 +2201,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"Trong 1 km", +"in_km":"Trong %1$s km", +"in_m":"Trong %1$s m", +"for_km":"Khoảng %1$s km", +"then":"Gần đó", +"in_mi_singular":"Trong 1 dặm", +"in_mi":"Trong %1$s dặm", +"in_ft":"Trong %1$s ft", +"for_mi":"Khoảng %1$s dặm" }, "zh_CN":{ -"search_button":"搜索", -"from_hint":"起点", "via_hint":"途经点", -"to_hint":"终点", -"more_button":"更多", +"from_hint":"起点", "gpx_export_button":"GPX导出", +"to_hint":"终点", "route_info":"%1$s 的路线,需要 %2$s 时间", +"search_button":"搜索", +"more_button":"更多", "pt_route_info":"", "pt_route_info_walking":"步行(%2$s), %1$s到达", "locations_not_found":"地点未找到", @@ -1886,16 +2255,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "zh_HK":{ -"search_button":"搜尋", -"from_hint":"起點", "via_hint":"途經", -"to_hint":"目的地", -"more_button":"更多", +"from_hint":"起點", "gpx_export_button":"GPX格式輸出", +"to_hint":"目的地", "route_info":"%1$s 需時 %2$s", +"search_button":"搜尋", +"more_button":"更多", "pt_route_info":"", "pt_route_info_walking":"", "locations_not_found":"找不到起點/目的地", @@ -1931,16 +2309,25 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }, "zh_TW":{ -"search_button":"搜尋", -"from_hint":"起點", "via_hint":"途經", -"to_hint":"迄點", -"more_button":"更多", +"from_hint":"起點", "gpx_export_button":"匯出GPS", +"to_hint":"迄點", "route_info":"%1$s 需時 %2$s", +"search_button":"搜尋", +"more_button":"更多", "pt_route_info":"於 %1$s 抵達,%2$s 次轉乘 (%3$s)", "pt_route_info_walking":"於 %1$s 抵達,僅步行 (%2$s)", "locations_not_found":"無法進行規劃。無法在此區域內找到指定的地點", @@ -1976,5 +2363,14 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"" }} \ No newline at end of file diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 91470324..6f56a8db 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -10,6 +10,7 @@ import VolumeOffIcon from '@/turnNavigation/volume_off.svg' import { getLocationStore } from '@/stores/Stores' import { LocationStoreState } from '@/stores/LocationStore' import PlainButton from '@/PlainButton' +import { tr } from '@/translation/Translation' type TurnNavigationProps = { path: Path @@ -53,16 +54,30 @@ export default function ({ path, location }: TurnNavigationProps) { let text = nextInstruction.street_name if (sound) { - // making closeDistance dependent on location.speed is tricky because then it can change while driving, so pick the constant average speed + // making lastAnnounceDistance dependent on location.speed is tricky because then it can change while driving, so pick the constant average speed + // TODO use instruction average speed of current+next instruction instead of whole path let averageSpeed = (path.distance / (path.time / 1000)) * 3.6 - let closeDistance = 10 + 2 * Math.round(averageSpeed / 5) * 5 + let lastAnnounceDistance = 10 + 2 * Math.round(averageSpeed / 5) * 5 + + // text = '' + averageSpeed + ', ' + distanceToNext + if ( - distanceToNext <= closeDistance && - (state.distanceToNext > closeDistance || instructionIndex != state.index) + distanceToNext <= lastAnnounceDistance && + (state.distanceToNext > lastAnnounceDistance || instructionIndex != state.index) ) { getLocationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) - //TODO enable debugging to UI via URL param: - //text = closeDistance + ', ' + distanceToNext + ', ' + instructionIndex + } + + let firstAnnounceDistance = 1150 + if ( + averageSpeed > 15 && // two announcements only if faster speed + distanceToNext > 800 && // do not interfer with last announcement. also "1 km" should stay valid (approximately) + distanceToNext <= firstAnnounceDistance && + (state.distanceToNext > firstAnnounceDistance || instructionIndex != state.index) + ) { + getLocationStore() + .getSpeechSynthesizer() + .synthesize(tr('in_km_singular') + ' ' + nextInstruction.text) } } diff --git a/update-translations.py b/update-translations.py index 60a4fc81..12b26e87 100644 --- a/update-translations.py +++ b/update-translations.py @@ -24,6 +24,8 @@ col0 = row[0] if col0.startswith("web."): # use keys with web. only filtered_data.append( [col0[4:], row] ) # remove the web. prefix + if col0.startswith("navigate."): # keys with navigate. + filtered_data.append( [col0[9:], row] ) # remove the navigate. prefix outstring = "{" index = 0 From 7de4909b695a9bd2dd378abe0c487d793d5baca3 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 5 Sep 2021 22:07:49 +0200 Subject: [PATCH 072/322] make resulting page for turn nav more clear --- src/App.tsx | 131 ++++++++++++++++++++++++++++------------------------ 1 file changed, 70 insertions(+), 61 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 63af3461..a74c1e60 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -125,51 +125,56 @@ interface LayoutProps { } function LargeScreenLayout({ query, route, location, viewport, mapLayers, error, mapOptions, info }: LayoutProps) { - return ( + return location.turnNavigation ? ( + <> +
+ +
+
+ +
+ + ) : ( <>
- { - - } +
- {location.turnNavigation ? ( -
- -
- ) : ( -
-
-
- -
-
{!error.isDismissed && }
-
- -
-
- -
+
+
+
+ +
+
{!error.isDismissed && }
+
+ +
+
+
- )} - +
@@ -178,7 +183,21 @@ function LargeScreenLayout({ query, route, location, viewport, mapLayers, error, } function SmallScreenLayout({ query, route, location, viewport, mapLayers, error, mapOptions, info }: LayoutProps) { - return ( + return location.turnNavigation ? ( + <> +
+ +
+
+ +
+ + ) : ( <>
- {location.turnNavigation ? null : ( -
- -
- )} - {location.turnNavigation ? ( -
- -
- ) : ( -
- -
- )} - {!location.turnNavigation ? ( -
- -
- ) : null} +
+ +
+
+ +
+
+ +
) } From df74bbcb627029a4b58f355e282a0251ed9d93bf Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 5 Sep 2021 22:08:46 +0200 Subject: [PATCH 073/322] better navigation simulation for any route --- src/stores/LocationStore.ts | 64 ++++++++++++++++---------------- src/turnNavigation/GeoMethods.ts | 5 +++ 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index ec5a5de6..4d9d152b 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -4,6 +4,8 @@ import { ErrorAction, LocationUpdate, SetViewportToPoint } from '@/actions/Actio import Dispatcher, { Action } from '@/stores/Dispatcher' import NoSleep from 'nosleep.js' import { SpeechSynthesizer } from '@/SpeechSynthesizer' +import { ApiImpl } from '@/api/Api' +import { calcOrientation } from '@/turnNavigation/GeoMethods' export interface LocationStoreState { turnNavigation: boolean @@ -11,6 +13,8 @@ export interface LocationStoreState { speed: number } +// TODO investigate what we can learn from https://github.com/visgl/react-map-gl/blob/master/docs/api-reference/geolocate-control.md +// TODO include compass in map https://github.com/visgl/react-map-gl/blob/master/docs/api-reference/navigation-control.md export default class LocationStore extends Store { private watchId: any = undefined private interval: any @@ -43,41 +47,37 @@ export default class LocationStore extends Store { return state } - public initFake() { + public async initFake() { this.started = true - let route = 1 - let latlon: number[][] - if (route == 1) { - // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car - latlon = [ - [51.439291, 14.245254, 180, 0], - [51.438989, 14.245405, 180, 3], - [51.438895, 14.245191, 180, 3], - [51.438694, 14.245577, 90, 8], - [51.438668, 14.246092, 90, 8], - [51.438226, 14.246972, 180, 11], - [51.436795, 14.245921, 180, 11], - [51.435029, 14.243259, 270, 11], - [51.435203, 14.241006, 270, 10], - [51.434788, 14.238882, 180, 4], - [51.434146, 14.237745, 270, 2], - [51.433959, 14.235985, 180, 5], - [51.43322, 14.2349991, 270, 3], - ] - } else { - // http://localhost:3000/?point=51.438818%2C14.243717&point=51.437858%2C14.244785&point=51.438181%2C14.242442&profile=foot - latlon = [ - [51.4388, 14.243857, 110, 1], - [51.438727, 14.244184, 200, 1], - [51.43836, 14.243954, 200, 1], - [51.438176, 14.244002, 120, 1], - [51.438108, 14.244266, 120, 1], - [51.43801, 14.244584, 120, 1], - [51.43791, 14.244783, 150, 1], - [51.437733, 14.244692, 210, 2], - ] + // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car + let api = new ApiImpl() + let response = await api.route({ + points: [ + [14.245254, 51.439291], + [14.234999, 51.43322], + ], + profile: 'car', + maxAlternativeRoutes: 0, + }) + + // TODO: skip too close points and interpolate if too big distance + let coords: number[][] = response.paths[0].points.coordinates + let latlon: number[][] = new Array(coords.length) + + for (let idx = 0; idx < coords.length; idx++) { + // very ugly: in JS it is not initializable with a seed + let lat = coords[idx][1] + 0.0001 * Math.random(), // approx +-5m ? + lon = coords[idx][0] + 0.0001 * Math.random() + let heading = 180 + if (idx > 0) { + let prevLat = coords[idx - 1][1], + prevLon = coords[idx - 1][0] + heading = ((3 * Math.PI) / 2 - calcOrientation(lat, lon, prevLat, prevLon)) * 57.29577951308232 // factor 57.29... to convert radion to degrees + } + latlon[idx] = [lat, lon, heading, 4] } + let currentIndex: number = 0 this.locationUpdate({ coords: { diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 8b880410..534762a4 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -152,3 +152,8 @@ function calcCrossingPointToEdge( let c_lat = a_lat + factor * delta_lat return { lat: c_lat, lng: c_lon / shrinkFactor } } + +export function calcOrientation(lat1: number, lon1: number, lat2: number, lon2: number): number { + let shrinkFactor = Math.cos(toRadians((lat1 + lat2) / 2)) + return Math.atan2(lat2 - lat1, shrinkFactor * (lon2 - lon1)) +} From 5d5118ee0d74ad06f1641ea319eeb992b27900eb Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 3 Dec 2021 18:12:51 +0100 Subject: [PATCH 074/322] use real --- src/sidebar/RoutingResults.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 1931ca87..dc242f6c 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -41,7 +41,7 @@ function RoutingResult({ path, isSelected }: { path: Path; isSelected: boolean } {metersToText(path.distance)}
- getLocationStore().initFake()} src={startNavigation} /> + getLocationStore().initReal()} src={startNavigation} />
{isSelected && ( setExpanded(!isExpanded)}> From 3a08a78fbf98653a08a32d6298640fef393ead1c Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 8 Dec 2021 14:53:40 +0100 Subject: [PATCH 075/322] fix missing instruction for via point --- src/sidebar/instructions/Instructions.tsx | 2 +- src/turnNavigation/TurnNavigation.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sidebar/instructions/Instructions.tsx b/src/sidebar/instructions/Instructions.tsx index d3dabcff..16823711 100644 --- a/src/sidebar/instructions/Instructions.tsx +++ b/src/sidebar/instructions/Instructions.tsx @@ -42,7 +42,7 @@ const Line = function ({ instruction, index }: { instruction: Instruction; index ) } -function getTurnSign(sign: number, index: number) { +export function getTurnSign(sign: number, index: number) { // from, via and to signs are special if (index === 0 || sign === 4 || sign === 5) { let markerColor diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 6f56a8db..05bd745e 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,7 +1,7 @@ import React, { useState, useReducer, useEffect } from 'react' import { Path, Instruction } from '@/api/graphhopper' import { metersToText, milliSecondsToText } from '@/Converters' -import { getSignName } from '@/sidebar/instructions/Instructions' +import { getTurnSign } from '@/sidebar/instructions/Instructions' import { getCurrentInstruction } from './GeoMethods' import styles from '@/turnNavigation/TurnNavigation.module.css' import endNavigation from '@/turnNavigation/end_turn_navigation.png' @@ -93,7 +93,7 @@ export default function ({ path, location }: TurnNavigationProps) {
- {'turn + {getTurnSign(nextInstruction.sign, instructionIndex)}
{metersToText(distanceToNext)}
From 91aaa689dd81382d0f00460bd285898d27ed61cb Mon Sep 17 00:00:00 2001 From: Waterdev <30842467+UnrealValentin@users.noreply.github.com> Date: Thu, 9 Dec 2021 16:48:32 +0100 Subject: [PATCH 076/322] Added fake query param to navi (#144) * Disabled the fake-mode by standard * Added fake Query Param * Added usage declaration * Changed to fetch URL using Object * Removed unused export * Changed Url check to inline if statement * Fix if Case * Fix if Case * Update NavBar.ts Co-authored-by: Sachsenspielt96 Co-authored-by: UnrealValentin Co-authored-by: Peter --- src/NavBar.ts | 2 ++ src/sidebar/RoutingResults.tsx | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/NavBar.ts b/src/NavBar.ts index 9d6a0698..a38685ec 100644 --- a/src/NavBar.ts +++ b/src/NavBar.ts @@ -29,6 +29,7 @@ export default class NavBar { result.searchParams.append('profile', queryStoreState.routingProfile.name) result.searchParams.append('layer', mapState.selectedStyle.name) + if((new URL(window.location.toString()).searchParams.get('fake')) != null) result.searchParams.append('fake', true) return result } @@ -124,3 +125,4 @@ export default class NavBar { if (newHref !== window.location.href) window.history.pushState('last state', '', newHref) } } + diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index dc242f6c..3aa99263 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -29,7 +29,8 @@ function RoutingResult({ path, isSelected }: { path: Path; isSelected: boolean } const resultSummaryClass = isSelected ? styles.resultSummary + ' ' + styles.selectedResultSummary : styles.resultSummary - + const fakeNavi: boolean = new URL(window.location.toString()).searchParams.get("fake") != null + useEffect(() => setExpanded(isSelected && isExpanded), [isSelected]) return ( @@ -41,7 +42,10 @@ function RoutingResult({ path, isSelected }: { path: Path; isSelected: boolean } {metersToText(path.distance)}
- getLocationStore().initReal()} src={startNavigation} /> + { + if(fakeNavi) getLocationStore().initFake() + else getLocationStore().initReal() + }} src={startNavigation} />
{isSelected && ( setExpanded(!isExpanded)}> From 663c178756bfd75f1c962b8e2cb1ffc17a2ee443 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 8 Dec 2021 20:55:56 +0100 Subject: [PATCH 077/322] move sound button to top right and make first announcement better --- src/App.module.css | 22 +++++++++++ src/App.tsx | 21 ++++++++-- src/api/graphhopper.d.ts | 1 + src/stores/RouteStore.ts | 1 + src/turnNavigation/GeoMethods.ts | 56 +++++++++++++++++++++++---- src/turnNavigation/TurnNavigation.tsx | 26 ++++++------- 6 files changed, 103 insertions(+), 24 deletions(-) diff --git a/src/App.module.css b/src/App.module.css index a1a39a9a..6e89debd 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -87,6 +87,17 @@ pointer-events: none; } +.volume { + grid-column: 3 / span 1; + grid-row: 1 / span 1; + padding: 5px 5px 3px 7px; + height: 30px; + z-index: 2; + background-color: white; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); + border-radius: 0.5rem; +} + .smallScreenMap { grid-row: 1 / span 3; grid-column: 1 / span 1; @@ -125,6 +136,17 @@ background-color: white; } +.smallScreenVolume { + grid-column: 1 / span 1; + grid-row: 1 / span 1; + padding: 5px 4px 3px 7px; + width: 30px; + z-index: 2; + background-color: white; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); + border-radius: 0.5rem; +} + .smallScreenPoweredBy { grid-row: 5 / span 1; grid-column: 1 / span 1; diff --git a/src/App.tsx b/src/App.tsx index 5512a955..c973b841 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import React, {useEffect, useState} from 'react' +import React, {Dispatch, useEffect, useState} from 'react' import PathDetails from '@/pathDetails/PathDetails' import styles from './App.module.css' import { @@ -32,6 +32,9 @@ import createPathsLayer from '@/layers/PathsLayer' import createCurrentLocationLayer from '@/layers/CurrentLocationLayer' import {MapLayer} from '@/layers/MapLayer' import {LocationStoreState} from './stores/LocationStore' +import VolumeUpIcon from "@/turnNavigation/volume_up.svg"; +import VolumeOffIcon from "@/turnNavigation/volume_off.svg"; +import PlainButton from "@/PlainButton"; export const POPUP_CONTAINER_ID = 'popup-container' export const SIDEBAR_CONTENT_ID = 'sidebar-content' @@ -128,6 +131,7 @@ interface LayoutProps { } function LargeScreenLayout({query, route, location, viewport, mapLayers, error, mapOptions, info}: LayoutProps) { + let [sound, setSound] = useState(true); return ( location.turnNavigation ? <> @@ -141,7 +145,12 @@ function LargeScreenLayout({query, route, location, viewport, mapLayers, error, />
- + +
+
+ setSound(!sound)}> + {sound ? : } +
: @@ -189,6 +198,7 @@ function LargeScreenLayout({query, route, location, viewport, mapLayers, error, } function SmallScreenLayout({query, route, location, viewport, mapLayers, error, mapOptions, info}: LayoutProps) { + let [sound, setSound] = useState(true); return (location.turnNavigation ? <>
@@ -200,8 +210,13 @@ function SmallScreenLayout({query, route, location, viewport, mapLayers, error, mapLayers={mapLayers} />
+
+ setSound(!sound)}> + {sound ? : } + +
- +
: diff --git a/src/api/graphhopper.d.ts b/src/api/graphhopper.d.ts index 1c0003f7..e851eab2 100644 --- a/src/api/graphhopper.d.ts +++ b/src/api/graphhopper.d.ts @@ -89,6 +89,7 @@ interface Details { readonly street_name: [number, number, string][] readonly toll: [number, number, string][] readonly max_speed: [number, number, number][] + readonly average_speed: [number, number, number][] } export interface GeocodingResult { diff --git a/src/stores/RouteStore.ts b/src/stores/RouteStore.ts index 5322e48a..26fdf8a2 100644 --- a/src/stores/RouteStore.ts +++ b/src/stores/RouteStore.ts @@ -26,6 +26,7 @@ export default class RouteStore extends Store { ascend: 0, descend: 0, details: { + average_speed: [], max_speed: [], street_name: [], toll: [], diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 534762a4..2efea22b 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -1,5 +1,45 @@ -import { Instruction } from '@/api/graphhopper' -import { Coordinate } from '@/stores/QueryStore' +import {Instruction, Path} from '@/api/graphhopper' +import {Coordinate} from '@/stores/QueryStore' + +export function getCurrentDetails(path: Path, location: Coordinate, details: [number, number, number][][]): number[] { + let smallestDist = Number.MAX_VALUE + const points = path.points.coordinates + let foundIndex = -1 + + for (let pIdx = 0; pIdx < points.length; pIdx++) { + const p: number[] = points[pIdx] + let snapped = {lat: p[1], lng: p[0]} + let dist = distCalc(p[1], p[0], location.lat, location.lng) + + if (pIdx + 1 < points.length) { + const next: number[] = points[pIdx + 1] + if (validEdgeDistance(location.lat, location.lng, p[1], p[0], next[1], next[0])) { + snapped = calcCrossingPointToEdge(location.lat, location.lng, p[1], p[0], next[1], next[0]) + dist = Math.min(dist, distCalc(snapped.lat, snapped.lng, location.lat, location.lng)) + } + } + + if (dist < smallestDist) { + smallestDist = dist + foundIndex = pIdx + } + } + if (foundIndex < 0) return [] + + let result = []; + for (let i = 0; i < details.length; i++) { + let detailOnPath = details[i] + for (let d = 0; d < detailOnPath.length; d++) { + let [from, to, val] = detailOnPath[d]; + if (foundIndex >= from && foundIndex <= to) { + result.push(val) + break + } + } + } + + return result +} export function getCurrentInstruction( instructions: Instruction[], @@ -20,9 +60,9 @@ export function getCurrentInstruction( for (let pIdx = 0; pIdx < points.length; pIdx++) { const p: number[] = points[pIdx] - let snapped = { lat: p[1], lng: p[0] } + let snapped = {lat: p[1], lng: p[0]} let dist = distCalc(p[1], p[0], location.lat, location.lng) - // calulate the snapped point, TODO use first point of next instruction for "next" if last point of current instruction + // calculate the snapped point, TODO use first point of next instruction for "next" if last point of current instruction if (pIdx + 1 < points.length) { const next: number[] = points[pIdx + 1] if (validEdgeDistance(location.lat, location.lng, p[1], p[0], next[1], next[0])) { @@ -60,7 +100,7 @@ export function getCurrentInstruction( } } - return { instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance } + return {instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance} } export function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: number): number { @@ -138,11 +178,11 @@ function calcCrossingPointToEdge( if (delta_lat == 0) // special case: horizontal edge - return { lat: a_lat_deg, lng: r_lon_deg } + return {lat: a_lat_deg, lng: r_lon_deg} if (delta_lon == 0) // special case: vertical edge - return { lat: r_lat_deg, lng: a_lon_deg } + return {lat: r_lat_deg, lng: a_lon_deg} let norm = delta_lon * delta_lon + delta_lat * delta_lat let factor = ((r_lon - a_lon) * delta_lon + (r_lat - a_lat) * delta_lat) / norm @@ -150,7 +190,7 @@ function calcCrossingPointToEdge( // x,y is projection of r onto segment a-b let c_lon = a_lon + factor * delta_lon let c_lat = a_lat + factor * delta_lat - return { lat: c_lat, lng: c_lon / shrinkFactor } + return {lat: c_lat, lng: c_lon / shrinkFactor} } export function calcOrientation(lat1: number, lon1: number, lat2: number, lon2: number): number { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 05bd745e..fa9833a5 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -2,22 +2,22 @@ import React, { useState, useReducer, useEffect } from 'react' import { Path, Instruction } from '@/api/graphhopper' import { metersToText, milliSecondsToText } from '@/Converters' import { getTurnSign } from '@/sidebar/instructions/Instructions' -import { getCurrentInstruction } from './GeoMethods' +import {getCurrentDetails, getCurrentInstruction} from './GeoMethods' import styles from '@/turnNavigation/TurnNavigation.module.css' import endNavigation from '@/turnNavigation/end_turn_navigation.png' import VolumeUpIcon from '@/turnNavigation/volume_up.svg' import VolumeOffIcon from '@/turnNavigation/volume_off.svg' import { getLocationStore } from '@/stores/Stores' import { LocationStoreState } from '@/stores/LocationStore' -import PlainButton from '@/PlainButton' import { tr } from '@/translation/Translation' type TurnNavigationProps = { path: Path location: LocationStoreState + sound: boolean } -export default function ({ path, location }: TurnNavigationProps) { +export default function ({ path, location, sound }: TurnNavigationProps) { let currentLocation = location.coordinate if (currentLocation.lat == 0 && currentLocation.lng == 0) return Searching GPS... @@ -26,14 +26,15 @@ export default function ({ path, location }: TurnNavigationProps) { currentLocation ) - console.log('remaining distance: ' + remainingDistance + ', time: ' + remainingTime) + let details : number[] = getCurrentDetails(path, currentLocation, [path.details.average_speed, path.details.max_speed]); + + console.log('remaining distance: ' + remainingDistance + ', time: ' + remainingTime + ', details: ' + details) // TODO too far from route - recalculate? if (instructionIndex < 0) return <>Cannot find instruction const nextInstruction: Instruction = path.instructions[instructionIndex] - const [sound, setSound] = useState(true) // not sure how to access old state with useState alone function reducer( state: { distanceToNext: number; index: number; text: string }, @@ -59,8 +60,6 @@ export default function ({ path, location }: TurnNavigationProps) { let averageSpeed = (path.distance / (path.time / 1000)) * 3.6 let lastAnnounceDistance = 10 + 2 * Math.round(averageSpeed / 5) * 5 - // text = '' + averageSpeed + ', ' + distanceToNext - if ( distanceToNext <= lastAnnounceDistance && (state.distanceToNext > lastAnnounceDistance || instructionIndex != state.index) @@ -71,13 +70,16 @@ export default function ({ path, location }: TurnNavigationProps) { let firstAnnounceDistance = 1150 if ( averageSpeed > 15 && // two announcements only if faster speed - distanceToNext > 800 && // do not interfer with last announcement. also "1 km" should stay valid (approximately) + distanceToNext > (lastAnnounceDistance + 50) && // do not interfere with last announcement. also "1 km" should stay valid (approximately) distanceToNext <= firstAnnounceDistance && (state.distanceToNext > firstAnnounceDistance || instructionIndex != state.index) ) { + let inString = distanceToNext > 800 ? tr('in_km_singular') + : tr("in_m", ["" + Math.round(distanceToNext / 100) * 100]) + console.log(inString + ' ' + nextInstruction.text) getLocationStore() .getSpeechSynthesizer() - .synthesize(tr('in_km_singular') + ' ' + nextInstruction.text) + .synthesize(inString + ' ' + nextInstruction.text) } } @@ -85,6 +87,7 @@ export default function ({ path, location }: TurnNavigationProps) { }, [instructionIndex, distanceToNext]) const arrivalDate = new Date() + const currentSpeed = Math.round(location.speed * 3.6) arrivalDate.setMilliseconds(arrivalDate.getSeconds() + remainingTime) const min = arrivalDate.getMinutes() return ( @@ -99,9 +102,6 @@ export default function ({ path, location }: TurnNavigationProps) {
- setSound(!sound)}> - {sound ? : } -
{milliSecondsToText(remainingTime)}
{metersToText(remainingDistance)}
@@ -109,7 +109,7 @@ export default function ({ path, location }: TurnNavigationProps) {
{arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)}
- {Math.round(location.speed * 3.6)} km/h + {currentSpeed} km/h
getLocationStore().stop()}> From 24c51e74990a7f5860d66e0c466e75b03154d2fc Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 9 Dec 2021 16:49:32 +0100 Subject: [PATCH 078/322] show max speed sign --- src/App.module.css | 2 +- src/turnNavigation/TurnNavigation.module.css | 18 +++++++- src/turnNavigation/TurnNavigation.tsx | 45 +++++++++++--------- 3 files changed, 43 insertions(+), 22 deletions(-) diff --git a/src/App.module.css b/src/App.module.css index 6e89debd..b9a488cb 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -55,7 +55,7 @@ grid-column: 1 / span 1; grid-row: 1 / span 1; z-index: 5; - max-height: 6em; + max-height: 8em; margin: 0.5rem; padding: 0.5rem; diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index abf10cea..3c7cc8de 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -11,7 +11,8 @@ } .turnSign img { - max-height: 4rem; + padding-top: 0.4rem; + height: 2.5rem; } .turnSign { @@ -39,3 +40,18 @@ .endnavicon img { max-height: 20px; } + +.maxSpeedEmpty, .maxSpeed { + padding: 6px 6px 0px 6px; /* oben, rechts, unten, links*/ + font-size: 20px; + margin: 0; + text-align: center; + height: 30px; + width: 30px; + border-radius: 50%; +} + +.maxSpeed { + border: 4px solid red; +} + diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index fa9833a5..e9cf12fb 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,15 +1,13 @@ -import React, { useState, useReducer, useEffect } from 'react' -import { Path, Instruction } from '@/api/graphhopper' -import { metersToText, milliSecondsToText } from '@/Converters' -import { getTurnSign } from '@/sidebar/instructions/Instructions' +import React, {useEffect, useReducer} from 'react' +import {Instruction, Path} from '@/api/graphhopper' +import {metersToText, milliSecondsToText} from '@/Converters' +import {getTurnSign} from '@/sidebar/instructions/Instructions' import {getCurrentDetails, getCurrentInstruction} from './GeoMethods' import styles from '@/turnNavigation/TurnNavigation.module.css' import endNavigation from '@/turnNavigation/end_turn_navigation.png' -import VolumeUpIcon from '@/turnNavigation/volume_up.svg' -import VolumeOffIcon from '@/turnNavigation/volume_off.svg' -import { getLocationStore } from '@/stores/Stores' -import { LocationStoreState } from '@/stores/LocationStore' -import { tr } from '@/translation/Translation' +import {getLocationStore} from '@/stores/Stores' +import {LocationStoreState} from '@/stores/LocationStore' +import {tr} from '@/translation/Translation' type TurnNavigationProps = { path: Path @@ -17,18 +15,18 @@ type TurnNavigationProps = { sound: boolean } -export default function ({ path, location, sound }: TurnNavigationProps) { +export default function ({path, location, sound}: TurnNavigationProps) { let currentLocation = location.coordinate if (currentLocation.lat == 0 && currentLocation.lng == 0) return Searching GPS... - const { instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance } = getCurrentInstruction( + const {instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance} = getCurrentInstruction( path.instructions, currentLocation ) - let details : number[] = getCurrentDetails(path, currentLocation, [path.details.average_speed, path.details.max_speed]); + let [calculatedAvgSpeed, maxSpeed] = getCurrentDetails(path, currentLocation, [path.details.average_speed, path.details.max_speed]); - console.log('remaining distance: ' + remainingDistance + ', time: ' + remainingTime + ', details: ' + details) + console.log('remaining distance: ' + remainingDistance + ', time: ' + remainingTime + ', avg: ' + calculatedAvgSpeed + ", max: " + maxSpeed) // TODO too far from route - recalculate? if (instructionIndex < 0) return <>Cannot find instruction @@ -42,14 +40,15 @@ export default function ({ path, location, sound }: TurnNavigationProps) { ) { return action } - const [state, dispatch] = useReducer(reducer, { index: -1, distanceToNext: -1, text: '' }) + + const [state, dispatch] = useReducer(reducer, {index: -1, distanceToNext: -1, text: ''}) // speak text out loud after render only if index changed and distance is close next instruction useEffect(() => { console.log( 'useEffect', state, - { index: instructionIndex, distanceToNext: distanceToNext }, + {index: instructionIndex, distanceToNext: distanceToNext}, nextInstruction.text ) @@ -83,7 +82,7 @@ export default function ({ path, location, sound }: TurnNavigationProps) { } } - dispatch({ index: instructionIndex, distanceToNext: distanceToNext, text: text }) + dispatch({index: instructionIndex, distanceToNext: distanceToNext, text: text}) }, [instructionIndex, distanceToNext]) const arrivalDate = new Date() @@ -95,6 +94,11 @@ export default function ({ path, location, sound }: TurnNavigationProps) {
+ { + maxSpeed == null + ?
+ :
{Math.round(maxSpeed)}
+ }
{getTurnSign(nextInstruction.sign, instructionIndex)}
@@ -108,12 +112,13 @@ export default function ({ path, location, sound }: TurnNavigationProps) {
{arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)}
-
- {currentSpeed} km/h -
+
{currentSpeed} km/h
+
+
+
{Math.round(calculatedAvgSpeed)}
getLocationStore().stop()}> - +
{state.text}
From 02818e7f26289e3c74cdd73dc5b4355250a36402 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 9 Dec 2021 16:54:18 +0100 Subject: [PATCH 079/322] fix --- src/NavBar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NavBar.ts b/src/NavBar.ts index a38685ec..7d2c1d73 100644 --- a/src/NavBar.ts +++ b/src/NavBar.ts @@ -29,7 +29,7 @@ export default class NavBar { result.searchParams.append('profile', queryStoreState.routingProfile.name) result.searchParams.append('layer', mapState.selectedStyle.name) - if((new URL(window.location.toString()).searchParams.get('fake')) != null) result.searchParams.append('fake', true) + if((new URL(window.location.toString()).searchParams.get('fake')) != null) result.searchParams.append('fake', "true") return result } From 6d127864ef3b1875c5de4c6c3c1bf8c1f6646b3f Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 9 Dec 2021 17:31:43 +0100 Subject: [PATCH 080/322] make fake param working --- src/NavBar.ts | 2 +- src/sidebar/RoutingResults.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NavBar.ts b/src/NavBar.ts index 7d2c1d73..f90b69f0 100644 --- a/src/NavBar.ts +++ b/src/NavBar.ts @@ -29,7 +29,7 @@ export default class NavBar { result.searchParams.append('profile', queryStoreState.routingProfile.name) result.searchParams.append('layer', mapState.selectedStyle.name) - if((new URL(window.location.toString()).searchParams.get('fake')) != null) result.searchParams.append('fake', "true") + if(!result.searchParams.has('fake')) result.searchParams.append('fake', "true") return result } diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 3aa99263..4e8c4253 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -29,7 +29,7 @@ function RoutingResult({ path, isSelected }: { path: Path; isSelected: boolean } const resultSummaryClass = isSelected ? styles.resultSummary + ' ' + styles.selectedResultSummary : styles.resultSummary - const fakeNavi: boolean = new URL(window.location.toString()).searchParams.get("fake") != null + const fakeNavi: boolean = new URL(window.location.href).searchParams.has('fake') useEffect(() => setExpanded(isSelected && isExpanded), [isSelected]) From 34688323c41f8175c61fb08250d470450c2b6801 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 9 Dec 2021 18:07:56 +0100 Subject: [PATCH 081/322] fake only works if appended to URL with layer and profile params --- src/NavBar.ts | 1 - src/index.tsx | 7 +++++-- src/sidebar/RoutingResults.tsx | 8 ++------ src/stores/LocationStore.ts | 15 +++++++++++++-- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/NavBar.ts b/src/NavBar.ts index f90b69f0..2ad44b05 100644 --- a/src/NavBar.ts +++ b/src/NavBar.ts @@ -29,7 +29,6 @@ export default class NavBar { result.searchParams.append('profile', queryStoreState.routingProfile.name) result.searchParams.append('layer', mapState.selectedStyle.name) - if(!result.searchParams.has('fake')) result.searchParams.append('fake', "true") return result } diff --git a/src/index.tsx b/src/index.tsx index cecd9c3b..9b216c80 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -28,7 +28,9 @@ import NavBar from '@/NavBar' import * as config from 'config' import { getApi, setApi } from '@/api/Api' -let locale = new URL(window.location.href).searchParams.get('locale') +let url = new URL(window.location.href); +let fake = url.searchParams.get('fake') +let locale = url.searchParams.get('locale') setTranslation(locale || navigator.language) let speechSynthesizer = new SpeechSynthesizer(navigator.language) @@ -50,6 +52,8 @@ setStores({ viewportStore: new ViewportStore(routeStore, () => smallScreenMediaQuery.matches), }) +getLocationStore().setFake(fake !== null) + // register stores at dispatcher to receive actions Dispatcher.register(getQueryStore()) Dispatcher.register(getRouteStore()) @@ -76,7 +80,6 @@ document.body.appendChild(root) ReactDOM.render(, root) function getApiKey() { - const url = new URL(window.location.href) // use graphhopper api key from url or try using one from the config return url.searchParams.has('key') ? url.searchParams.get('key') : config.keys.graphhopper } diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 4e8c4253..bc2ed318 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -29,8 +29,7 @@ function RoutingResult({ path, isSelected }: { path: Path; isSelected: boolean } const resultSummaryClass = isSelected ? styles.resultSummary + ' ' + styles.selectedResultSummary : styles.resultSummary - const fakeNavi: boolean = new URL(window.location.href).searchParams.has('fake') - + useEffect(() => setExpanded(isSelected && isExpanded), [isSelected]) return ( @@ -42,10 +41,7 @@ function RoutingResult({ path, isSelected }: { path: Path; isSelected: boolean } {metersToText(path.distance)}
- { - if(fakeNavi) getLocationStore().initFake() - else getLocationStore().initReal() - }} src={startNavigation} /> + getLocationStore().init()} src={startNavigation} />
{isSelected && ( setExpanded(!isExpanded)}> diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 551cdf37..11b61ef6 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -22,12 +22,17 @@ export default class LocationStore extends Store { private noSleep: any private readonly speechSynthesizer: SpeechSynthesizer private started: boolean = false + private fakeNavi = false constructor(speechSynthesizer: SpeechSynthesizer) { super() this.speechSynthesizer = speechSynthesizer } + setFake(fake: boolean) { + this.fakeNavi = fake + } + public getSpeechSynthesizer(): SpeechSynthesizer { return this.speechSynthesizer } @@ -48,7 +53,13 @@ export default class LocationStore extends Store { return state } - public async initFake() { + public async init() { + if(this.fakeNavi) await this.initFake() + else this.initReal() + } + + private async initFake() { + console.log("started fake GPS injection") this.started = true // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car @@ -115,7 +126,7 @@ export default class LocationStore extends Store { else Dispatcher.dispatch(new SetViewportToPoint(c, 17, 50, bearing)) } - public initReal() { + private initReal() { this.started = true if (!this.noSleep) this.noSleep = new NoSleep() this.noSleep.enable() From 1696e4cfca9603feac6a3a6cf77de67ea3f7d086 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 9 Dec 2021 18:34:13 +0100 Subject: [PATCH 082/322] allow to show more details for debugging --- src/api/graphhopper.d.ts | 2 ++ src/stores/RouteStore.ts | 2 ++ src/turnNavigation/GeoMethods.ts | 2 +- src/turnNavigation/TurnNavigation.module.css | 4 ++++ src/turnNavigation/TurnNavigation.tsx | 11 +++++------ 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/api/graphhopper.d.ts b/src/api/graphhopper.d.ts index e851eab2..f4c003a8 100644 --- a/src/api/graphhopper.d.ts +++ b/src/api/graphhopper.d.ts @@ -87,6 +87,8 @@ export interface Instruction { interface Details { readonly street_name: [number, number, string][] + readonly surface: [number, number, string][] + readonly road_environment: [number, number, string][] readonly toll: [number, number, string][] readonly max_speed: [number, number, number][] readonly average_speed: [number, number, number][] diff --git a/src/stores/RouteStore.ts b/src/stores/RouteStore.ts index 26fdf8a2..ee90ea59 100644 --- a/src/stores/RouteStore.ts +++ b/src/stores/RouteStore.ts @@ -26,6 +26,8 @@ export default class RouteStore extends Store { ascend: 0, descend: 0, details: { + surface: [], + road_environment: [], average_speed: [], max_speed: [], street_name: [], diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 2efea22b..7ca30152 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -1,7 +1,7 @@ import {Instruction, Path} from '@/api/graphhopper' import {Coordinate} from '@/stores/QueryStore' -export function getCurrentDetails(path: Path, location: Coordinate, details: [number, number, number][][]): number[] { +export function getCurrentDetails(path: Path, location: Coordinate, details: [any, any, any][][]): number[] { let smallestDist = Number.MAX_VALUE const points = path.points.coordinates let foundIndex = -1 diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 3c7cc8de..2a0a3fed 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -41,6 +41,10 @@ max-height: 20px; } +.details { + +} + .maxSpeedEmpty, .maxSpeed { padding: 6px 6px 0px 6px; /* oben, rechts, unten, links*/ font-size: 20px; diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index e9cf12fb..47e0fbb7 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -24,9 +24,11 @@ export default function ({path, location, sound}: TurnNavigationProps) { currentLocation ) - let [calculatedAvgSpeed, maxSpeed] = getCurrentDetails(path, currentLocation, [path.details.average_speed, path.details.max_speed]); + let [estimatedAvgSpeed, maxSpeed, surface] = getCurrentDetails(path, currentLocation, + [path.details.average_speed, path.details.max_speed, path.details.surface]); - console.log('remaining distance: ' + remainingDistance + ', time: ' + remainingTime + ', avg: ' + calculatedAvgSpeed + ", max: " + maxSpeed) + estimatedAvgSpeed = Math.round(estimatedAvgSpeed) + console.log('remaining distance: ' + remainingDistance + ', time: ' + remainingTime + ', avg: ' + estimatedAvgSpeed + ", max: " + maxSpeed) // TODO too far from route - recalculate? if (instructionIndex < 0) return <>Cannot find instruction @@ -112,10 +114,7 @@ export default function ({path, location, sound}: TurnNavigationProps) {
{arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)}
-
{currentSpeed} km/h
-
-
-
{Math.round(calculatedAvgSpeed)}
+
{currentSpeed} km/h ({estimatedAvgSpeed})
getLocationStore().stop()}> From e8f9917ee16d82d30f2f9d5916aaa992baf9a936 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 9 Dec 2021 22:26:17 +0100 Subject: [PATCH 083/322] less clutter --- src/App.module.css | 6 +-- src/App.tsx | 16 ++++--- src/Converters.ts | 2 +- src/api/graphhopper.d.ts | 1 + src/stores/RouteStore.ts | 1 + src/turnNavigation/TurnNavigation.module.css | 36 +++++++++------ src/turnNavigation/TurnNavigation.tsx | 47 +++++++++++++------- 7 files changed, 71 insertions(+), 38 deletions(-) diff --git a/src/App.module.css b/src/App.module.css index b9a488cb..db07a743 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -4,7 +4,7 @@ padding: 0; margin: 0; display: grid; - grid-template-columns: 25rem 1fr auto; + grid-template-columns: 27rem 1fr auto; grid-template-rows: 100%; justify-content: space-between; overflow: auto; @@ -55,7 +55,7 @@ grid-column: 1 / span 1; grid-row: 1 / span 1; z-index: 5; - max-height: 8em; + max-height: 7.5em; margin: 0.5rem; padding: 0.5rem; @@ -137,8 +137,8 @@ } .smallScreenVolume { - grid-column: 1 / span 1; grid-row: 1 / span 1; + grid-column: 1 / span 1; padding: 5px 4px 3px 7px; width: 30px; z-index: 2; diff --git a/src/App.tsx b/src/App.tsx index c973b841..bff94332 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import React, {Dispatch, useEffect, useState} from 'react' +import React, {Dispatch, SetStateAction, useEffect, useState} from 'react' import PathDetails from '@/pathDetails/PathDetails' import styles from './App.module.css' import { @@ -89,7 +89,8 @@ export default function App() { if (location.coordinate.lat != 0 && location.coordinate.lng != 0) mapLayers.push(createCurrentLocationLayer(location.coordinate)) if (!isSmallScreen) mapLayers.push(createPathDetailsLayer(pathDetails)) - + // keep sound state even when screen size changes (like rotating) + let sounds = useState(true); return (
{isSmallScreen ? ( @@ -102,6 +103,7 @@ export default function App() { mapOptions={mapOptions} error={error} info={info} + sounds={sounds} /> ) : ( )}
@@ -128,10 +131,11 @@ interface LayoutProps { mapOptions: MapOptionsStoreState error: ErrorStoreState info: ApiInfo + sounds: [boolean, Dispatch] } -function LargeScreenLayout({query, route, location, viewport, mapLayers, error, mapOptions, info}: LayoutProps) { - let [sound, setSound] = useState(true); +function LargeScreenLayout({query, route, location, viewport, mapLayers, error, mapOptions, info, sounds}: LayoutProps) { + let [sound, setSound] = sounds return ( location.turnNavigation ? <> @@ -197,8 +201,8 @@ function LargeScreenLayout({query, route, location, viewport, mapLayers, error, ) } -function SmallScreenLayout({query, route, location, viewport, mapLayers, error, mapOptions, info}: LayoutProps) { - let [sound, setSound] = useState(true); +function SmallScreenLayout({query, route, location, viewport, mapLayers, error, mapOptions, info, sounds}: LayoutProps) { + let [sound, setSound] = sounds return (location.turnNavigation ? <>
diff --git a/src/Converters.ts b/src/Converters.ts index f9d1f579..98c673e6 100644 --- a/src/Converters.ts +++ b/src/Converters.ts @@ -7,7 +7,7 @@ export function milliSecondsToText(seconds: number) { const minutes = Math.floor((seconds % 3600000) / 60000) const hourText = hours > 0 ? hours + ' h' : '' - if (minutes == 0) return hourText + if (minutes == 0 && hourText.length > 0) return hourText return hourText + ' ' + minutes + ' min' } diff --git a/src/api/graphhopper.d.ts b/src/api/graphhopper.d.ts index f4c003a8..5747e5ba 100644 --- a/src/api/graphhopper.d.ts +++ b/src/api/graphhopper.d.ts @@ -89,6 +89,7 @@ interface Details { readonly street_name: [number, number, string][] readonly surface: [number, number, string][] readonly road_environment: [number, number, string][] + readonly road_class: [number, number, string][] readonly toll: [number, number, string][] readonly max_speed: [number, number, number][] readonly average_speed: [number, number, number][] diff --git a/src/stores/RouteStore.ts b/src/stores/RouteStore.ts index ee90ea59..6f85dab8 100644 --- a/src/stores/RouteStore.ts +++ b/src/stores/RouteStore.ts @@ -28,6 +28,7 @@ export default class RouteStore extends Store { details: { surface: [], road_environment: [], + road_class: [], average_speed: [], max_speed: [], street_name: [], diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 2a0a3fed..02a7cf76 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -1,4 +1,5 @@ .turnInfo { + font-size: 20px; display: flex; padding: 0.5rem; } @@ -12,7 +13,7 @@ .turnSign img { padding-top: 0.4rem; - height: 2.5rem; + height: 3.5rem; } .turnSign { @@ -22,6 +23,13 @@ font-weight: bold; } +.arrival .remainingDistance { + color: gray; + padding-top: 10px; + padding-bottom: 3px; + float: right; +} + .arrival { display: flex; font-size: larger; @@ -29,15 +37,21 @@ justify-content: space-between; } +.arrival svg { + padding-left: 22px; + padding-right: 22px; +} + .arrivalDuration { - font-weight: bold; + } -.arrivalTime { - padding-left: 1rem; +.debug { + font-size: x-small; + float: right; } -.endnavicon img { +.thirdCol img { max-height: 20px; } @@ -45,17 +59,13 @@ } -.maxSpeedEmpty, .maxSpeed { - padding: 6px 6px 0px 6px; /* oben, rechts, unten, links*/ - font-size: 20px; - margin: 0; +.maxSpeed { + padding: 4px 7px 2px 7px; /* oben, rechts, unten, links*/ + margin-left: 15px; text-align: center; height: 30px; width: 30px; border-radius: 50%; -} - -.maxSpeed { - border: 4px solid red; + border: 4px solid rgba(255, 0, 0, 0.6); } diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 47e0fbb7..702902ef 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,4 +1,4 @@ -import React, {useEffect, useReducer} from 'react' +import React, {useEffect, useReducer, useState} from 'react' import {Instruction, Path} from '@/api/graphhopper' import {metersToText, milliSecondsToText} from '@/Converters' import {getTurnSign} from '@/sidebar/instructions/Instructions' @@ -24,8 +24,8 @@ export default function ({path, location, sound}: TurnNavigationProps) { currentLocation ) - let [estimatedAvgSpeed, maxSpeed, surface] = getCurrentDetails(path, currentLocation, - [path.details.average_speed, path.details.max_speed, path.details.surface]); + let [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, currentLocation, + [path.details.average_speed, path.details.max_speed, path.details.surface, path.details.road_class]); estimatedAvgSpeed = Math.round(estimatedAvgSpeed) console.log('remaining distance: ' + remainingDistance + ', time: ' + remainingTime + ', avg: ' + estimatedAvgSpeed + ", max: " + maxSpeed) @@ -43,6 +43,8 @@ export default function ({path, location, sound}: TurnNavigationProps) { return action } + let [showTime, setShowTime] = useState(true); + let [showDebug, setShowDebug] = useState(false); const [state, dispatch] = useReducer(reducer, {index: -1, distanceToNext: -1, text: ''}) // speak text out loud after render only if index changed and distance is close next instruction @@ -96,11 +98,6 @@ export default function ({path, location, sound}: TurnNavigationProps) {
- { - maxSpeed == null - ?
- :
{Math.round(maxSpeed)}
- }
{getTurnSign(nextInstruction.sign, instructionIndex)}
@@ -108,15 +105,35 @@ export default function ({path, location, sound}: TurnNavigationProps) {
-
-
{milliSecondsToText(remainingTime)}
-
{metersToText(remainingDistance)}
+
setShowTime(!showTime)}> + {showTime + ?
{arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)} + + + + +
+ :
{milliSecondsToText(remainingTime)} + + + + +
+ } +
{metersToText(remainingDistance)}
-
-
{arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)}
-
{currentSpeed} km/h ({estimatedAvgSpeed})
+
setShowDebug(!showDebug)}> +
{currentSpeed} km/h
+ { maxSpeed != null ?
{Math.round(maxSpeed)}
: null } + { showDebug ? +
+
s={estimatedAvgSpeed}
+
{surface}
+
{roadClass}
+
: null + }
-
getLocationStore().stop()}> +
getLocationStore().stop()}>
From 1f6ec12251dc669e1c988701ba503021c57414de Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 10 Dec 2021 12:18:24 +0100 Subject: [PATCH 084/322] round circle: do not mess with padding too much --- src/turnNavigation/TurnNavigation.module.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 02a7cf76..66a7da0b 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -60,12 +60,12 @@ } .maxSpeed { - padding: 4px 7px 2px 7px; /* oben, rechts, unten, links*/ + padding: 7px; margin-left: 15px; text-align: center; height: 30px; width: 30px; border-radius: 50%; - border: 4px solid rgba(255, 0, 0, 0.6); + border: 4px solid rgba(255, 0, 0, 0.6); /* red */ } From b1dd6c05b6f08ab693b27ff711eee7d0e06e12e4 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 10 Dec 2021 12:21:58 +0100 Subject: [PATCH 085/322] try with enableHighAccuracy: true --- src/sidebar/search/AddressInput.tsx | 2 +- src/stores/LocationStore.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sidebar/search/AddressInput.tsx b/src/sidebar/search/AddressInput.tsx index b2dbb983..59970aea 100644 --- a/src/sidebar/search/AddressInput.tsx +++ b/src/sidebar/search/AddressInput.tsx @@ -188,7 +188,7 @@ function onAutocompleteSelected( onSelect('', undefined) }, // DO NOT use e.g. maximumAge: 5_000 -> getCurrentPosition will then never return on mobile firefox!? - { timeout: 300_000 } + { timeout: 300_000, enableHighAccuracy: true } ) } } diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 11b61ef6..bfbb47c2 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -139,9 +139,9 @@ export default class LocationStore extends Store { if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) let options = { - timeout: 120_000, + timeout: 300_000, // maximumAge is not a problem here like with getCurrentPosition but let's use identical settings - // enableHighAccuracy: false + enableHighAccuracy: true } this.watchId = navigator.geolocation.watchPosition( this.locationUpdate, From e77102b77093c5e299c1e83b297c9eb823360450 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 14 Dec 2021 09:50:52 +0100 Subject: [PATCH 086/322] removed unnecessary header png and made end_turn_navigation image smaller --- src/sidebar/header.png | Bin 14196 -> 0 bytes src/turnNavigation/end_turn_navigation.png | Bin 18527 -> 9587 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/sidebar/header.png diff --git a/src/sidebar/header.png b/src/sidebar/header.png deleted file mode 100644 index 6d74c0fe66c484f5c0e3d4f5e2affb56ed8efe54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14196 zcmXwf18^j5+x5h@Z9TEQv9rM@8#|k1W83D&wr$(k*mkn9?d0pX>i>IcW~ydty6^kK zxz0J$;YtcpNbvaZAP@*iMq2y_@O}t9`C*}fSKF~iSr7>8mxro`(+@*eQacA*Q*$d5 zQYUvi6H*g5b5jt=ZLKQZ+~FTjeDK#DrXwT>xz~T+fHQ;O{^rOt>hD;2WhGZeS~6Qx z5N*7j?^vkmE_EC=;J=ro1j&0L2zT3Fq6UTFY@bvnTBjU@)b9dJ3hvxg)Sx$Ixo>pLW+4V}!c4E+S6Dpogit4Df37k%f8O=xL@YEl@qJMmP z74%KK-94QW0O90q}1q8aj~_gFu;-EH1nGSCQ|s5_WbP<_qQCy-DPgh zrDFs4@ePd~*gMAv%{@h{)paw3gWVazTUYSMC&+fP>Y+*T0*E|G`nusAI`^oBy4jq* zEShoiIe(4pcrMqpdd(tU#*?-8=#i%t)wv^+<6ue5kYRHq2=N97rZzTPB-lSC8ly#t zTAht^W#&)xDFh}@= zLT-k|=IqmKXZNe7ImTc)N$Q%;FBTOwb@R|5OwNeb!FQbZT8L z4z+E%eAX{q-)Ea_)xXx7^!cBzIZOk+B1xjU})?BC4%b|jYv=y&Lpk)vHB-^W?6@=!AT?`ia1~#%9rbRKXEck=( z+*ZuW?)#)-xK#ppX-u^DGske&&(e=os&6tm+5(--Zy5sFlIqmk-iALB^~&EIzDlAv zRP;mHU>X+psxkJgH#Pn}q$O z+r6H2C4 zS}h38qzP^Lwyb2G)AVRXp+7EKAmH_g_of8-Y!&x#xF zGC{<4lqKIdw~`*So7<+xLCTBJ9Q=-GD1WmrhHEn)i@*1c*)WSY43XasXp80Qzbc@ z_YcMaOL_e+O~QP5kocAlO;! zV24SLug4m$tR>{<$-*<1c?1seNZ36~reRt^SW!SI|}GG|c|gqx7%<0n16d6*kv zVMr=k%u?Z?51_$*<3JjGwu*Hv;IuN6M14Ejc>Lk8U!NB8?=6hyza$22v2S($Qv!Ie zN?e7UOMTLv~FW8eC={7;$L*GYD^k+novaFm+_+`>NX_%6zf)8&aCa{30`)smzd07an zQ*W(74vLoaN1sfUS8K2c;c2IRRhAUY_|z48>ske z3ChmstNVw-KMIyXG3rkdi2lJ%Rt=eWf3PZXMS){{IjFt<1=yf~xr^ZmqeSKbL{|_- zVeJyvZQy4tH+1mkkDSHJ@tTbYf&D%z2>#(ZgD-J-Yf@d8mlIe5=ZtGgaL>lkx!B0= zT6-du%{m(pW0SMmkO*40Im85AaiDZ*!x`3pXJClR*aqj18=FU_Y(W%mv0z+yN-$Uy z&Pwo;-$yyqd2i$yV2<^vu>&^_oP@!7+)zn0;76v>{-B#L{rwNdS)2kdx^sp+MZG$4 zi0`#~@$ipf2UMdnOUM&zdSw;K4;P8;Gzxl{)PEtByTxoe2w}HDbNQ)6o>4?eb))7* z5Evx87yg0Qi_z{>16FACu=tz@-(U%Q%lqC$mZf$!w9ANBl!1Q94p7 z?X+VGl0&v#AAPL5 zUO1+a^EpFK`a%9X;g#~7NaeE9=#;XUTk@NIe@IJ{YPI@?rF7~jE+n!IYv^sizUBb5JFMjL|ZE~XhsWp zB%Z^_I#wXQH3{QC630c5uKxy&yg_5%$>Q@8jIN#jZt2Y;G6@qXBpA12*e{j0-ESz(azwG*yG zRw_a@0}tku=eGiU7-whF@?*#NR-=0=ds=f3F(Flq(KdG%ZHn${PQ@ZRS02U?Ts~Pa zF+#`)#oT+)^g?(7iMfvt58sMyCTzvML>zGU^^OgO_bwY5_O+_EY zq|%lc*41*~A>NyjUtrJ;GwBiM?aETi%ZOm$)BTmemN(Q|WB!S1leL=vd%3sCb9Kr- zb}6H3lvfM(%EjcVVS^Us@(yJS^s*lC4G0aD{e8rvBXP&gp$=W)ux{t8UOUZ!vt}B% z;733{Pf|G;{~fyanOJgxxEPs_O!JgcR%!0gdKQVPPn>@$fUo<+mNPO-`s_M!%BFBl z2FP}5dm#{VIbi8`|naA9wFC1 z$NvCZ#uQ@{57)|lI^tau87Y92a*3cMRr2K(h-YEZ(7Ln%QJkG8qVe zs`~GdOGKu{VwQh|?{2^4^Dd0E@b1ez5B6X!#mWN zd(6&Z)r52*MEzRw5uVx&Qtjxq^*^|X2Vo9FpBYWgKzmTDL=<(&QpfU*sJF2W+TUn; zQa~P$LE%43ZGC&#$=20rl$~XQjsu74BU0P(;!sg~M*Kx-J->rKx*9UQv}L)dfMJt; z9!XE!saxzIsi}x!6`CwOGmbpXi!Qw%%m-Z;PzfTnwrwpU@}> zL-e^pY_xsmB(XFc)!`RmH2HbIdGJ-1M&eq-0;RM}3`BXJA}R5MV%Xp=1NdAd$czkP z*g1KaSQgrj(L>{67PK%5rX0^BWU76T5@w;GX=s`-FMEhDm7666rm(S4@_+?DjCAli z<+g0J^dj6;va==Dgp-5iwh=vKOqgP9WWxD)Dfw_JqqWgB*@`@>U{ykd2HzTXs0dA= zVhmL-MNVAkbF|g6^x!1>F434vB}J^*ZAm6Cc0eqgZV}Bc5v~4IbqUO%tzdvA8b$I! z!!Fgu=K`hQva1m2QIVDfM`UQn^}FYc&7Y%ST|W}P7<;Qhk{{oA(k)YXlj3G%CXm}x z8$_v}ydfzFLWL@XmRPvR zk;V*NiBwc(-lS5bj-6>sRhO&h3j3qG)wvFdOM>t8o+MrhQhT_>j%{pKdb;ohc8a9a zosvdBq)H?GB!)AO@d+hawaiQK@#VHz*JCr^krW^@<01d*{=VEKC#eed7YEedth2z05_7F&C&PjAQEGk5PJ$N_h|CvJah1VUzdfAVWJ+S&M)Sa-^xPo}jet+km_hG(w)bdlHsg0H@6~Fz1Gz2Lud$FBBQ_;v8 zUyIjdtDy*H{ZgX(d^ApUZY}ydq+|f@+oe3}GHPxAm>Q=iBs8|VfhO+7RV3B-Byz_lQ1Bl!I+xzP;r}D zJ-*qD;wT?BtE$7C2qU3utH2P^z}ZfmUXO~aqJX}SFvNIqCbSdv%kEyCT1MMI%nt50 zy0+t_&pz1h1anS^0KT0utiBd8^~%wn`{y)P4pU^nkwvN~xF46dkw=cJA7x9MOn?TV z1^kiGHf_41HBBU3rYN=6c;UARNC84RPU^+ExqVb6=&*#Sr&%#XT-2xkYR~#Aw<8WJ z1_>(lBd$A!IJ3#drK!n9(Vn)?z56EP6AEA@z@j4QODUD<&@9k~68qX+bjuk8?p_wy zlO(NvTZ*AD?Q--OWEABr@AYlMbSxB@xD{I@e6|)?r4vubcU`<05{=jXz)cL`rCK|q zqe(gu^G#gjFTlZiml~z*Y9`5(zJ-H8XCHI3jE(W!y0T;c+MfRM%3l`QDCkM5^L!}5 z#$hpwBe?2jS$V#nhK3;vs6J^UpX~XEvH;%!mBxAzgt^IkLXUHhZOPMDT0$#q;UFNh zxAnd|*+%l5Z%A!mZgb@eijWVt6ONtF2Z6wX&Ber&WW>b&zuyW1(Z+el2}%zL5d^Y(_}>%E=QsNw;6oTEneP%X`_Nce zkT^24wW}ZyDM&_KMAdEWBFo(iMScBiJ3&Gey*{i_R#iqk7JYlA{D-OpW77h<_QgF@ z`$nN+1#J<6^=M#86_bsYQ(p7Zn#1y~23wu#`GT4(#UQ$jc=z3#@l;{L=)}K_ou@|E zo}A8Ga>wK}-XonOo#mtUDZE-K*lY4yd>&*SP&635pPBz{>y0lI$_~U1{>=O)p)ZOX z_`V;3pV6Hs-g9V2+ovLn=2_@klcoN8o8wUf2DQ9h%a||AyZ^%wY~hV-TuVz!O2E&*HNjM$1`Xf!dg~C(MVi;uzs;ZJ;j;Z9E=zu z87!QL&*@n!`QUGd#*y1DBUCmb>BT zT~om^Yz8w5RD#OiWNRGhc}qV6kApGD%KuZPlBM)3(6A^X9G6>H7Wdi2C;J8zl|R ze667vr3^R^*ssU))rPTUeP5!-lad_p>zAXPgxJ_vhVffhf;1F1NXlyLCl^L90k;iEfb#Pm;x*!_ zgTxNJ2b|u2Xiv|y6qbWiuGQfHKF9ad-F-&}XPbFqWW;PFnNfR9;PtqG4%;0+{LuBG;WR zJ1;HOZ6bS@>pD5yyV|f-v+ZQQgub5P3X&K{^!MTtj5D}ZvsQZY-SstX(#y@P6iHT! z3Gbj?PJ6E!&KZyB=&0y-PabQPD?U~?xd6x=?#S0$|EC~OYk-GQ{si;k#}fpn+;x@2`^&a?aG$dOs|U-ux@exqPytOB1Yfds!{y59C{xo}b` zjw(Jpz43B#a%z`A`vP`QwchFO*orVcBT}kt5;5-fdVgZJRH@lONkuip10iIT{56v& z7KO(?j1rhJfXHpLQR)J0X0o0kG~+i$v$U+N(d9jH zcj6H~mTb?Ks^m;Go3(h4Kq@*XG+n(WCMMPiCaVfO6v6HXwH36qw6M8pQuaaO8C=$- zT224;wu~n;%GHggGh3m6fWw@bG~s{Ed0Iw%;2{5xd0Z2AsJ0*o^(LAL;sO$yHZQGSfPzE*kC$Yo|K*4 z-Fwo=VNBFZ^NP^d*Vk}u3~5D0 zTgs>-b}kc1aG79SI%ei<_d~q@)GEVDN@!Yax2c7Max50h%{3J;X9b7hCwIGgcs6y1;CKw=1m zeBKWfviQ8ex!?XP5YF1eFEtrYzQ5ee7)zpeJei}yX4D#NcRq{wx8Ci|e{ym{ME|oK zlMXh{AR_$x;iaMp4S`@10__NE z-t7DJNh2mEmcvFC^d6l11_C-Y9au0LCZ@QH3s;BB#a>a0-ha2>v|DTrR_ctIf$;cz z0@sN-3p!%-?j{!WV6j?Z0f+dh!VN^NO1tHD+80|_?Dp=C*Y#3I9wka^dYHjW#{dWr8@D7wYFfOv0Z=D(|I)F0P z+EnBJeuy{DVY8tjBO{~SY_r)u7{RmJXr2H}GZW2Z`i$DhG*grAuTM{4M0Y)2gW8eM z91kaEvz-S6pb(-ePOrG8^IFiMZnybPQ=o^4;c~ zMV=Wr7m4~WIV2K?*+aEPudB_#p0l&6rGnVwn9NT%J3BiEg^)){|2^P(6RZA?Nxxg( z)YSB4XJQRMgbinuOM2qq3qzF;LW}^KTDlQmU$${Y1~H1G|5lPZd!j?0e}Wz<1yS=O-ti zJKXO~Yx8N*LJCWi_IVJHHeg7+Pz{QDdVJCH7IsB$j3k2CSXt{x$wx(5W*6xEHFk+< ze`~Pzrr<(K4S*qF|Ge|mgr6>m`4$lx3e(GgfkZxEe8H(ZzEn~Y*~@3Rm^6&=wCPIX zR}Zv|N->AgFOiLpCv0cpIs+B3(?}sp@ag0E;K}BC@3+U|!Lrq%%uGV-B*?|pZCORq zBt~s)gWzBnmkp=lc4s-ysgWpi^=izpU_4_pJ}?B=S?kb&T{2iYMT`b8gP<%W3;ILN zjRw=0(W+N(3-yG~N z1ds$a>BK-)RaN}Qj~`^{w1R>}0~5T}vCMlh3Y)g}UxX@rd_wvv;enOJI!F8K=N4V< zqZqx*5~AGGKM$AJ*9ms^%70eKr~TI74$v;vRE;xin6u1!u2-hVcoMWwK7wk91b|#} z#G+eGTJ}FRhU#smbX}kusY{i)XQ`w30pQ5@dbu^Vo^J~)RI4n#VKwt7GevAy(tPrC zcfX*kwiO7n9YPO9Az>0dP2EAFCy5V3`!lPHA0_iEGWAB-xmU}Ofm#{+=H^D=am5(+ zv7&xp_je}%3@}k^eyL;wP7FF`k#DV+%QNO5E~fsZc=Zemxn4M@Jp}wJ6Kek=HG&qx z@4aN=9b|9ijRGF931H_;&X2Axc;7ysjhS>>W9@c&!73QM zYkAj1OWl7uKgrdbKko&R&q{t*^& zqp&;AmI@!A|I+5XQ&1CCCsWJwsz_p{r$^{5BY2i*G;D}8iceD7H}Gaum97{qjrdL= zS1Pq8O-&u4oAtCVpG?f>n1^~eoihy#m&3g5g`0|J*Gksyvzi`-NNh%skMGyVQ-jie zQPps(TtauKhDo%h36I+~sYGqk>+nB+lA>HZ4eG^ zdp?R+tIZg7;BzI7G$oAFB-_JCV|5k`98~ULIlEU8i@nc}jzZ^8CfF%L9xv8QzLS4) z6(=vYj!NLv0SWB8#I^{9M#8@al%GYMeVT9ym0U6lGAfeV?(uAaxTNG`d!YTVHZbkd@igk7@2%lu6kst%cFz_(?zfZ=r;8Ox z=Ny_u5rZ4hP*CQ-hGouMv^MGHu3UmUT(61&9-ZVbXe7bJaSaRtSq~4syu7@{?^gW= z3|z1quG`)^Z4O0<*gl&DQZYY@WU<)4-2JfBmFtWorZRakjHzZy6mzKg`1m#kIXtCD ztiD(WmdXm;34NrH{OIb(pkQFw4f`Phj>+SEipg!eB_2*b|9HaaOo#5iJD#<^bgTZM9oEDu0a%kiIy~w5;_}IP?t99ttR8xY;0^^CYse? z?*_?cKtOo1rf3+}3Z$R)L`A^?o}9^Jzb8`h=JU8}_UqTLM$Tsz&L1UV&2s=tA4_H& z2Xr4}TQrc5Sl}XD-SV!yRFss*a0NM4YA%||=Ck=jC}JUqs~iBOiUc~};oHak{NUiA z&g0FECd7Rl<>;;*PxQv_GgG~hg&XnW$=ChnxmTY?vhVxNh?t+Ot40=sS_gTHXh03J%MqN~qJVMVH}w%?49@fITYjeau1XU+3d8OU#rd;2$@+UTt~ti{50p zZkdzI%(1BUn7A8&%J;irwOZ8LlC9U9HPH>|)vF7Ew0HFn4D|2-gWpB9MGGC9fX>L+ zn3Kt{B-Ji7?ci-MlKJ}nJ_`4nS8IWM8e7W!U|hIm@naY2M5mvhUp5iH%e&j#<3*rC zwt&034Qc5OTcVe37G5_yhP)pj(g3rNY!BWh}DE-zPVVi=@6jWhS$!+h%MWLd8@ zl97{x8yEvTwi;xq?7iU3Af0Og&|CT(@5j|-=d-2Brn0psn+Lf(5!a7b=c80sV`v&0 znwSirFfRc9ZXl@^6dF3;<>}hRX8^Zp6Wd`(F*%TqzPzviZyHzvU^b`?KnItQ#T|g7 zqX8GJvm&98jKa)h|h2D1i#+zo?l-bZvTyDsksxo|3jM$y+98^CelJZC&T?! zV&KWB{sJtL0}!I0or#H<{Etlg*|5dUgRZ9wCzHUbmcPr&zFLh$6RC4st@HvqN&^tp zLLc`Sfb=q+NM*$zH%I8x&;yv|1?NQ885Naq$Zoo49;&FA7}yV==iShBmxR9v%$>sG z;^K7=ikUod$H%|@HY4&G=2q!>pOko9HzQ>MAwrkM>uA~^4oEDBD!?k6N-p#YghrB9 zP*@@lPj&%rl6CRb-R|}_UvIXyv44mr;6~oP;}-x_;Dg%Bf2yUuK*+nkVP0Og(eupc9Y?FrH6rHfuZ5Y{1V@jOg5>gK{>~2e!Aelz*yH^GdDMfg?Ed2Uaa6y z(P{IC72{*>PeSf`J*_~ZSF3FOpVHk;VJd5OGBC)MoM;Wg(f7L91i}RQeml;*4_Gr) zCcl0uHCt%{nJ-f=fCg;Sf%Wx_KLp&D7u!9)O48EOoOSH)s7#sD=p-aP4S?;$IGrQ( zwFxx(!2JCD&BFtgfIz0l!>M`4gf9diKVkHMr1M)@Np|`3j2OxgF4PvZ6p8!4xT-(+ zoEA3qV`n#kB_&5|aTHS2sYsnhu}gs8yQ!?Kocw0X&c>G9{c@P$o$YzqmQ>Hc543!7 z7Qd^_^~>FnATvPheSE&fQ!00RxdY)6b#rUQmbcT53Uvk05(B5(90MEMg_W1LZ4o$m zcbna=XoXw~6QJ-!4#twgqoNi9j(nloc?qL)>K>J`b0s3N=~!7=tEO^K#m*~6s7_YaG2cw9UlHDmd67$!94-er96xEbs{~YDsYa*zMrU;z#eTs zsmJTZl=g|9DFhVz_r%=+~ak=Qnv)i&Wi|q9wm&$l-G{m zJ&H}zOgcPV;;8)Q^$a5mfJH!S@z~9kLVhxoPYbBaAJSYE8GNSDr?tCYRpYI$BUw1`U3*zr zoZdy`yMgH`l&~+4kISKPxYVTzxU(hDC@Mff7Z(>}56Zp1zUHetnrIRO?tsRhy~7w? zlp#^Vo|h%SrrREyo|aO^q)+dx_1@X7TRd?}hi5jy;HkLZABoXs z=ZvBpMyzH`IJ2JilB@9_K3$b9&REsu2u zjZBz2(`>CR$NxWP7hkS*ZhhTzKj*qDROMBXrgay8*s#mKtr0h%{b7tT)if30gUu=W zK5e4_{-E5SJ&jCde}23*IGy~M)O&@(eZL;?9joak0?@;H4M67xo0m4TR%C(O7~gl} zhD+%`{6oqlBss&t|3jZY&rd<{)`_1n{!TQ(LoF=&oqz&G5KiThmJ|87o`ww_xOvNY zIRJbrOTb!Yo){amKs+7R+)b$f$_=^IbW|dCcEw6q4y}sd&-)VtW zK>HCpgoe%0nM1*^s_AQKvAMU*m3&qMCH?F?CtG2 zY%pGi5ZJWt{=XMrYl3+s?n^w({FnWK))D3D;s_~0c}BvA+H+gKnpjXU=>p16PKiHp zn+OvkY%jG*0WcODuKddCcniH@`bvst+e*@+nE&05gu|xSaG^Uho9Qkv`eyi}#K8~o ztZ!aHTM%B!8boT7Z$4MR9)c1Ba%`1T%igrV?#SSgF_}^ebtPB_rRfvJ3=<@D*QRl3 z`IMEzW{W-|M9JZKsSgw);Us)}ZfULP4t+@Wog#|~dU=aE`%Q}3E-KY!fppVCVO6A7I4T<3O3+(9Z=86RUJun-&=;Ul~&3now$n zhR;GMi#dG=ZfDC`fjy)gXb9+!X}?#+Y>a{0n$y(}7S+b|636q+)9TnA*8jnBhp_5p z@ft14rM2706G-}#wTuL_JZ}ao*fl7k^6Ohcv-o$ z1V^6Pb-LpQC*aZFQ1BkcPPavd9bO4nDah)4iJq+%9W8 zVEqQ|Ra3^sOPL58JhZ_qm9Fg&fV4;nAX6R(wQ**Ii5Ov`>nlIQ{^0N9;CGer-5SHX zCm5!x&i5Iv0XyXt?(+M}yT<9w_v2|XXuoj{`b12a?;Q?M#4EF`t~lz9;(F%o^51H| zx9*IJ*l-D9rQQ*C%NCpZ=@za9lpMhue zKcHcj3-8v4*Lnr_8;6hvkRtS1g^Nb)reg%V(?T0bJEtLvk!^~`))d4RcIEIh zP5%+dra-~&zV8!FS^YP8g; v-r|rTWYc;>6Qs?uX*U4G3g~wFXJ3V&LPigfvQ*&q0FaD?f_Sy4LBRh3=jh}z diff --git a/src/turnNavigation/end_turn_navigation.png b/src/turnNavigation/end_turn_navigation.png index 2c81bcc39bf0d1b5e1389ec65982ec22b7b1d62f..5098fda1b41c7849392029f715be4805c41c3e39 100644 GIT binary patch delta 9581 zcmV-zC6e0TkOA{be~C~|M-2)Z3IG5A4M|8uQUCw|7ytkO7zhRc007{3J@^0s9}Id_ zSaechcOYRmc(WYXh}pp`f4&10 zsWxgoO^m2!k!9`$keSCMK(qhnzmNGZ{wpe>!=Fjt+=RNQDpXcZ2I-Td!4;O0t^TPP~h5osaub&%yp8vX0 zaPJ0oeJ<2L7YhD!=lFgfpF8JP%a2p|d`{DMpU3;p=vxfM=agNEe2?Cik{dr)Z)0KI zmIivJZ~9ysfA2cK{%*eB>KT*Y!3BH2*EhIH0ho8dz{nIB6%x^FJk_LHyo)5o7FMmJY=gqG#xb*ko zzA^n_L?wRT*#9)5klgxd()F)@=d60pezWT_Gv)l5f7I7ZoVlSqYbXis$1-1qe~F*V z{c3zw%4L#c%T7D^nyxudh>weIx$cf}`~EQ9WQ@^oUwHI>5_LUSiAD31P!oE6x#J7r zU!fBENvZ^%_2-z+SlqpDyZ4*a-?Gc`R`0l&a_B#PnSb-9fBHH{wd9=n)Qo!p_9{b$ zp~&ewe{Ulq?tB(C-39*o`Z*y#fenN(-DR#!u-ox2F_QZ$x55o{;C+e5SKO|w_jz3? za__`oTp$ECJ2D|VTf8sMv5=Jjb!RJOnrIuED4K>zO zb1k*jR(ta;fX1m&j;*%Vdgq>Q)ZT96? zSk&>#tE{@(>f3EnX~&(+&b#co+wO;4JK@BWPCn(-(@y`6+9#^Nef=Mz<~~vLH&S|E zfBB9Y&zABY&CM4sqL>je9~}`diU0}i6*F61j9!sb%xv>iMe+L7Ez$P85qnjrHMN22<9|&#=gM2W zsomcn#_D0SQfD%_k`9-fM{n=2K-&JKe-%zGVV2a}sX4?0PW4HE1M6Q*i?hecu;Y%^ zh7l|SO<XAC#W9B_pEHk8D=K>*Fc-N?{RUE~*SGF~-%?K+i zz0)F0*0#c8x!NqVjysRub-|iEv*5>ewpnSMefBJ5VBU;rdEN&RFqAME$mTajf8{H0 za&Kg9w@`Kt&~|5Dk)RDzn)0x@nvc&+ZFZ z;kelV_J@h5R@X_do-*-|2gtUQkfzjEs(dnAEvfTBd1eL6;4Vd%xASm~yJ}tB|At#m z_j=qx)VIbej95V|b=(E!cOse`e;k)GPiYO#WJzj@FpQamo#f*__D>UBhY7YnP0)AJ zZA_C!x2vnvm+yZ0ky7*23)-)^;`_=ye&#o-Pc_(?-Bj>8oOYO+V@&0kUA^l!^|-NS zQP(0p+X-Wls;Af&=#W@a1$wO%zT+GdX|pZ!Hyg+TuXNq z)?7PxFo3BC|9O9k=G`wcLH#t(+WoWmF5K5BphRV)KE^oqzBY+-J}eDOdX{DF$N5~y zGw^XU^ydWaa}BCsFJDMW0>jr#E~zxU46e=V|N=Ng;|9c}4mDT%`NgoqVOjuNW37#O$cg9J$6)Z*>!;*#fWLzCXG0;)Y}gM!O4jvb6!e-SW+#0A2I+(g8^s3CGb}UWJaL>6pg<~em!i3}ynz0B9Ki#L3EHO# z?STYI$=Fz}Hdp{_U^|io9D~uiZ)aqN^to>9By$Hc$k{BJe_kb;5hoiu*Qye2ZWQJQ zMz~+p_zQ?v)?&RN;IPI7!oG)jb9zKyBnVpGO?kACfK_je&kz!xVw-L*bnLLEt!pBT*!NOwHa&Ke&9Vl=I+P9r7IFDd1j^#)ZVF3m=g*RXq zm;uUy5sVg5e+j(eqn*(Kp~raGGa(30ULeLPNSs;UTmi==F@U}p1=gIPMnft1VOQKO zA^0kIGa33UW-J(V$K{iQ)Tff}=H1^sVpN*U@!!71=!e82*H?;gKu~2)z60kYO%DJv zLzN0Bo>%LV+!AGEU_;e4TuvqY!#Rc-e8PZIM!7pbe@0lqv{)T=aWO6tCBPLbExmD{ zxwg&J)b88`)Lh2Ll8=&PkEp%?@0I1^bVWSP0B^M|8&?U&aqZwl%PN^ulFpBGyDYztp48ohGPC%g;lX64A zK)R;7e~?O<%+Iy0z{gLoBuyEb<2)Uq**pYH6oY{eGK2FoCrU#y%L#lPC8ddRmsbQ< zHFqah7oaee(d5|xP^?qLl{JKojNtZ{(c}-F?kk<%xhId75SMrq@BACy*$q!k%7ZxEWRDUsB72f6#gO#iP`8)` zu)gL5A3LOWW-#@xh3$1j`v@Fx`PLZB<+4h{AlHr<-NysEBxuV7X2}_aP{C^^2~Ytf zOKJ<-V?FvqRoeCe>>2_*-O}gLeEskqe;wH4GSYEFyHknCa(il-TT8c3)QSR2?M8(b zRCt6Q4C;co-i6-2BL`RzR6DgxcK6L zX}#=^kBCpNHW^xtD1%tJpt2>Oh8JE*_BSRQFcDs^#854k_w2QI-((E(3*=07e#f3vFNRvS|xEfAGj=bEI0DUr^SUXAF9($Y4?|qFb4#d3!tK2R0`e(fc zj10^XBg7w~FsBf24we{+0jf-x7qX|S7jAXy;^bN`J4NI~%?`3brJN41e{EqtE7A&p zp9K|93iE|sf^>iwG8y>KC>muV%J{@3Lk#hdBNYm=&5%~09nRAo&)cGxsN$_!ovtz{ z%e~SSEOwTGMT9M3aa`N((giE+W+WwGgqUR@0I9dEPZCqzna?-gf!Kxz)p$S$O0NJt zu{Ht3(i$Cv7Azp6c;=%3e`z`}4E2o}B5(u{=ZL1lotLBxZ$*|K$0$j6%pJJtNcxD6EOqTQ zqZ$m@)<&6y0s0kf1cbIOmLekWqxt$lk3{0&kO1Tov4ttBV{2jVf4`pf)N>~D@_qky zXVe0!18ndUPE5U6!tEjbf+WvCx0G3$nc4jeg}*%}giv*c8b+9aDSR5;K1h&KcYw*V z{7BLy(1SQ}5PnXXMIqvs>HM;sEH=|QZ%xrqx0x}1X=Wf7F({IqH?D*fICiqq+Hfe| zD%VXuT{}DAh{8HGf2}Ua_foy!^iPUI-+}6)3g~v7>-6K-QRuLtRiRtFh$QWsWD>2djA0o`q>q#)zfz@sTpQK3$Z? zbkCVES82*#|N4s2OX@n6J2Fc$^|unY2}Pw1VGwLtkZ=q-e+uI;+j~M64qczUAjg|7 z&KO<^Hi2&RJMV^ zaEH(egbO4na0^)!F0i(g??R~G!$P2j)!4V@9|ZcpdlU=R7z_rVKw(D^t`v(T>Za)e0D!<14H#i_)1G^nxL9vJFP9IcKv4=3OfV4;9XQC|;5 zj-6>*+ldrkGE#sNx+`v0xb1CfsHe#vUv&;)yqL+m>hfE?925hjoZBM2AjEXnZXhtv z?I0zIel(=_+rlk_8J64SL~y|-^fnHfAt7J`&P@0{M}^JH}V?KP48Xp zf`7mIAtJP&`XL=?DjJGi$oxspAYQWv$+3+BLG#s~+vUsk@0jDLuM-;cBj-f|B-p#u z00~C?c?bJli0h&+kY|X8I`>gTg)uxh1^{20Nm=EkJGOek`@HTTfWu@+=e2GbFVxjjiy$WYlab$Sf7C2ay%AHPya zgKEO=wH)Chyosp&HJGNv#ElpESK@xnR>2Py>2GU{qU2V``Q?b7ZpVPtHEMkJ!VO}c z(#7e3s+bcip5H8zU2TznA+Sa;Fc}qa(b8u)fAVYtQxT4Z_V4S(eEm?O@CkQ<&xGso ze!0kwlgKFX@w*aNui*7|e4oqSsqM=szmPQ}8ftcj*AKMiXEO$oFOU-;hphl0Ln`J) zAutqm>$}(12FaZ|Sy9rsS%`3xWws;6=&uXg9J4!ZxNb4XS|4w+Au@XIN%vcT-7TfkZ=x+Go&g}aZ3g%Tj7gv3ag=8e*>>h zHrz*(g73g9Mo4w#{!zeu9<@)}V+S+i4M0+>$MlE@8eE$c(H24hIaZ#OLDQD>9cD(T z1#!)Fc^D1NoO#dlnKyGoAF=HDWk%B;_#HZSO@f;lq;%q@Uh-Wv-l*uRCP>e?jo!!reTJ#2 zqo9S0E@a<~6JLxEtg(eQYrxC# zne^I-?P)Em>+6#4B};eOu%JZ3n~W6m*S?4sS5jA2ogYcS@cX9F#9&W#e>%Nx{pbi< z_iD}I1;*V$Bsw+F=D{z_R)Xqmj+ss7py36-uFf>pf34#nssddLR=Y#|i;v^6*E31JW zZhNbJl)>yDWguA5o#&$Ze-|Pu-d#+RE4(av-D>60NN>p)okZrOqCweHwl+St-|7x; zB(_mk0k}VESYoyzLtqRXVtt@?z}a)%Fq-;10ESR$Qxu)jYEh*9u?6Nol@-}@#XPX7 zz%kV4HLr7j<*Vc`W(g;i56}x#9MxxB3ps|n%@fz{ca5>y=IWA%f10<$GVYp{(z|AB z$qzNgMK@Kzhn(wKnxHIM4H>D1Kt}>B=BBn!mY&1AfOjC=J;TJswVh|?M;c@}(P>)_ zv)$A#Kp?Aim%dwfgr1w&mcaA7 zQpSinqFmcXJHO^i%br5oYVUU4i==a@4o39Z6O~3N&?$gZe=&{`Zo!B`rP|XgQn188 z0^ur`&fF(zMec|oO;NU-1T>jmHo4W_;DyKS4!@obUZdGgL7d~dsYGuHr^ZuMK)Kid zklBC#C@J9(P}r*oQ+kqjz#_1Q+b+1OGYVgh;O6h^_1WR>X08-?mfzqi;ifPved}l6 zEuR|ee)_t!fBExHRdd(quog?|rz=zd-bL}Ht;MaT?Cp%-rf+$zRP^Zw&QYY2ZwvNmqkvcvUPTKkpod6ek9` zkdwD?f6v?0=z3KRu6J{1GUm_;2-XAsve)Yncl9Udl~}Gq!a>F=S^Vq*|0@d)kPd&G z>}V+lpF4pu(zVEtpFbILwN4PywXS~8TWAA2o<(L87NFgb5D{P*X!Vh|PChKaOeZ_i z&8dH|AAz9Ry(AHmH&if@5*}Od7)r*2N9|KVfBt#eD{t~2Yfs8--m?;zn!KL`KI@TU zx}6?vZ>pDqo~5V|@o_glGuef9K!-<`3H3sVStu69kj(03-dH=+7Z5)%3`wdd%50i9c<8HFFPfq~FK&|Ou2_G6dBjD^99}-+U;g1LP zFx}(B1qs(x(DMkjh?J)eN_=MdxME(qf7g%6kP+Hdhs7HHHl@|#tn%@9b49~xX})%> zmzVmerE-Dovn$SO)K4ek_HNhRGT5>&+8V_M>4*UtuzYyC86xHyKN~Y)MYS-L;wkf!eL)r2Klba*JA2l-XP8)wyAv=m3tMNkQmo6T;GC14f7gbZ zLjV*QIh8POk3hxL z85ga!{aGsUUD(sgD$W&L!!W51e>~Oz?;T4~YeyQK#YXDs$~AkheMoJ9Yn$^nW{Hd% zMu;7uMMo0iH~6F*vwJDktTT_%g|(t7ZaRQ8s}sNd1-23L(pf)=BGf#D=Kleh&;v>^ zIuQ3{cexpIe+B}Tl2}D& zO=KFbCK~qy5A}xmh-yQ!lsd!)IbbpXV_3v~uI=_)>;wft@!F0oUxS~LNwDKo+_VXI z?j~HhR;bGgm0;$=uW#qnrs3jMj<*r4#X=F3mK`!S1On6Qr;VGEPE>4*Q$ZT)PNa{S zW#7B#Aerv+*O|HENyYL6f0zsEQ4p0D9Db{}>w{bjz>+U^j54|`w^aE&v&s=gmO z{fCW?-yXFI2Gf8%;0`u@8{`%)tfT!7bGre=txAnsy^F7iu}> z-iFw$MeUlGrPGsO&yiI221pzfbkzX_EJ>JZ&w2{^?u$q=5HF_9o0yEGGZ$~5xj|K4*;<-Kk?RGHV`} z)|_%@u~XA8Ah(jIf0Ua%{fFdX&3-*w^WDB@u&}4Ltm7B}_^>Km1&$(u)t^PwG0gP6 z2LaQPQW@p{*@FNQG8z7ryqij@^F!sM=;T0sZ3K8o2QVbdHfbB*DG&n^9%!m$sso3K zNlGvQsp+H?aB8CgVC8mwp4k#9_3>)|+)bEyHRNS-;A3Mhf7gH7x$x@aP3Ls{xTzEY z9{dO?VzvzTj1h%0MQPYd;3vqTP0Ss#aEhxTD!7@9IO&NWE8)a!Y7CSw2&n@++LZ1( z<)20@+Gk_sy9)syACYI{ew}IrKxK5ujh-PrrQIlg@xR> z_>DQV+MtA%BZ{b+YhfZPvdizw(Fm80`og+s`(%!V=Fu0oevuIl?q?0rwYkid#$mk-9g;6`SV!-@^7jx86iWJtw&nyca8%$%RO0f z?I-s#ngg?KRzvs5>2*0>N}y|dUVU0flKbU9;O#f=f{eyyv@Dnl@?{`^Vr@Q4&8#^) z_l-YpfB2$wp0}$g%Xe2O{5oIr;~8UggS~$daK2S9qF1MCgZd5!t@8wH)6qIiP04qQ z0Cvs>@37Nn%ZcnNI%3wB&Jw)SA=qHj>;9x2V>J%*VzpiYJJ9)|x_P`RwHrv&eMHmu zt~#oaq3I4y11JNf&jp+E($By4&MDh8XVMw=e>Ag>;5KcO#1b;*Sj31U2eP*^jW8D-RnP*Z2&jiJu4DAKeT69Ramlu8%OnF;QQa{l zhSA*%rCMgWwu~*a*8)1#Q5mSo4v`*flK!#;s9HxL*d7Mr zf1M=b&d11){p6x{8_6BS(d}jvh`-p@{MOJ-&-@}A1nxy`cx{;AAa;XVCWQrhK+_T^ z`E&kw6$8qut;hYYvDKmEf7!VKX{py^)w$nTQS4E~-vBX_8vWMi;|G0C(38%?ZT%&c z&frCL7hmq}@_^A$xK@XBn629183!Oaf2ng;An-kCRk99RwKd!4{7ful%HH=tuyRlA zWZp*M`ab!pxH|2Lmd_swz>n^H{Yk-Bcd+nzenl9A={h3cOo7z=_M_^r7CO1Lv700Z zhU6X*int;D%?UYv?$LF`FDw9|5wM2Sxi^GqUHa*u(30L5I-S$NeAX{4EC`V(e^*T= zXT8oFR0WIFnoKzAuOpx%&@bPqFi8DCX8v`Q>g}0=BKtazPm=-`aPRL#UZY}apO(Np zzi+j->OOxaK*7GlI@^EpOM4F>{nSnk3A|7w^WDx}iDU2^`fH}3?XdFHk^b%}P$)Wc z=(hGqcmU|G@e-RLor_mpou$mMrawf}vybPhxwO7DGX-d1iYR@{W zbf?tZ(t%C}od6|mLgCU#McJaDu9bZ!s?{(>n7u94+c0%;IPCJkG;0g9b>=X2^h29P zRV*SH_$Fz*-*p`|PVXCnT%Fmm;eLr&u(PWJHDh_aZ|m!;G;7{*5WJ@je}3v{J+k3- zhGln_Rtq}7uwPwnnFIz%?FS8BhYY|5{P;3|>RY!+(ZkL7-clEt)$-e}LGDByZ_D?v z&q7yTVQ;Y0&5hW;4{@M%fc>S8gz$E2>s`LH-oJa&sR;LVENJ|o!oClnXoGH1@8*92 zJbKcCrLn!90004mX+uL$lSx4se_N$Rst$G#amY}eELatB)G8FALZ}s5buhW~3z{?} zDK3tJYr(;f#j1mgv#t)Vf*|+-;^yY0=prTlFDbN$@!+^0@9sVB-U0qbg{fxOIG}2l zkxnLrY;IKuz9Ni1gb+tuVx~SPiYa)GuY36TdKcqa-sk=ty-MC>fKMQve`UI15pNJr zZ(2I%ec}i!Neb~f@t8puB!1+&?D8AuqQick88I^HdEyAMQ0!p2gIUQ?iKmF8imFk* zKkKr>d5g1Jsj=2Q`3u8&ZDpD3G>4JIB9S6bU&Z2&W$ zq}SV8^a$wR1}?7Kn!E>G?f`>Nx@1U>6rkxZ6oB_L`lcK(a0~RTxxKaaaryvcsH@Zs zaBv8W7Abq(hA}(P;$Z`Ghc21000JJOGiWi{{a60liork2@DPhG8kWd zCp?o2LnnU(Gf6~2R7l62mOpG0XBftRpPlnv(vQyfV zKIw+z}sT3kYTU#5tu45R6(lkve zrPSrimpOLq7$U;$+qVHeYhe8Zgj56kH}=0c@IxwqEUW-{+w7W z#$T^qq3JqSF2`3VPm)<(rT6@KzCLw|YPEU-cm!N%;9YG4!hHNL0FymEJr@@rJt}_t zXBvM2Dj}V30t$C`moIf4Q1rMi_3R2~1eV&`s8*|8z$Eb90lW@?PGAm@18WiZ{Fm=9 z;=W4bruSEFdYbsJ1C&xJ+;p0fX)<`_3P224ID`=gItc^<3OE7GHzA4k_xBTv#mMDy z3=9mQX&NtIzU1lCr@VOag2vh8p|c4fGBJNK0o~o*XqpDl)g+1paC~%hlx#LjFc<`& zudk2$_wRe^<4pqVvMh^yJ`aXr(B0k5rAwDuNu2|tx~}`ihQnci2r$#kTCeIhH#cEu zXo#t)DMW-jckXxxCK{xHi&CcV;J0tz`u|v##mvkMB0?gO zAfL}utJN488S$(*40xC@GBPrPWm$gInM{T!Po7YzRN&UFTim>P6A>Ys&HBu>T8)m5 z4jQ&Bv;dC=gF#%^MMNkTi!3iMv%G)2{853XX#|5oM1*(m-cc@>+1uO0wr#I`BS#S^ zrC3{ALqw=nt5mC1wzszt5!Tk$_ARn3%a1}tn3|fRx3~9`ExLaFx(_HKB$G*O+vdZE z5BmxwzP^r#u)V#_%E}5m zJ3DM`ZBZ_l5fQKBTVFVh3;Hm7muZ^h^La#srKKfY*Tr!h(&;p{T8;JfbzIk_Ua#}; z;X}{j!!BH-ap@mSXk=(;h>eX6pTJw$Y?e}~#G5y7ux*<{p@41MIF3=n>guYO_=DH) zj{u>@6XTlqY?+*##4rp*gtKSQVi*QWDV0nn|1l{=gt@snOw&Zyb=BF~=~;fwd$#-y Xub2svj#b8}00000NkvXXu0mjfL9$}8 literal 18527 zcmV()K;OTKP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+NHf|mfScJt@$6TcuOFNc{!MPPVbMorF#I+C;bi-~Z=v|L6bwAD^4QTui0rmh;8`VvFtW{H0#!f89R%E80i< zUuf_5{I6ekU*EX-QqWJHf7bkdee?C3pTFO)&-ZmYUr#??sO|R~hO!Wzy9{Bf&0fdep7?I->-+?q?f-w+t=Oi z-|*?r;x?K7xS|rj-uV9Iidu}n-gN!`?|D{zo_+4F$ILC~_ohB~;+=`|Swl)-zn1w^ z_%HGIVt*QcD&{iLv31RB@MrqwZ$$j~=$G&Qaemuhrk`A6y!T!BeBTqP>uVKRw0i~# zJ?f8t?h;y92>%WfRSA6cejfK;i?{b}_I}e>-g$X`^!B`%=U4vgANMyu^q>Abk8H_% z_u7m<0={L2T!tj4kNg-i@Xvdw$qxAQ=U0V%1sf1yvSY5?V86zBiIM!bZUqx`;O7#b zkC1&?=lAtOk@rqqj1P$5%048Y{Z;O}c+Wvr1l0Xi?-1{S1bj;O;v(;ep&=WLfVX!1 zPVx4$ce>Bl@sda)g&Yd9X`v&m7!&$aVnv5~3MrLyXwboX9yIa5;r-nJU+FI+K_w2lK&#v?Hov)00gb_y?d6ZE{8-1ca zGtM;gEVIrw`?^>qhiga_4 zNwQh~>OSAmg}D8l9{(k~Z^`{na&tNUN4ed9D>*08{r{Al$<6KbLvDYN+EUn_Cb46M zI@2p)eH&kQXJoRTM^Pk|@T^w!4}aHZuj?7*X^4%N-6_x220u~r+@TD)dTJZnbM%}@=C^MBAi@}{jAx{>m*1JU9nT7PZVz`lM&R}Pl=$14 zV}-uM>SI2;USVQ%;+nh~R}}ZNqg@YIY`1pZ&lsDZPRlNMhPcYJ zVh{RPLt*&sln6?Z5LcGYU=AG)L3?Jt$?Me?U3s{NRl~IVMWhdxx*t2hEuZX1SWjQ2 zU#Z}Bd(H!C=GwSPekRA=M_C!?Uvij}3r|QojmNi%RyBQ+08zaswWr=(#oRUQFc*5a z?kA2BxpLq3JxX??@)o@=pJJ~$rFo$llR#1Y8Y^>PV@fYpF8i{Z&x4b@>N7cQ&RT*U zW4JupGdz+A=<_6ih0Kj@&VKGON}W&PuVLoZQy#uAPM%|psL7G(^u5isU3z$lu#0Xh z;BS%UoK-=I3-q&eB!0DZkHl3I$b1gHa8VpOih!X$A@G*XJ)vy`);N?_b}pB%+jEz@ zEKpzQSHCNo@ysI2e$c&Y%9}3)mNBM{>MgD)W1COLwlns$Mw@%*^y~+lY5M^wEOg&A z1#wG5>lhL#-#q8V$2BUE7B$^%J=1DmKExFt!-L<4fVCSmh;IBSkV{v|a z-ysR0O`qHnb^vbHiBNC>qv84z+E@I;kw3LQ=;k!_92Xalb4U+{icB~iEC-|ze zji@7sId56eT8kUx6vM_X6pZ7-XOEHd1n(4XoVyHoi(c`@C>iPphUA2O@A1K%w{dT% z!%8@Xf#(Ubkm6C##}N}6ZXXxF0SNnigqea_I+?s#bY*Wz&V9_8vwN=}GL z_vB8(Xv@V-(BS&I-4GfwWwhul+JXv6f6K;WnkL~E@?K!J^>8PH13}X`u~N}&^MUCu z*b_GJ;Atgjydgd=W@*{L?{g{{AA}o6)Xzczc-1iz?^!oqbz-z0SDEeC(cxA2!R^sE z%mt;}vu=5;jGis?;`r>TZ}2)CEY^slxl45jnsdZkbN5%lZF4+?Dg0iF%irtqrQwq1 z)c~URTsX~|7I)4+B7~993|DNI&dAF=Zw_KMF1tq4;&>^da7LKIgL)Dhurq`>A5>$> zy>Mfd6RD3J3Q+_t<~JXLVB_ww2Xmn~Bs^T1+z)PeX3#{*8;?_-f}qV!b(}Vi`-yX) z**LIyulrJnMb*dc0eKz}upzieIsggoNa)FOm4sFNNWsq$*?l062kdYIBDnP}2TY{G z`xe>s(=*6`YXklczy?mU-2ehY_8p`qD5>Hro>|v^4Ug%%`vhKjmG(L;t{z`E=338? z#PD8~dyu@-u0G)vpMmqWXfn*rUCrI{3|SGSDCFUu zc)87s!$I13Q6iEfyp#uX@G=5f61EfYl+ADC?epdo@YC%AD56B65|FvSQt(@Tb8lXL z>niR!LIZ4|gA!X67F zr;T5HAs;{$$JLKNGRQaIfYZ_eeS!d7jKnx$EkL%^pN119fC)};-f$!-r_^}56EDAG z)%_z@5rx|yLNCX;@GMUN&LGAmDCS+)J?dTvHF!fnw_RD$wSd{TrEe54?K3F30%TL@ z=ro8Ndj#kDTCsVLnSw22!=uM~$1H}o5>Y7O6F#Vq(DhV;fydtw{&pQbVu^U3 z>X6`k1my5jPbRK|{pUcd0r;zmNP0XMu?u&=IRo7EZ=3|z0?Hxgf$>+l(d@tl41z01 z>xCH7wek8rftQj7Awbb6ULJf*9B#Z0t}uYW_HqmMw(!F^i;_D~KX$>2j=P&%b2A9@Wy`JveDqu5ZGy5xfRb-WNkJIDzds@;%g^I(Yo0bXIny<8SW#K=lo z*e4(X;Vt~3<0cX2G_P|EW7ZB3=x;d9Ex)Uc72C&}|t^!$kw%`>G z1&<-r@m##(z7vr)z>;sgR)#!4KGB;Am70*-K}4+=rT`0oro+RezltVlIfWBm9~&c@1fod?{Q+{* z?crY$W>hbto%9#R4YUBp;>2}`1hCZ!0tHJ*PCAN`1w8r9QKlQPL=0(HP)dAr8lX2= zyP*p{oX=ySno!>=4l{P}k5hgHma&wHX;L$eOAcoPg`t)}8~Ht7zvBwwhC`}iJ*dHk z^Wy)f6Bb_`xPqsw;#pZjf*Fs{xu1KlojPCWEfRTptP+}18O5EqHm87C(+TMZMT7ZmtVJgW4f_K_PDl!s$N>G6YN zsQET610q1fH?)0-e_gl- z7m<2hag+;!-W^N?KQ%p0kFX$3@~3H$LOn+;;-kDYfsl}Ez6_1r$_m7`B2aZC zw?yeKY#wk%JSxLi&O_qyKt^b(vNW@bhv6TvrGDGB3k`6lUAb7ouSiX=Rn*8IY2c7J zGVo+jW>BCV{K=_IuaI=)r@EBM(Thq{`#V>pJoFA3K`D7K_$h?-C=s0%Vjf|uila~H z$hz-d)}9utaJxV%P>GVS?j(3hINn1BEBryiBLf$xa!()hG=ldfaIvf;2*h>Y{`o%VC5jGTYy)` zO4J>4`IkHip1ycI0)b$x`8m_?1J!Zvd!oMvcU)G?Z8!H;m5vr;l&kQGKNuC{6E_CD z3gXN47FHYa4-#}gMfgt%@`f|mzXWNYYzW)nv66D!hrq4)-Ea@?HB31*+yvAdPcWCf zt3aX>@(?Eooh2Ne`h?WLZp15bznhRyIa+8!bDdBWQ@T4;rd(*j@N*}H8{6VCa61e&;h4>-$9oMGSmo3ahVKB9TAKqp zLL_BMo@-t5H1Q3&N<)OHU%i%2vP~#l+qm6f@E6;u2ix&R&U2epfRlF&cnhwi2_Vka zQ1KE#8Vzo(Bu_;vW4SN6u-~UoL)0uYe&vsoLO29qB=C zwfY=KTPYA_R)i5jX@#S&lp5!SLBRJ@R$?3o5w{mQCMW`Mmu2Bh72wQ9OK!2ylUlTo z`6L?6f8vX$5D)V4(af zyMPZ3cc?&7tR37Y*-1+hm>KYn{cy0#$N43w0VKaf;7A91Y2f65<29sL*v!+=15- z9EKMLxs=-h8!duj(cu<{5&#DBCjsDg z;4hj45Oi{?bxjKyUPWOn;1{&ke=9qFijKe49NnLaj_u8b0n)B&iPNat1dgH=5gmZ& zaK}lxETt0n-j^GjVAF~x7UKkg%1}#A7DsZ28&+QkS9o3}VhJuB^t|tt@Y^T0Ks$^o zY!_8q6_DmVG>^766lybf<#Hgsuk;@`|upAd^ZW zLnSL-qT|Giiq$=-j|WA9a&`dE?A6tMsS^PQp)`;ZSAg}MFnnzz)#EAW1 zGjN*RhjMhStNo405N=0cXam@dFT>a4Vbv)HSm8xbhLf@m3b*Mk4#03E`A^3Bj><#V z>6EfI$rogAdI&^-hpBKfJ&+xTyQ1P%ZrB{Rc4w7%0u-Dhs)NJBae4ULpv|`y9aaVj(0!|be z0eGOBb%Hl|7eCcWBB*JZ(_O&2ZkZXhuH+0Z5-S8AT=Nuk*qjnV07pKBs37Cd zt{7+lWCDJG_og!yOq?$<`gE(Jk}h<#-@CmHl3WQVi(AhpXG0Jw4o9FK2Tah4WsoIQ zba*QWf~F#YDFPOGecwdHcU(l`tOCbGZ_v1=GxV-1-HaGt`pg|;dQ}A6waTf5pzw(8Z`EC}Yg3FK(TN$&rWMx4K<5qmsYL}zJ46@#S@D7HM? zDoUJVGF`kJxM7sNsrvW`aN)nQh42itlp5@|UA>79!W7qwEzai!{tduIe92JdZrsJr z9GqR0J6-KoR9z}}fLtOblFOx(hZ-`8J$}5g$0Qb&R~G@+H3IN*&K7%u8UrsM8bGil zpjun5s1pV4K^rfjO7)mTtbE~?;Y7d)6%&V2s?V)R(%|3~rBfmoUUhqv3diDVZ>khO zI5h$>KD~-0bxx?q*#K-p@0j_W2x{0T_^JfFJFc`&Cp8gNVAYY8{|)l0keypN28o%~CcXz(M=i3K_r~eK zH9YYQcj&rLP}fPE@p9^0T~nO&#w?Obr66jUc8AF!?>ktt035q1onXBJFi6lIMytXm zhWB<88Jj-osJESHopz%9wiC&6`*$-@_5g#{p5<`sIyodFA-^mJ=)9q{YTwBBg+)~B zOEBM#C(LRj!R6mdpbS-&dUo5|Am)L>;F9muVM|Nhx7Z(mLj4;ctD(+_9*#T~BnZ{d z4T?Bj&p_3c;}v_$D!*Ln!xJ>Yv5a(Tl0@J)JBCSubicD>UfDk+P~2(J!F_Z8Cp)Iv zFlLCkBa>xaS$}bk?mrylr^mxt) zhhAO0=(IeyfEVD6sH;YcTNDp(Lok302~?NjL@YUC0k~C(%fK-6F_Mu%t{4B{aeWzvGm+Y($a7pt|Ea zc>9C9#YOwaQdRu($536+(T@W5`dBK+s*GxuYAIw{sxGIfDbgAqj6oXTJ}nSeRqTHW zw;i47aPH5`xz)WD=6E^x!hi}e1kSBWJ>eQY@~98X+zx1pk|p~8x8 zO674|+|0lgh9OY96|}Od^roc4OnR!qqH+Nt=>f18!Y6Ug`qh>ikU%9xRSW*ciKG88 zUH@3+TF2kEr4gWXKU#ii4~IbX(@9V=ro#D!E%W-2A~NLY3*2(W&a9>E04m4@lvTNn`!wMI&p>mfbuj{NMwwf{TN&7>%CA`_Maae~h*2Ii zr7U8<1OCOULeKF4v%BRY@lHOAtssy(g&a24w$#%VYmF0r=yH!u=?tKsdIomKf^L=g ze$@B==CgbMqW4u?&R?a)Cd9H-#XFTnh!G0ZPi67C;SN!i#ek<)S)2g*on!?-1*MzX z4Y>!js$Rhfa`D6irP#P`VH0(P?>;P`AGHX{NiPEDic* z#s{pvDvoAtUn1ik)q*t=j%H|ZQO<1&`B+R0R}!RFH+AP`l#ql>XWU7_d+Dy{HLV6g zNVh6!J*`!k+gGEM<>s-aE^j_i4w$-nbP=q#oC&zt!d?JS41qs_HCMz1_+Xt$pY{@K z=ed4#n0%F5)n5R~{O&MO>>sr(cR|V=DipUPiP`dSULQ>(m>OsLSvfBTN?Fy41QWP2}kUE*FhmlYqEkP|#uSj4NPLY?NCcTlYf=em_@y{#3tS}VD32Xuqhqrmb6 zTSR#+ry4%~I$H7j4%R)XK9}dz6uF~p+VN=+*jL0RAjuCGbPS1TvzvR-49vZTOUXGb z+3L^x?v`tY>iWYSjRdYOG|ci^3pQRG0sA zS&Ilf!V?PBeW=!eQ^m8U9m13w;33|J+a0RDWb8eu-Q+TTQ51T61Kzagr!S!W(iM<{ zQ(83sNQ-jTCkU$Xj)2)s9W)!mR{)2a(NmY<(pX2&i7=-seQ^atPb%9ib#38@mM=F) z-0*bQ)UYK8>NFW_fdTGM?a&kdmBF+{yi3hkE@lM|ypqNOBax;mrKO_OX)^=E`fc$8 zx1+1D|M2@ooI$l3G`GmshTMYUm9oh}d|MSyaGG8V0|sHo$Eq~`B66WdTRdyN9cZA1 zGv%Xx7^|Ct>DPMerd&)Ge-G9f4=Dc>PEYX}b^jDjRec7m+_yWG)45tu&PSC~uq)_j zV!lA+bkff!38|d<&m<(5f0B@RPC&$05;C1$qmONWAk^O>DEAXWA+!U>_ZA$l?VR!t z-i&AY!J9+-=FQHC^RG$u|M2;bpx-dR`y0@&WWAl%C~vY}r)5pXZ?b+2XI;jYtgqH( zETJ~YJcBElFFh(}t)|9VG&9zd^MXf&-n`n) zZTji(Y;|Fu>8Hc9PZxG~pM=F}#5U=ur|w59cBnRfBAnEZL{&~2HiM$q*s{Uw9`$TA zV;n*Mez0-^Zq~;auelre-aeVsGf9pm+V_<*kM<*N+ zz4I{lRfLNk6)j{yoJ7$CiyGs(2#~oVx5l7w>cFya37v(dyj-%}$U7H-x!E~Fek?o` z<3gwB#CSolitdQknNzIi3i>P83XE|5Wo|j6{b4+C+(NxV|p<&1<81g#_A$KxE z3Qe%%x1&IqWm^&qK=4VU6-8AXiDl6q)qoW(p{U5+uTG?mZ$d5v+)~JSS?kkY_ue2O z%jpTz6qR;vOX=ks=Ahb_QhF7yze;r8nqveX>gkU8*&Cy2)L#?kfBZafLXJBYa|L8q zb?B&6GmVdW^b-&dxgzomO$YBw6BbR5FN)2m{RQh6d>WWYj%p)m$~4}D-IO%ZF->9; zU9-lxC8Q?J6drp{)77xikiPR*BFY~`zAO=?q7LEMT-ayCj&R#gA20wwZG%<`fbUv^ z^+<5%ai%khy6ln>A#W7{r4R*E)Ho=Za{W+zE4>O^q)(%a=CB<0G?a7=36+(Wa@Ry1 z-ZX;Jdx9=prQo|KzT?SiD1WS)L-doBmP+zDtK=hIEp*(g^6;E65nVX(;vzF763ze* zx%fin0ynpz6db-2TIzv$2TnV=y$ZGzr)hGNuo+d(H>f2DmgNi{7^*}*-QbDwJkQ~C zb5#`~6}G%nMIVO2*(aesWfpMDUM&^4geTk@pj2Z@w~Zl0zNQMHlF036Uyl1<8grW3 zR)vR8C(CI@N~#sM?wT4iGRLpc#u0B7FDG8JXK+1ew_dOjG-`FAGg>>mTwP3+!F?Dwx?Kl#=-&GiY6d2Vc^D}***+3w# z6G7O|_dH53Z}72s6s32pL8bnqaag@Xz|^9&bk_XZjnH59?hz~L!lkczdp;^z9gljK zyX5w&H_AKP>6(!CCMVm#^V~8H-l#TS4`0+U``mAJY;e~Rx75&ozov5ea8vF-Jyx=| zDoZR*WtNsl<51_xDJkRrHSW`rx5mrsi8(BEQQ0GWF4ycIu5_J|(ET_gxwB}JTWy3s zWOdREHPypMv7$QF3Lclbguyq#7nskzEEijAB#NNyF>^*5qFoS6fkHJ-6Ja?HRjI^& zF?;k#@gM2Jzm-=67pn_H7L7QPu`@@YlXhGJB_I$r<$@W9np)QfCsv5r_bBrTS6_q7 z`VDT=eI}V$YpP!gDyc@fdbOC<@D1`;>J!+V zG`vtO_4)enxK#7+Al}!9BdwcvG-D>vA^&N{tXfX&ppiaRyyJ$2^7thT+R`<|_9Bne z`k5^EH=zKUZG+`rl&Z_t?6=DVu|3v+`4-R<5N&)a&NrY)fJ%iGmHsYN>Qg^YFlnw$ ziCltaZ?06$vvC1$V{$iYh+P^r1m$WFToZrlOSU=iW_`&v2d;tOrUqp^}gp}@IN zlp8Oc)H9+ep`8`{)>mr>5f5_)3G%(n4`^&7sznd^O!bWI1hG_#fw#V)uvz6ARAO>S zIGlSv0AVBU)U26h&YdTMGw(f3f7LIgMUI!{I;H_w+Y8mdpJy$D$gD znzjBuqY>P%8I41Yf31Rbo3FaK>r(}*;xbkQi&g}yDuQjNsW;$MC5T=SZ`Der_5Yp& z`1CKh8eTu0*&hkt2U)mr{-C|$t1Sxr=9Q;Hhe zhcY!$r(|x)O1?fqPt&^61rO3Ykx&IpPI8Z6)QWNtKwsQDXGBQCQYUufG(|HJBcVT8 zl@bV^)jv0IDNWOXoDDh*!54w4YD(!~UVgYWb&s`GH5iKZmv$k~%RI}PpQ4vozS3kF zW%@Av2)^Amtgp5{Qzn(vu%Ys}+ls~uaDi*dD8v)@sJKXbIdn;#$?|#S5LH!HtJT$V zmwI+gxLprMdq7i7>*AJ%fuMTL5R?FtZV6e1*+vM#Cu)(kL(kU7Q9S)D%_x zS2|IM$d9U-KFmeU`1ony@hFDV?f&3-n&h$jQz6vaE0P>vUa7?^DqE@SASd|n9mL_^ zh5~mOei@&R0;Bi2`M05d$YgDL>xtR{?4zu?o> zJcPgXS4v7>s*tIbP4>sOckJH#WqF4~l-v)d^nXQ^q;_Xi_|3rET>PJM@c$(RpZdvo zyZ@f@{+EpRd}WBHa<9v2fL52GLf4}_^}u+BybQm9Ysgb=>37k{m1Ggbs#Rj+HfNNk;FxOBTm>gwVLZ*IS*#?dy9r%MNo}DavYZ*N0bx>? zY!H>fNRb*iWhgsD7?lHR3g$^J9=r;=gE%T#uN#BvJ~}z#;Ofi)kL@AnY0^W zTBd8+)H}4e)f@iMvbdw>`~ZYPK+R^Dm2Ft+P9qR*jRrzRwbU+&0%wu$08RD+Lf6x~ zDiRw04oWF5b!;Mr0*ft5~l-8eT0v1zLISerrydp)G0a+ zQ6H*5rVDpym7)4}eqaB!Gs2zLh+jJ+J|&HE@)l_YZdic{`4bhA+Nt0b(D176Y-E{& zpf6YM1wSMl z)t-jhBCrxbD**liA0XIpD#rq8^7MqIuHg(+Qk6Cw+k#ZrVsl5TW-CTpyXvi;=e)Fy z>;}AWJ&>BD)jsOYP%*H24gNND>e}8f@Z0td^-LO#P)`o_aRF*k4!#+Pk#=1QI8qBN z0#bjsWfi2~OJ?pr)y#gD%>LLuC@-ciO*GzFwk;}_5dadNbWcrXqETqP#+b#HfMHR) zfkc%q#cU0`o<&1VZ4nxR2X9?XSV5KHZ5e*GPpj~;)J&1m)}#z4R+XU-R_#RJ)D^Bm zur}EN0F#SLQQ%!Sr1Ibf@CklIusXPRWHbf(cB`KPoUc7q*qiu9eRo&9#ms)Do^GWL z<~W;iP83y;JZrHYEu_=_ySA1}Yzbe7^}h*qZ1RGOXk$>cQbSQvkqfcG#x2jHxs3|W zk<$h|X<19it9j#n@ZkgsK&s>8wQte-nBn{VAq zBgS{fc-3WLDafD({Mta{+AD)K_-2dx&TOsY9fe13OQXFw9{EBJlJ2FovdQ54L- z_M+T20m?x}C*%O=Eke_<=BI0koPgtv0Sn5(F0?BXh?k%qDpcCiHAOFR=V3VwkMq|` zNG&43R`{&#hTdc8cq?o``^}WIwvl|)c!8>6Z9A$8IB?CJ_9Uc-?l5h2@$tstKra|& zunEOgwd`)$%CT{#-82rw@ij%!r7Dj0Y~t2AR3|*M)xRN^Jcl;!L;|UbU!W{&lRH^y z%$A^t{BNy|N~Qs!O|O+V*+(bFVX)vI^;0!<@;0CP>GS+7p8hPIYIP*YUn*f^&~FQc zx;rlJ?ZuP9dX&qHCn42CB{bnlwMZ@D$wzq78K8WxB?Pspe0nBTjr;7Ny2J~Kl=|wQG8*GCEgP!N4eKJuNQmT7xdl9r!DBU$w@(Gt zSr7R)!BRWO4}!JRZv?A7zqtSJ&-f$U>{suuwNkvjyPrmiPvfpNQoN13-@E64_m}bv zP6e}lYamRSP4!&QMbND(%LCSSi6sQF2yJ0#r{y{#DX*4mKUYy{{Zi6befHMao<#9g zI>e65bBBD}&M&X6StmPjdRe5brt_zl1nCZ~mMmSp#E=BlT_Mk)^ z?o&H-kq)XE;VVv4w>I)%Q#R_S{K;K8>&$bj}oj(`E>Bhen#HAl=QTj=`XqxZMJLh4` z99&qR#B;M{4soBvbFc-Z>3adGv<}<#X&A&+me{6R4dVLc9uQA#B5i8W0da^VPo*`j z2}1#2nebos&HZV>!u_1E_>Th??~v_y72~W}IMXPqM7d;~^fQp63E5@ogY-3#LMSOj zS(`{veo+`NOqI5Ot|S#XJ`HbYE2%2j|J+K7;R!BW<1NnGe9l=R@M$e@Gr$FY^cJXz z$%g1u*48oWkTr&zK2tE3BKn?!QHn@=v_4ZX)&DjH)75UH`*6vg-IbhyXzKj%-{iOH4;KHG|hP&R@e)FwYD zkyDp0IzL52mCo=Tiw2UyyRC~+8CBbc5j3kgaSO@@7ppFCTM>H)O|RxuT+w{%u$5PW zA#35Tm54XSpzh#g1(taBWSvU!7xn*?nVjlOiVpV31Ec=(xlsRQI~O1{Z!g6?z8Wcx z=L)}cQD~s@*UhH$`Dcgvhyf*3{aS;c%4oE8_jmBqatYC?16z}ya$U=86ouYZ%!LGXFRiv>EKvs4@xu$ldZAjf`EVq@;;UJwKW4U;+3KDPcST1+tkWk2H zEVpU$34U-Ap0}1fOT4fdYjeP#5<`jRct6g!2aYV|8%~Sy+%C$7^js3cZ{>PUMN%<6 zpMs<|a!z|E1;G5++_#;7F|#-6>7d;L_L9<3wWDBMrEA zP_cq}`pnkh?azd@@0ZaQO<3F1gXRcS%f7Ty3z{L|s_c|;R)zBg8V*}&;v2F1uLzl82f_zKv6NQ+oj#Qo1{5k0P6TYig?HyL1g*O6x4fS9^oVY8ivn8~rUsh-H_Ed}0i(&(d zZ~u7m-xG^L%M>`qGqR{+%=KenQ8m9`IN5)qWbU7w%my-E3i26j`cRO!SKy@}XRzro z5ciq7_J3YG@Gd3#?>mXyZ%c{f!1p-&Y7ebBE4@y=OWF5#rB^vw0j%w8^dizO<)imm z>80fifjCK2Dc^(CHeB#ENUibz@?(&icUkR_<9C$$30gAxj#6_@cysjVFNv!ABU3dC zP0znhnEqkF)crnTn#+F$uz$p_T3DK9d1>C6>N`)6;4j|BQy)t^i4>`IP5n1T14>#X zETrD;!6vs;xktt7pQF+c-}9J;^m3-~&VGi&nTnvet&#)`yz2$s*Kh)_LC}Avf5%Z{ z`3qa9&wrbkiYe*IFIL(NdQggXnd%t=dpl)LZ0wzr-#SGt$Hl=}`>V8opd0As8pprG1_j8 zkB0;dq-M8V)CmTr#vZgMJ3L=WGTSMxwyl#SYmXjqQQjn(ma8vy2y8;O3PNYj=&QN< zbgPBKe@=TfaR2nNyzSNM3sO$U+N%+mA&=^vrth{3(;av!2V!Z|hV4AI$o>A@qQ8A?(J4b{lqXnV zaNkS$^+j)6`M0pb^JyOa?%l2BXYcNu{?u_pP2104y}C&WBs@OS?3$ zGuW+C1PGzvUA3f6dv0wv&xrC`i5rU=rpz#ltdz~8J)^qqs#>b579NfAdOp$+Nb6qn z&FZ;)#Quh;#(j&@Vy$y<8WHC>z0A*zrr!llRy{jX?T#8ahj4IZmP^s|a(fnWzWQFrQts6EKYLW=Rtg3HlCct*K zDQlSA*|&F!-v_7q#c5+*zs#nirY(PO+)Dzg+L5kNOzR$T{}_P&%kk&++q0S6zdxMm z_h&QNZWt|^-6$-n%a z{8Njt$jsXpq4iKeiBDgII->CH_4Gy5tjB)Nbj_c7uvS+J1QLwT^y34IN6xnW9e>xIYL;g``1 z)>E#hVy)(^fi=}}rF8n2@oBZ3{^bb=k$=*BS|(e=_R_UdX58E1HT0l4iI6Z>1%B&U z6)qR`%Oe8Y*Q~Gi(H;?KE4?)`uLU@27!=gdFs(_Xk4y7Z8a~rBz}6e+*)DsMq_Y|6w=*zaDL&Roswg-Lja3(1B{EQzZ<|$XPqh#9J17P@}5E+MT1g=Znj@T=VvJ z6wsKR;D&h2{(SFm^s2M~!L-e!4$HD!_SCs%>peLB>cl&t9bGLqTA--ixhgz|sErbd zsNAlqJ{)AZm#rc=)qtI&)vZOI5X$@T1f>e%=TSV6=6&V!C?1t(6@iwvE_ZnlTX^x$ zeHZROF1*ly+2%gc1Nk+j0N&L}Q6b{?C+(@ii9>O<6i-iI(f>i{DqWr3F6E!IllEjJ z+b^6?4~G_6D%axlXry#jf&I&Ts_G$^;qcS*a2}etY@31H>I&*rRG}^el|QQXXKZ!N z40V5e?c-{Hx0B8Nm*sZvPPU+nB}!{9JAUTL^Mw898Jr$67Gz6$24@P|hA6&fV|m&l3S{ifYcj0m<8|xz)QF-r{9Kbb z+a{6)@ZU#pjmQ}z{-pjTHEAn9a#+7cDb-7$YS#5t#X3>WGNNyki`R*AdVG(=nP~32 zX{ZthSC!?wF)rMCPne}`W!1B1+l$}{0&3-gJ1M+~uS>MSCE&OEmI%hJ;WbxM^$5pr zQ&vlOBT9T)gWJ>#^pX~BS9yMr7WZyhe_6}ze`75`t@}*8#`ReZU(35E>T5N8UT8L$ zBfhKQo9&4Twi@2{MA^jaX9D5V41c<~znbAs7x(yXhF2T+eVXBa7ToI@!_An|wwWo^ zGg$#zR4Fw@LGIflwWw!60dkV2YPx!#+NH#{GLb~hTTToJil0?HvQ-A^>bgDGNE0#BB;&Qx!IcS$^G zPH=+v${TBI)iyA%1{oz%>~Wp46q$(_hQ{6Jb82@4!T4Rf^W$=$hOg3{2unScJ3&wF zcg0S&&0~YXbyZngO*QZ*SF+CoH41`XG7&vMLTQ1sCPKdGu{9Ca3H9Nuzf)FBsb8Px zp?W|>wI|!DjzL^}^kl#Ztb1-i#hh`xkC1Ik3;D0|2v#dxg6wXql>#_4^c$T$4e8`F zF3V`xf(!icS3W}V z$gCmse5GbjDRo=*v1W24dO!0#a?ngcO`B%pI~2G`xL8pBbrSamHK@(;%70Ustig)pXCn2M){y4#uwN3 z^PL_}>lB@&jWUk@buW%_W`>mymFqeYr@m>b&v2a z)jXUM?v?`olsw)P_^0G?QsC*=wwCuvpjHpq_H;;lD$J!RXv_USC!dXR6NCPC-TkQ& zxu5Iq&-1yrt(5(w65q`-<&#LXqO3;TqyRCR0_cf@?y<*OXc_(QkBj>oJ(M ze?4wf8qhVR_}uM%VDx!_Q+>C0pKtP#`nJBQ(ix%sJT>pfitq0Y-#V@-K&8wII`p+y z^VhDvSMS{aqIk-93PQU758t_7M)_|Ih5!HoglR)VP)S2WAaHVTW@&6?004NLeUUv# z!$2IxUsH=B6$LwpIAo{}VnI~IQL9jd3ZYhL)xqS_FKE(`q_{W=t_24_7OM^}&bm6d z3WDGVh?|>}qKlOHzogJ2#)IR2yu0_fdj|;hGSjS%aX`~;GnI&one3|A`HB!C=)))= zGs~Ehq$GUD*F6G!y^HZI|8swi9yMn%ARrRYGQ+fqH;AVFVHWr1f#%yep=I6^EI+E{60Rx~x@DdMQA>69;IJXSexan{OJ*1RWwVK}F+ zEOVXa5E59#5+sOFP(=x4*oe`plVTx7`*9!tpzD{&rI4!xMvetkph0&1;D7MDTPr^~ z;U$IRKz1zUWbxTwBfXf|V z;K`6p*_DDcg?t`(KcjET0{yo@_nOyRb04Py{D4^000SaNLh0L04^f{04^f|c%?sf00007 zbV*G`2jvA65IQ87O7`&p000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-} z000FSNkl9lGD0lj&s;Ac(X*4@C-81z~cYRe|RZGSg@QsKX zW6TtZE!C#vo`0R6OXSJ5Yit7|qD3M)0PqhHO^E0z5p_eIQZJRqW?dLN^)$7Kd^8j=6h z7y~lKfQTjlzKp3700M9X;GQw&4ZnH5zlT|GSAKlx>*5-K=K#KC@`bjEG3F~r0KcY) z%N}n7ctJ${%LM4Zhln-+ys!X~0Qd=)1NoCB88>pV?Hd5kh-mwKe-E7pkLWT$b{;&U z^Zh*#(H4Mb0B$9kJNZWdekP(Oro_{PG8+IV0DiFjNXmp7)?{tT{@wv_oRKTYA^t;` zGi=584-TltRCsnX$*LZ}6QNx10jykj9%n2Dbff^fn`2L(DFcj|>bs=?c;o|7UCQ`1oj62KCGcM5l zcSQq|jph=7w?Z@aft#@`NFQ8?M1)h9+o^S93~tQNOL49MI8*@K6#-NjWe2oxbx$&t z#WvH*5i@@JoecEisF!I%r`|jsu=id)W#B z#a0v5*>!GiPLwA}F>I|-bgPM~cJk}1U#R1>;_0eowHbLlV;f9st(zj3F6C*=*mr#o zVC~M$o49uUdONpH!mts5m$3>N+7yP!kIqKxlprs2J$dMWRwbTf%;f)x3=FMm$oy6B zULzXv&&T2zPsG>N#(37XBqSmn7Om?kLiZPC{%KTtdcNFVDbp&0qER(#rRW78U0;DJxQXKv$$!b+{_=~ezG1Jo2 z&QDeXS}#8t$xF7%G}kIon^~s0P0c{tdb*l51JU)Q)rDbIr5D^wECA|Nf7GbssX2NH zpyhQu02Y)0w_^a?77jDS)RN<;^)*dxw+YJRNKH(rIQs-C|c1TxS6%&=)qAg7Z)znWfwv?+}{*6!9uBHaP zjc~QwXKK*993)ww2X^XC06cN*RFZDj)RtE$8C?MI*vfrsYtOsR{E()gsO0}2p}#?t eZYBR00f3K8$Ni3jI4r6F0000 Date: Tue, 14 Dec 2021 10:16:35 +0100 Subject: [PATCH 087/322] somehow end_turn_navigation.png isn't inlined although it is <10kb - force inline of all pngs --- webpack.common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webpack.common.js b/webpack.common.js index 08f94f04..947cdfbc 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -75,7 +75,7 @@ module.exports = { }, { test: /\.png$/i, - type: 'asset', + type: 'asset/inline', }, ], }, From 180db0896a006aae53d8457fd26056cda4188e2c Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 14 Dec 2021 11:58:23 +0100 Subject: [PATCH 088/322] create TurnNavigationStore to better handle sound,fakeGPS and acceptRisk state --- src/App.tsx | 36 ++++++++++++++++----------- src/actions/Actions.ts | 9 +++++++ src/index.tsx | 9 +++++-- src/sidebar/RoutingResult.module.css | 10 +++++++- src/sidebar/RoutingResults.tsx | 30 ++++++++++++++++------ src/stores/LocationStore.ts | 36 ++++++++++----------------- src/stores/Stores.ts | 5 ++++ src/stores/TurnNavigationStore.ts | 31 +++++++++++++++++++++++ src/turnNavigation/TurnNavigation.tsx | 7 +++--- 9 files changed, 121 insertions(+), 52 deletions(-) create mode 100644 src/stores/TurnNavigationStore.ts diff --git a/src/App.tsx b/src/App.tsx index bff94332..7b49abd4 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,7 +8,7 @@ import { getMapOptionsStore, getPathDetailsStore, getQueryStore, - getRouteStore, + getRouteStore, getTurnNavigationStore, getViewportStore, } from '@/stores/Stores' import TurnNavigation from '@/turnNavigation/TurnNavigation' @@ -35,6 +35,9 @@ import {LocationStoreState} from './stores/LocationStore' import VolumeUpIcon from "@/turnNavigation/volume_up.svg"; import VolumeOffIcon from "@/turnNavigation/volume_off.svg"; import PlainButton from "@/PlainButton"; +import Dispatcher from "@/stores/Dispatcher"; +import {TurnNavigationUpdate} from "@/actions/Actions"; +import {TurnNavigationState} from "@/stores/TurnNavigationStore"; export const POPUP_CONTAINER_ID = 'popup-container' export const SIDEBAR_CONTENT_ID = 'sidebar-content' @@ -43,6 +46,7 @@ export default function App() { const [query, setQuery] = useState(getQueryStore().state) const [info, setInfo] = useState(getApiInfoStore().state) const [route, setRoute] = useState(getRouteStore().state) + const [turnNaviState, setTurnNaviState] = useState(getTurnNavigationStore().state) const [location, setLocation] = useState(getLocationStore().state) const [error, setError] = useState(getErrorStore().state) const [mapOptions, setMapOptions] = useState(getMapOptionsStore().state) @@ -55,6 +59,7 @@ export default function App() { const onRouteChanged = () => setRoute(getRouteStore().state) const onErrorChanged = () => setError(getErrorStore().state) const onMapOptionsChanged = () => setMapOptions(getMapOptionsStore().state) + const onTurnNavigationStateChanged = () => setTurnNaviState(getTurnNavigationStore().state) const onLocationChanged = () => setLocation(getLocationStore().state) const onPathDetailsChanged = () => setPathDetails(getPathDetailsStore().state) const onViewportChanged = () => setViewport(getViewportStore().state) @@ -64,6 +69,7 @@ export default function App() { getRouteStore().register(onRouteChanged) getErrorStore().register(onErrorChanged) getMapOptionsStore().register(onMapOptionsChanged) + getTurnNavigationStore().register(onTurnNavigationStateChanged) getLocationStore().register(onLocationChanged) getPathDetailsStore().register(onPathDetailsChanged) getViewportStore().register(onViewportChanged) @@ -74,6 +80,7 @@ export default function App() { getRouteStore().deregister(onRouteChanged) getErrorStore().deregister(onErrorChanged) getMapOptionsStore().deregister(onMapOptionsChanged) + getTurnNavigationStore().deregister(onTurnNavigationStateChanged) getLocationStore().deregister(onLocationChanged) getPathDetailsStore().deregister(onPathDetailsChanged) getViewportStore().deregister(onViewportChanged) @@ -90,7 +97,6 @@ export default function App() { mapLayers.push(createCurrentLocationLayer(location.coordinate)) if (!isSmallScreen) mapLayers.push(createPathDetailsLayer(pathDetails)) // keep sound state even when screen size changes (like rotating) - let sounds = useState(true); return (
{isSmallScreen ? ( @@ -103,7 +109,7 @@ export default function App() { mapOptions={mapOptions} error={error} info={info} - sounds={sounds} + turnNaviState={turnNaviState} /> ) : ( )}
@@ -131,11 +137,10 @@ interface LayoutProps { mapOptions: MapOptionsStoreState error: ErrorStoreState info: ApiInfo - sounds: [boolean, Dispatch] + turnNaviState: TurnNavigationState } -function LargeScreenLayout({query, route, location, viewport, mapLayers, error, mapOptions, info, sounds}: LayoutProps) { - let [sound, setSound] = sounds +function LargeScreenLayout({query, route, location, viewport, mapLayers, error, mapOptions, info, turnNaviState}: LayoutProps) { return ( location.turnNavigation ? <> @@ -149,11 +154,11 @@ function LargeScreenLayout({query, route, location, viewport, mapLayers, error, />
- +
- setSound(!sound)}> - {sound ? : } + Dispatcher.dispatch(new TurnNavigationUpdate({soundEnabled: !turnNaviState.soundEnabled} as TurnNavigationState))}> + {turnNaviState.soundEnabled ? : }
@@ -173,6 +178,7 @@ function LargeScreenLayout({query, route, location, viewport, mapLayers, error, paths={route.routingResult.paths} selectedPath={route.selectedPath} currentRequest={query.currentRequest} + turnNaviState={turnNaviState} />
@@ -201,8 +207,7 @@ function LargeScreenLayout({query, route, location, viewport, mapLayers, error, ) } -function SmallScreenLayout({query, route, location, viewport, mapLayers, error, mapOptions, info, sounds}: LayoutProps) { - let [sound, setSound] = sounds +function SmallScreenLayout({query, route, location, viewport, mapLayers, error, mapOptions, info, turnNaviState}: LayoutProps) { return (location.turnNavigation ? <>
@@ -215,12 +220,12 @@ function SmallScreenLayout({query, route, location, viewport, mapLayers, error, />
- setSound(!sound)}> - {sound ? : } + Dispatcher.dispatch(new TurnNavigationUpdate({soundEnabled: !turnNaviState.soundEnabled} as TurnNavigationState))}> + {turnNaviState.soundEnabled ? : }
- +
: @@ -247,6 +252,7 @@ function SmallScreenLayout({query, route, location, viewport, mapLayers, error, paths={route.routingResult.paths} selectedPath={route.selectedPath} currentRequest={query.currentRequest} + turnNaviState={turnNaviState} />
diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 2ddcbea4..e06023b9 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -5,6 +5,7 @@ import { StyleOption } from '@/stores/MapOptionsStore' import { PathDetailsPoint } from '@/stores/PathDetailsStore' import { ViewportStoreState } from '@/stores/ViewportStore' import { LocationStoreState } from '@/stores/LocationStore' +import {TurnNavigationState} from "@/stores/TurnNavigationStore"; export class InfoReceived implements Action { readonly result: ApiInfo @@ -22,6 +23,14 @@ export class LocationUpdate implements Action { } } +export class TurnNavigationUpdate implements Action { + readonly update: TurnNavigationState + + constructor(update: TurnNavigationState) { + this.update = update + } +} + export class SetPoint implements Action { readonly point: QueryPoint diff --git a/src/index.tsx b/src/index.tsx index 9b216c80..63b3f8d4 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -6,6 +6,7 @@ import App from '@/App' import { getApiInfoStore, getErrorStore, + getTurnNavigationStore, getLocationStore, getMapOptionsStore, getPathDetailsStore, @@ -20,6 +21,7 @@ import ApiInfoStore from '@/stores/ApiInfoStore' import QueryStore from '@/stores/QueryStore' import ErrorStore from '@/stores/ErrorStore' import MapOptionsStore from '@/stores/MapOptionsStore' +import TurnNavigationStore, {TurnNavigationState} from "@/stores/TurnNavigationStore"; import LocationStore from '@/stores/LocationStore' import { SpeechSynthesizer } from './SpeechSynthesizer' import PathDetailsStore from '@/stores/PathDetailsStore' @@ -27,6 +29,7 @@ import ViewportStore from '@/stores/ViewportStore' import NavBar from '@/NavBar' import * as config from 'config' import { getApi, setApi } from '@/api/Api' +import {TurnNavigationUpdate} from "@/actions/Actions"; let url = new URL(window.location.href); let fake = url.searchParams.get('fake') @@ -47,23 +50,25 @@ setStores({ infoStore: new ApiInfoStore(), errorStore: new ErrorStore(), mapOptionsStore: new MapOptionsStore(), + turnNavigationStore: new TurnNavigationStore(), locationStore: new LocationStore(speechSynthesizer), pathDetailsStore: new PathDetailsStore(), viewportStore: new ViewportStore(routeStore, () => smallScreenMediaQuery.matches), }) -getLocationStore().setFake(fake !== null) - // register stores at dispatcher to receive actions Dispatcher.register(getQueryStore()) Dispatcher.register(getRouteStore()) Dispatcher.register(getApiInfoStore()) Dispatcher.register(getErrorStore()) Dispatcher.register(getMapOptionsStore()) +Dispatcher.register(getTurnNavigationStore()) Dispatcher.register(getLocationStore()) Dispatcher.register(getPathDetailsStore()) Dispatcher.register(getViewportStore()) +Dispatcher.dispatch(new TurnNavigationUpdate({fakeGPS: fake !== null, soundEnabled: fake === null} as TurnNavigationState)) + getApi().infoWithDispatch() // get infos about the api as soon as possible // hook up the navbar to the query store and vice versa diff --git a/src/sidebar/RoutingResult.module.css b/src/sidebar/RoutingResult.module.css index 959fd0fe..9c27dca9 100644 --- a/src/sidebar/RoutingResult.module.css +++ b/src/sidebar/RoutingResult.module.css @@ -95,6 +95,14 @@ This is not a very nice duplication but I have to stop now... animation-delay: 0.25s; } +.acceptRiskButton { + float: right; + color: #2a2b31; + padding: 5px; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); + border-radius: 0.3rem; +} + @keyframes pulse { from { opacity: 0.5; @@ -102,4 +110,4 @@ This is not a very nice duplication but I have to stop now... to { opacity: 1; } -} +} \ No newline at end of file diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index bc2ed318..6e28dcd8 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -3,7 +3,7 @@ import { CurrentRequest, RequestState, SubRequest } from '@/stores/QueryStore' import styles from './RoutingResult.module.css' import React, { useEffect, useState } from 'react' import Dispatcher from '@/stores/Dispatcher' -import { SetSelectedPath } from '@/actions/Actions' +import { SetSelectedPath, TurnNavigationUpdate } from '@/actions/Actions' import { metersToText, milliSecondsToText } from '@/Converters' import PlainButton from '@/PlainButton' import Arrow from '@/sidebar/chevron-down-solid.svg' @@ -11,11 +11,13 @@ import Instructions from '@/sidebar/instructions/Instructions' import { useMediaQuery } from 'react-responsive' import { getLocationStore } from '@/stores/Stores' import startNavigation from '@/sidebar/start_turn_navigation.png' +import { TurnNavigationState } from "@/stores/TurnNavigationStore"; export interface RoutingResultsProps { paths: Path[] selectedPath: Path currentRequest: CurrentRequest + turnNaviState: TurnNavigationState } export default function RoutingResults(props: RoutingResultsProps) { @@ -23,7 +25,7 @@ export default function RoutingResults(props: RoutingResultsProps) { return
    {isShortScreen ? createSingletonListContent(props) : createListContent(props)}
} -function RoutingResult({ path, isSelected }: { path: Path; isSelected: boolean }) { +function RoutingResult({ path, isSelected, turnNaviState }: { path: Path; isSelected: boolean, turnNaviState: TurnNavigationState }) { const [isExpanded, setExpanded] = useState(false) const buttonClass = isExpanded ? styles.detailsButtonFlipped : styles.detailsButton const resultSummaryClass = isSelected @@ -31,6 +33,7 @@ function RoutingResult({ path, isSelected }: { path: Path; isSelected: boolean } : styles.resultSummary useEffect(() => setExpanded(isSelected && isExpanded), [isSelected]) + let [showRisk, setShowRisk] = useState(false) return (
@@ -41,7 +44,18 @@ function RoutingResult({ path, isSelected }: { path: Path; isSelected: boolean } {metersToText(path.distance)}
- getLocationStore().init()} src={startNavigation} /> + {!turnNaviState.acceptedRisk && !turnNaviState.fakeGPS + ? (!showRisk + ? setShowRisk(true)} src={startNavigation}/> + :
+
WARNING: This application is highly experimental! Use at your own risk!
+ { + Dispatcher.dispatch(new TurnNavigationUpdate({acceptedRisk: true, soundEnabled: true} as TurnNavigationState)) + return getLocationStore().initReal()} + }>I understand and agree +
) + : turnNaviState.fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal()} src={startNavigation}/> + }
{isSelected && ( setExpanded(!isExpanded)}> @@ -78,19 +92,19 @@ function getLength(paths: Path[], subRequests: SubRequest[]) { return paths.length } -function createSingletonListContent(props: RoutingResultsProps) { - if (props.paths.length > 0) return - if (hasPendingRequests(props.currentRequest.subRequests)) return +function createSingletonListContent({ paths, currentRequest, selectedPath, turnNaviState }: RoutingResultsProps) { + if (paths.length > 0) return + if (hasPendingRequests(currentRequest.subRequests)) return return '' } -function createListContent({ paths, currentRequest, selectedPath }: RoutingResultsProps) { +function createListContent({ paths, currentRequest, selectedPath, turnNaviState }: RoutingResultsProps) { const length = getLength(paths, currentRequest.subRequests) const result = [] for (let i = 0; i < length; i++) { if (i < paths.length) - result.push() + result.push() else result.push() } diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index bfbb47c2..65b0745a 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -1,11 +1,11 @@ -import { Coordinate } from '@/stores/QueryStore' +import {Coordinate} from '@/stores/QueryStore' import Store from '@/stores/Store' -import { ErrorAction, LocationUpdate, SetViewportToPoint } from '@/actions/Actions' -import Dispatcher, { Action } from '@/stores/Dispatcher' +import {ErrorAction, LocationUpdate, SetViewportToPoint, TurnNavigationUpdate} from '@/actions/Actions' +import Dispatcher, {Action} from '@/stores/Dispatcher' import NoSleep from 'nosleep.js' -import { SpeechSynthesizer } from '@/SpeechSynthesizer' -import { ApiImpl } from '@/api/Api' -import { calcOrientation } from '@/turnNavigation/GeoMethods' +import {SpeechSynthesizer} from '@/SpeechSynthesizer' +import {ApiImpl} from '@/api/Api' +import {calcOrientation} from '@/turnNavigation/GeoMethods' import * as config from 'config' export interface LocationStoreState { @@ -22,17 +22,12 @@ export default class LocationStore extends Store { private noSleep: any private readonly speechSynthesizer: SpeechSynthesizer private started: boolean = false - private fakeNavi = false constructor(speechSynthesizer: SpeechSynthesizer) { super() this.speechSynthesizer = speechSynthesizer } - setFake(fake: boolean) { - this.fakeNavi = fake - } - public getSpeechSynthesizer(): SpeechSynthesizer { return this.speechSynthesizer } @@ -40,7 +35,7 @@ export default class LocationStore extends Store { protected getInitialState(): LocationStoreState { return { turnNavigation: false, - coordinate: { lat: 0, lng: 0 }, + coordinate: {lat: 0, lng: 0}, speed: 0, } } @@ -53,16 +48,11 @@ export default class LocationStore extends Store { return state } - public async init() { - if(this.fakeNavi) await this.initFake() - else this.initReal() - } - - private async initFake() { + public async initFake() { console.log("started fake GPS injection") this.started = true - // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car + // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car&layer=MapTiler&fake=true let api = new ApiImpl(config.api, config.keys.graphhopper) let response = await api.route({ points: [ @@ -118,15 +108,15 @@ export default class LocationStore extends Store { private locationUpdate(pos: any) { // TODO NOW: 'this is undefined' if called from watchPosition: if (!this.started) return - let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } - Dispatcher.dispatch(new LocationUpdate({ coordinate: c, turnNavigation: true, speed: pos.coords.speed })) + let c = {lat: pos.coords.latitude, lng: pos.coords.longitude} + Dispatcher.dispatch(new LocationUpdate({coordinate: c, turnNavigation: true, speed: pos.coords.speed})) let bearing: number = pos.coords.heading if (Number.isNaN(bearing)) console.log('skip dispatching SetViewportToPoint because bearing is ' + bearing) else Dispatcher.dispatch(new SetViewportToPoint(c, 17, 50, bearing)) } - private initReal() { + public initReal() { this.started = true if (!this.noSleep) this.noSleep = new NoSleep() this.noSleep.enable() @@ -173,7 +163,7 @@ export default class LocationStore extends Store { Dispatcher.dispatch(new SetViewportToPoint(this.state.coordinate, 15, 0, 0)) // directly writing the state does not work: this.state.turnNavigation = false - Dispatcher.dispatch(new LocationUpdate({ coordinate: { lat: 0, lng: 0 }, turnNavigation: false, speed: 0 })) + Dispatcher.dispatch(new LocationUpdate({coordinate: {lat: 0, lng: 0}, turnNavigation: false, speed: 0})) if (this.noSleep) this.noSleep.disable() } diff --git a/src/stores/Stores.ts b/src/stores/Stores.ts index fa001029..5e003986 100644 --- a/src/stores/Stores.ts +++ b/src/stores/Stores.ts @@ -6,12 +6,14 @@ import MapOptionsStore from '@/stores/MapOptionsStore' import LocationStore from '@/stores/LocationStore' import PathDetailsStore from '@/stores/PathDetailsStore' import ViewportStore from '@/stores/ViewportStore' +import TurnNavigationStore from "@/stores/TurnNavigationStore"; let queryStore: QueryStore let routeStore: RouteStore let infoStore: ApiInfoStore let errorStore: ErrorStore let mapOptionsStore: MapOptionsStore +let turnNavigationStore: TurnNavigationStore let locationStore: LocationStore let pathDetailsStore: PathDetailsStore let viewportStore: ViewportStore @@ -22,6 +24,7 @@ interface StoresInput { infoStore: ApiInfoStore errorStore: ErrorStore mapOptionsStore: MapOptionsStore + turnNavigationStore: TurnNavigationStore locationStore: LocationStore pathDetailsStore: PathDetailsStore viewportStore: ViewportStore @@ -33,6 +36,7 @@ export const setStores = function (stores: StoresInput) { infoStore = stores.infoStore errorStore = stores.errorStore mapOptionsStore = stores.mapOptionsStore + turnNavigationStore = stores.turnNavigationStore locationStore = stores.locationStore pathDetailsStore = stores.pathDetailsStore viewportStore = stores.viewportStore @@ -43,6 +47,7 @@ export const getRouteStore = () => routeStore export const getApiInfoStore = () => infoStore export const getErrorStore = () => errorStore export const getMapOptionsStore = () => mapOptionsStore +export const getTurnNavigationStore = () => turnNavigationStore export const getLocationStore = () => locationStore export const getPathDetailsStore = () => pathDetailsStore export const getViewportStore = () => viewportStore diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts new file mode 100644 index 00000000..6d054327 --- /dev/null +++ b/src/stores/TurnNavigationStore.ts @@ -0,0 +1,31 @@ +import Store from "@/stores/Store"; +import {Action} from "@/stores/Dispatcher"; +import {TurnNavigationUpdate} from "@/actions/Actions"; + +export interface TurnNavigationState { + fakeGPS: boolean + acceptedRisk: boolean + soundEnabled: boolean +} + +export default class TurnNavigationStore extends Store { + + constructor() { + super() + } + + protected getInitialState(): TurnNavigationState { + return { + fakeGPS: false, + acceptedRisk: false, + soundEnabled: true, + } + } + + reduce(state: TurnNavigationState, action: Action): TurnNavigationState { + if (action instanceof TurnNavigationUpdate) + return {...action.update} + return state + } + +} \ No newline at end of file diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 702902ef..0e414188 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -8,14 +8,15 @@ import endNavigation from '@/turnNavigation/end_turn_navigation.png' import {getLocationStore} from '@/stores/Stores' import {LocationStoreState} from '@/stores/LocationStore' import {tr} from '@/translation/Translation' +import {TurnNavigationState} from "@/stores/TurnNavigationStore"; type TurnNavigationProps = { path: Path location: LocationStoreState - sound: boolean + turnNaviState: TurnNavigationState } -export default function ({path, location, sound}: TurnNavigationProps) { +export default function ({path, location, turnNaviState}: TurnNavigationProps) { let currentLocation = location.coordinate if (currentLocation.lat == 0 && currentLocation.lng == 0) return Searching GPS... @@ -57,7 +58,7 @@ export default function ({path, location, sound}: TurnNavigationProps) { ) let text = nextInstruction.street_name - if (sound) { + if (turnNaviState.soundEnabled) { // making lastAnnounceDistance dependent on location.speed is tricky because then it can change while driving, so pick the constant average speed // TODO use instruction average speed of current+next instruction instead of whole path let averageSpeed = (path.distance / (path.time / 1000)) * 3.6 From 5e088ad948a4e669063d91d897a3d56561002abb Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 14 Dec 2021 12:11:14 +0100 Subject: [PATCH 089/322] do not change risk variable when changing sound --- src/sidebar/RoutingResults.tsx | 2 +- src/stores/TurnNavigationStore.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 6e28dcd8..e5f03c04 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -50,7 +50,7 @@ function RoutingResult({ path, isSelected, turnNaviState }: { path: Path; isSele :
WARNING: This application is highly experimental! Use at your own risk!
{ - Dispatcher.dispatch(new TurnNavigationUpdate({acceptedRisk: true, soundEnabled: true} as TurnNavigationState)) + Dispatcher.dispatch(new TurnNavigationUpdate({acceptedRisk: true} as TurnNavigationState)) return getLocationStore().initReal()} }>I understand and agree
) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 6d054327..e5e210fb 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -23,8 +23,9 @@ export default class TurnNavigationStore extends Store { } reduce(state: TurnNavigationState, action: Action): TurnNavigationState { - if (action instanceof TurnNavigationUpdate) - return {...action.update} + if (action instanceof TurnNavigationUpdate) { + return {...state, ...action.update} + } return state } From 48cd257a20fc4642348c552104258b47f58da7a7 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 14 Dec 2021 12:24:23 +0100 Subject: [PATCH 090/322] try to fix tests --- package-lock.json | 23 +++++++++++++++++++++++ package.json | 5 ++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index f8d8da15..97c83ba4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "graphhopper-maps-react", "version": "0.0.0", "dependencies": { + "fsevents": "2.3.2", "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", "nosleep.js": "^0.12.0", "react": "^17.0.2", @@ -36,6 +37,9 @@ "webpack-cli": "^4.9.1", "webpack-dev-server": "^4.5.0", "webpack-merge": "^5.8.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, "node_modules/@babel/code-frame": { @@ -7305,6 +7309,19 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -22051,6 +22068,12 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", diff --git a/package.json b/package.json index 5fb3e28f..223cb096 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "test": "jest" }, "dependencies": { - "nosleep.js": "^0.12.0", "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", + "nosleep.js": "^0.12.0", "react": "^17.0.2", "react-dom": "^17.0.2", "react-map-gl": "^5.3.17", @@ -39,5 +39,8 @@ "webpack-cli": "^4.9.1", "webpack-dev-server": "^4.5.0", "webpack-merge": "^5.8.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } } From 561cd48bd59c28a4007213e63d98884725725773 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 14 Dec 2021 12:36:23 +0100 Subject: [PATCH 091/322] test more recent node version --- .travis.yml | 5 +- package-lock.json | 5758 ++++++++++++++++++++++----------------------- package.json | 3 - 3 files changed, 2805 insertions(+), 2961 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4c58a33b..489c165a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,8 @@ language: node_js -node_js: lts/fermium + +# TODO when using lts/fermium then node v14.18.2 and npm 6.14.15 is used and we get strange errors. Force using npm 8.1.0 +node_js: + - 16 global: # include $HOME for aws command diff --git a/package-lock.json b/package-lock.json index 97c83ba4..abe11df9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,6 @@ "name": "graphhopper-maps-react", "version": "0.0.0", "dependencies": { - "fsevents": "2.3.2", "leaflet.heightgraph": "github:easbar/Leaflet.Heightgraph#82cff7b3013dd73d7221521c5b404ded6439e050", "nosleep.js": "^0.12.0", "react": "^17.0.2", @@ -37,9 +36,6 @@ "webpack-cli": "^4.9.1", "webpack-dev-server": "^4.5.0", "webpack-merge": "^5.8.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" } }, "node_modules/@babel/code-frame": { @@ -64,19 +60,19 @@ } }, "node_modules/@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz", + "integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helpers": "^7.16.5", + "@babel/parser": "^7.16.5", "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", @@ -94,9 +90,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", "dev": true, "dependencies": { "@babel/types": "^7.16.0", @@ -120,9 +116,9 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", - "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.5.tgz", + "integrity": "sha512-3JEA9G5dmmnIWdzaT9d0NmFRgYnWUThLsDaL7982H0XqqWr56lRrsmwheXFMjR+TMl7QMBb6mzy9kvgr1lRLUA==", "dev": true, "dependencies": { "@babel/helper-explode-assignable-expression": "^7.16.0", @@ -151,16 +147,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", - "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz", + "integrity": "sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-function-name": "^7.16.0", - "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.5", "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.5", "@babel/helper-split-export-declaration": "^7.16.0" }, "engines": { @@ -205,6 +202,18 @@ "@babel/core": "^7.4.0-0" } }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz", + "integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-explode-assignable-expression": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", @@ -256,9 +265,9 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", + "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", "dev": true, "dependencies": { "@babel/types": "^7.16.0" @@ -280,18 +289,18 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", "dev": true, "dependencies": { + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", "@babel/helper-simple-access": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0", "@babel/helper-validator-identifier": "^7.15.7", "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" }, "engines": { @@ -311,22 +320,22 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", - "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.5.tgz", + "integrity": "sha512-X+aAJldyxrOmN9v3FKp+Hu1NO69VWgYgDGq6YDykwRPzxs5f2N+X988CBXS7EQahDU+Vpet5QYMqLk+nsp+Qxw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-wrap-function": "^7.16.0", + "@babel/helper-wrap-function": "^7.16.5", "@babel/types": "^7.16.0" }, "engines": { @@ -334,14 +343,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", + "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-member-expression-to-functions": "^7.16.5", "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" }, "engines": { @@ -403,14 +413,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", - "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.5.tgz", + "integrity": "sha512-2J2pmLBqUqVdJw78U0KPNdeE2qeuIyKoG4mKV7wAq3mc4jJG282UgjZw4ZYDnqiWQuS3Y3IYdF/AQ6CpyBV3VA==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.16.0", "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" }, "engines": { @@ -418,13 +428,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", - "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", + "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", "dev": true, "dependencies": { "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.3", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" }, "engines": { @@ -446,9 +456,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.5.tgz", + "integrity": "sha512-+Ce7T5iPNWzfu9C1aB5tN3Lyafs5xb3Ic7vBWyZL2KXT3QSdD1dD3CvgOzPmQKoNNRt6uauc0XwNJTQtXC2/Mw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -490,13 +500,13 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", - "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.5.tgz", + "integrity": "sha512-C/FX+3HNLV6sz7AqbTQqEo1L9/kfrKjxcVtgyBCmvIgOjvuBVUWooDoi7trsLxOzCEo5FccjRvKHkfDsJFZlfA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-remap-async-to-generator": "^7.16.5", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -507,13 +517,13 @@ } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", - "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz", + "integrity": "sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -523,13 +533,13 @@ } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", - "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.5.tgz", + "integrity": "sha512-EEFzuLZcm/rNJ8Q5krK+FRKdVkd6FjfzT9tuSZql9sQn64K0hHA2KLJ0DqVot9/iV6+SsuadC5yI39zWnm+nmQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -540,12 +550,12 @@ } }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", - "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.5.tgz", + "integrity": "sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -556,12 +566,12 @@ } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", - "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.5.tgz", + "integrity": "sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -572,12 +582,12 @@ } }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", - "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.5.tgz", + "integrity": "sha512-QQJueTFa0y9E4qHANqIvMsuxM/qcLQmKttBACtPCQzGUEizsXDACGonlPiSwynHfOa3vNw0FPMVvQzbuXwh4SQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -588,12 +598,12 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", - "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.5.tgz", + "integrity": "sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -604,12 +614,12 @@ } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", - "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz", + "integrity": "sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -620,12 +630,12 @@ } }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", - "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.5.tgz", + "integrity": "sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -636,16 +646,16 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", - "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.5.tgz", + "integrity": "sha512-UEd6KpChoyPhCoE840KRHOlGhEZFutdPDMGj+0I56yuTTOaT51GzmnEl/0uT41fB/vD2nT+Pci2KjezyE3HmUw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.0" + "@babel/plugin-transform-parameters": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -655,12 +665,12 @@ } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", - "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.5.tgz", + "integrity": "sha512-ihCMxY1Iljmx4bWy/PIMJGXN4NS4oUj1MKynwO07kiKms23pNvIn1DMB92DNB2R0EA882sw0VXIelYGdtF7xEQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -671,12 +681,12 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", - "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.5.tgz", + "integrity": "sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -688,13 +698,13 @@ } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", - "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.5.tgz", + "integrity": "sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -704,14 +714,14 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", - "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.5.tgz", + "integrity": "sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -722,13 +732,13 @@ } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", - "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.5.tgz", + "integrity": "sha512-s5sKtlKQyFSatt781HQwv1hoM5BQ9qRH30r+dK56OLDsHmV74mzwJNX7R1yMuE7VZKG5O6q/gmOGSAO6ikTudg==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=4" @@ -837,12 +847,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz", - "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.5.tgz", + "integrity": "sha512-42OGssv9NPk4QHKVgIHlzeLgPOW5rGgfV5jzG90AhcXXIv6hu/eqj63w4VgvRxdvZY3AlYeDgPiSJ3BqAd1Y6Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -954,12 +964,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", - "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.5.tgz", + "integrity": "sha512-8bTHiiZyMOyfZFULjsCnYOWG059FVMes0iljEHSfARhNgFfpsqE92OrCffv3veSw9rwMkYcFe9bj0ZoXU2IGtQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -969,14 +979,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", - "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.5.tgz", + "integrity": "sha512-TMXgfioJnkXU+XRoj7P2ED7rUm5jbnDWwlCuFVTpQboMfbSya5WrmubNBAMlk7KXvywpo8rd8WuYZkis1o2H8w==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-remap-async-to-generator": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -986,12 +996,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", - "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.5.tgz", + "integrity": "sha512-BxmIyKLjUGksJ99+hJyL/HIxLIGnLKtw772zYDER7UuycDZ+Xvzs98ZQw6NGgM2ss4/hlFAaGiZmMNKvValEjw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1001,12 +1011,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", - "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.5.tgz", + "integrity": "sha512-JxjSPNZSiOtmxjX7PBRBeRJTUKTyJ607YUYeT0QJCNdsedOe+/rXITjP08eG8xUpsLfPirgzdCFN+h0w6RI+pQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1016,16 +1026,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", - "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.5.tgz", + "integrity": "sha512-DzJ1vYf/7TaCYy57J3SJ9rV+JEuvmlnvvyvYKFbk5u46oQbBvuB9/0w+YsVsxkOv8zVWKpDmUoj4T5ILHoXevA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-function-name": "^7.16.0", "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-replace-supers": "^7.16.5", "@babel/helper-split-export-declaration": "^7.16.0", "globals": "^11.1.0" }, @@ -1037,12 +1048,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", - "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.5.tgz", + "integrity": "sha512-n1+O7xtU5lSLraRzX88CNcpl7vtGdPakKzww74bVwpAIRgz9JVLJJpOLb0uYqcOaXVM0TL6X0RVeIJGD2CnCkg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1052,12 +1063,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", - "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.5.tgz", + "integrity": "sha512-GuRVAsjq+c9YPK6NeTkRLWyQskDC099XkBSVO+6QzbnOnH2d/4mBVXYStaPrZD3dFRfg00I6BFJ9Atsjfs8mlg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1067,13 +1078,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", - "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.5.tgz", + "integrity": "sha512-iQiEMt8Q4/5aRGHpGVK2Zc7a6mx7qEAO7qehgSug3SDImnuMzgmm/wtJALXaz25zUj1PmnNHtShjFgk4PDx4nw==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1083,12 +1094,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", - "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.5.tgz", + "integrity": "sha512-81tijpDg2a6I1Yhj4aWY1l3O1J4Cg/Pd7LfvuaH2VVInAkXtzibz9+zSPdUM1WvuUi128ksstAP0hM5w48vQgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1098,13 +1109,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", - "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.5.tgz", + "integrity": "sha512-12rba2HwemQPa7BLIKCzm1pT2/RuQHtSFHdNl41cFiC6oi4tcrp7gjB07pxQvFpcADojQywSjblQth6gJyE6CA==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1114,12 +1125,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", - "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.5.tgz", + "integrity": "sha512-+DpCAJFPAvViR17PIMi9x2AE34dll5wNlXO43wagAX2YcRGgEVHCNFC4azG85b4YyyFarvkc/iD5NPrz4Oneqw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1129,13 +1140,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", - "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.5.tgz", + "integrity": "sha512-Fuec/KPSpVLbGo6z1RPw4EE1X+z9gZk1uQmnYy7v4xr4TO9p41v1AoUuXEtyqAI7H+xNJYSICzRqZBhDEkd3kQ==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1145,12 +1156,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", - "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.5.tgz", + "integrity": "sha512-B1j9C/IfvshnPcklsc93AVLTrNVa69iSqztylZH6qnmiAsDDOmmjEYqOm3Ts2lGSgTSywnBNiqC949VdD0/gfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1160,12 +1171,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", - "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.5.tgz", + "integrity": "sha512-d57i3vPHWgIde/9Y8W/xSFUndhvhZN5Wu2TjRrN1MVz5KzdUihKnfDVlfP1U7mS5DNj/WHHhaE4/tTi4hIyHwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1175,13 +1186,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", - "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.5.tgz", + "integrity": "sha512-oHI15S/hdJuSCfnwIz+4lm6wu/wBn7oJ8+QrkzPPwSFGXk8kgdI/AIKcbR/XnD1nQVMg/i6eNaXpszbGuwYDRQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1192,13 +1203,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", - "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.5.tgz", + "integrity": "sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-simple-access": "^7.16.0", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1210,14 +1221,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", - "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.5.tgz", + "integrity": "sha512-53gmLdScNN28XpjEVIm7LbWnD/b/TpbwKbLk6KV4KqC9WyU6rq1jnNmVG6UgAdQZVVGZVoik3DqHNxk4/EvrjA==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-identifier": "^7.15.7", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1229,13 +1240,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", - "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.5.tgz", + "integrity": "sha512-qTFnpxHMoenNHkS3VoWRdwrcJ3FhX567GvDA3hRZKF0Dj8Fmg0UzySZp3AP2mShl/bzcywb/UWAMQIjA1bhXvw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1245,9 +1256,9 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", - "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.5.tgz", + "integrity": "sha512-/wqGDgvFUeKELW6ex6QB7dLVRkd5ehjw34tpXu1nhKC0sFfmaLabIswnpf8JgDyV2NeDmZiwoOb0rAmxciNfjA==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.0" @@ -1260,12 +1271,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", - "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.5.tgz", + "integrity": "sha512-ZaIrnXF08ZC8jnKR4/5g7YakGVL6go6V9ql6Jl3ecO8PQaQqFE74CuM384kezju7Z9nGCCA20BqZaR1tJ/WvHg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1275,13 +1286,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", - "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.5.tgz", + "integrity": "sha512-tded+yZEXuxt9Jdtkc1RraW1zMF/GalVxaVVxh41IYwirdRgyAxxxCKZ9XB7LxZqmsjfjALxupNE1MIz9KH+Zg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-replace-supers": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1291,12 +1302,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", - "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.5.tgz", + "integrity": "sha512-B3O6AL5oPop1jAVg8CV+haeUte9oFuY85zu0jwnRNZZi3tVAbJriu5tag/oaO2kGaQM/7q7aGPBlTI5/sr9enA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1306,12 +1317,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", - "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.5.tgz", + "integrity": "sha512-+IRcVW71VdF9pEH/2R/Apab4a19LVvdVsr/gEeotH00vSDVlKD+XgfSIw+cgGWsjDB/ziqGv/pGoQZBIiQVXHg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1321,12 +1332,12 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.0.tgz", - "integrity": "sha512-OgtklS+p9t1X37eWA4XdvvbZG/3gqzX569gqmo3q4/Ui6qjfTQmOs5UTSrfdD9nVByHhX6Gbm/Pyc4KbwUXGWA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.5.tgz", + "integrity": "sha512-fdc1s5npHMZ9A+w9bYbrZu4499WyYPVaTTsRO8bU0GJcMuK4ejIX4lyjnpvi+YGLK/EhFQxWszqylO0vaMciFw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1336,12 +1347,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz", - "integrity": "sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.5.tgz", + "integrity": "sha512-dHYCOnzSsXFz8UcdNQIHGvg94qPL/teF7CCiCEMRxmA1G2p5Mq4JnKVowCDxYfiQ9D7RstaAp9kwaSI+sXbnhw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1351,15 +1362,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz", - "integrity": "sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.5.tgz", + "integrity": "sha512-+arLIz1d7kmwX0fKxTxbnoeG85ONSnLpvdODa4P3pc1sS7CV1hfmtYWufkW/oYsPnkDrEeQFxhUWcFnrXW7jQQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.0", "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-jsx": "^7.16.5", "@babel/types": "^7.16.0" }, "engines": { @@ -1370,12 +1381,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz", - "integrity": "sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.5.tgz", + "integrity": "sha512-uQSLacMZSGLCxOw20dzo1dmLlKkd+DsayoV54q3MHXhbqgPzoiGerZQgNPl/Ro8/OcXV2ugfnkx+rxdS0sN5Uw==", "dev": true, "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.16.0" + "@babel/plugin-transform-react-jsx": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1385,13 +1396,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz", - "integrity": "sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.5.tgz", + "integrity": "sha512-0nYU30hCxnCVCbRjSy9ahlhWZ2Sn6khbY4FqR91W+2RbSqkWEbVu2gXh45EqNy4Bq7sRU+H4i0/6YKwOSzh16A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1401,9 +1412,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", - "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.5.tgz", + "integrity": "sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg==", "dev": true, "dependencies": { "regenerator-transform": "^0.14.2" @@ -1416,12 +1427,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", - "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.5.tgz", + "integrity": "sha512-aIB16u8lNcf7drkhXJRoggOxSTUAuihTSTfAcpynowGJOZiGf+Yvi7RuTwFzVYSYPmWyARsPqUGoZWWWxLiknw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1431,12 +1442,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", - "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.5.tgz", + "integrity": "sha512-ZbuWVcY+MAXJuuW7qDoCwoxDUNClfZxoo7/4swVbOW1s/qYLOMHlm9YRWMsxMFuLs44eXsv4op1vAaBaBaDMVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1446,12 +1457,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", - "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.5.tgz", + "integrity": "sha512-5d6l/cnG7Lw4tGHEoga4xSkYp1euP7LAtrah1h1PgJ3JY7yNsjybsxQAnVK4JbtReZ/8z6ASVmd3QhYYKLaKZw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" }, "engines": { @@ -1462,12 +1473,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", - "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.5.tgz", + "integrity": "sha512-usYsuO1ID2LXxzuUxifgWtJemP7wL2uZtyrTVM4PKqsmJycdS4U4mGovL5xXkfUheds10Dd2PjoQLXw6zCsCbg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1477,12 +1488,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", - "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.5.tgz", + "integrity": "sha512-gnyKy9RyFhkovex4BjKWL3BVYzUDG6zC0gba7VMLbQoDuqMfJ1SDXs8k/XK41Mmt1Hyp4qNAvGFb9hKzdCqBRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1492,12 +1503,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", - "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.5.tgz", + "integrity": "sha512-ldxCkW180qbrvyCVDzAUZqB0TAeF8W/vGJoRcaf75awm6By+PxfJKvuqVAnq8N9wz5Xa6mSpM19OfVKKVmGHSQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1507,12 +1518,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", - "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.5.tgz", + "integrity": "sha512-shiCBHTIIChGLdyojsKQjoAyB8MBwat25lKM7MJjbe1hE0bgIppD+LX9afr41lLHOhqceqeWl4FkLp+Bgn9o1Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1522,13 +1533,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", - "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.5.tgz", + "integrity": "sha512-GTJ4IW012tiPEMMubd7sD07iU9O/LOo8Q/oU4xNhcaq0Xn8+6TcUQaHtC8YxySo1T+ErQ8RaWogIEeFhKGNPzw==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1538,32 +1549,32 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", - "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.5.tgz", + "integrity": "sha512-MiJJW5pwsktG61NDxpZ4oJ1CKxM1ncam9bzRtx9g40/WkLRkxFP6mhpkYV0/DxcciqoiHicx291+eUQrXb/SfQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.16.4", "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-option": "^7.14.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-async-generator-functions": "^7.16.4", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-class-static-block": "^7.16.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.0", - "@babel/plugin-proposal-export-namespace-from": "^7.16.0", - "@babel/plugin-proposal-json-strings": "^7.16.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-object-rest-spread": "^7.16.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-proposal-private-property-in-object": "^7.16.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.5", + "@babel/plugin-proposal-class-properties": "^7.16.5", + "@babel/plugin-proposal-class-static-block": "^7.16.5", + "@babel/plugin-proposal-dynamic-import": "^7.16.5", + "@babel/plugin-proposal-export-namespace-from": "^7.16.5", + "@babel/plugin-proposal-json-strings": "^7.16.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.5", + "@babel/plugin-proposal-numeric-separator": "^7.16.5", + "@babel/plugin-proposal-object-rest-spread": "^7.16.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.5", + "@babel/plugin-proposal-optional-chaining": "^7.16.5", + "@babel/plugin-proposal-private-methods": "^7.16.5", + "@babel/plugin-proposal-private-property-in-object": "^7.16.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.5", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", @@ -1578,38 +1589,38 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.0", - "@babel/plugin-transform-async-to-generator": "^7.16.0", - "@babel/plugin-transform-block-scoped-functions": "^7.16.0", - "@babel/plugin-transform-block-scoping": "^7.16.0", - "@babel/plugin-transform-classes": "^7.16.0", - "@babel/plugin-transform-computed-properties": "^7.16.0", - "@babel/plugin-transform-destructuring": "^7.16.0", - "@babel/plugin-transform-dotall-regex": "^7.16.0", - "@babel/plugin-transform-duplicate-keys": "^7.16.0", - "@babel/plugin-transform-exponentiation-operator": "^7.16.0", - "@babel/plugin-transform-for-of": "^7.16.0", - "@babel/plugin-transform-function-name": "^7.16.0", - "@babel/plugin-transform-literals": "^7.16.0", - "@babel/plugin-transform-member-expression-literals": "^7.16.0", - "@babel/plugin-transform-modules-amd": "^7.16.0", - "@babel/plugin-transform-modules-commonjs": "^7.16.0", - "@babel/plugin-transform-modules-systemjs": "^7.16.0", - "@babel/plugin-transform-modules-umd": "^7.16.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", - "@babel/plugin-transform-new-target": "^7.16.0", - "@babel/plugin-transform-object-super": "^7.16.0", - "@babel/plugin-transform-parameters": "^7.16.3", - "@babel/plugin-transform-property-literals": "^7.16.0", - "@babel/plugin-transform-regenerator": "^7.16.0", - "@babel/plugin-transform-reserved-words": "^7.16.0", - "@babel/plugin-transform-shorthand-properties": "^7.16.0", - "@babel/plugin-transform-spread": "^7.16.0", - "@babel/plugin-transform-sticky-regex": "^7.16.0", - "@babel/plugin-transform-template-literals": "^7.16.0", - "@babel/plugin-transform-typeof-symbol": "^7.16.0", - "@babel/plugin-transform-unicode-escapes": "^7.16.0", - "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/plugin-transform-arrow-functions": "^7.16.5", + "@babel/plugin-transform-async-to-generator": "^7.16.5", + "@babel/plugin-transform-block-scoped-functions": "^7.16.5", + "@babel/plugin-transform-block-scoping": "^7.16.5", + "@babel/plugin-transform-classes": "^7.16.5", + "@babel/plugin-transform-computed-properties": "^7.16.5", + "@babel/plugin-transform-destructuring": "^7.16.5", + "@babel/plugin-transform-dotall-regex": "^7.16.5", + "@babel/plugin-transform-duplicate-keys": "^7.16.5", + "@babel/plugin-transform-exponentiation-operator": "^7.16.5", + "@babel/plugin-transform-for-of": "^7.16.5", + "@babel/plugin-transform-function-name": "^7.16.5", + "@babel/plugin-transform-literals": "^7.16.5", + "@babel/plugin-transform-member-expression-literals": "^7.16.5", + "@babel/plugin-transform-modules-amd": "^7.16.5", + "@babel/plugin-transform-modules-commonjs": "^7.16.5", + "@babel/plugin-transform-modules-systemjs": "^7.16.5", + "@babel/plugin-transform-modules-umd": "^7.16.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.5", + "@babel/plugin-transform-new-target": "^7.16.5", + "@babel/plugin-transform-object-super": "^7.16.5", + "@babel/plugin-transform-parameters": "^7.16.5", + "@babel/plugin-transform-property-literals": "^7.16.5", + "@babel/plugin-transform-regenerator": "^7.16.5", + "@babel/plugin-transform-reserved-words": "^7.16.5", + "@babel/plugin-transform-shorthand-properties": "^7.16.5", + "@babel/plugin-transform-spread": "^7.16.5", + "@babel/plugin-transform-sticky-regex": "^7.16.5", + "@babel/plugin-transform-template-literals": "^7.16.5", + "@babel/plugin-transform-typeof-symbol": "^7.16.5", + "@babel/plugin-transform-unicode-escapes": "^7.16.5", + "@babel/plugin-transform-unicode-regex": "^7.16.5", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.16.0", "babel-plugin-polyfill-corejs2": "^0.3.0", @@ -1642,17 +1653,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.0.tgz", - "integrity": "sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.5.tgz", + "integrity": "sha512-3kzUOQeaxY/2vhPDS7CX/KGEGu/1bOYGvdRDJ2U5yjEz5o5jmIeTPLoiQBPGjfhPascLuW5OlMiPzwOOuB6txg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-react-jsx": "^7.16.0", - "@babel/plugin-transform-react-jsx-development": "^7.16.0", - "@babel/plugin-transform-react-pure-annotations": "^7.16.0" + "@babel/plugin-transform-react-display-name": "^7.16.5", + "@babel/plugin-transform-react-jsx": "^7.16.5", + "@babel/plugin-transform-react-jsx-development": "^7.16.5", + "@babel/plugin-transform-react-pure-annotations": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1662,9 +1673,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", - "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.5.tgz", + "integrity": "sha512-TXWihFIS3Pyv5hzR7j6ihmeLkZfrXGxAr5UfSl8CHf+6q/wpiYDkUau0czckpYG8QmnCIuPpdLtuA9VmuGGyMA==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1687,17 +1698,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-function-name": "^7.16.0", "@babel/helper-hoist-variables": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", + "@babel/parser": "^7.16.5", "@babel/types": "^7.16.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -1742,9 +1754,9 @@ } }, "node_modules/@discoveryjs/json-ext": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", - "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", "dev": true, "engines": { "node": ">=10.0.0" @@ -1977,18 +1989,6 @@ "node": ">=8" } }, - "node_modules/@jest/core/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/core/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2873,6 +2873,17 @@ "geojson-rewind": "geojson-rewind" } }, + "node_modules/@mapbox/geojson-rewind/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@mapbox/geojson-types": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", @@ -3223,9 +3234,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.1.16", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", - "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "version": "7.1.17", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.17.tgz", + "integrity": "sha512-6zzkezS9QEIL8yCBvXWxPTJPNuMeECJVxSOhxNY/jfq9LxOTHivaYTqr37n9LknWWRTIkzqH2UilS5QFvfa90A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -3264,9 +3275,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.0.tgz", - "integrity": "sha512-74hbvsnc+7TEDa1z5YLSe4/q8hGYB3USNvCuzHUJrjPV6hXaq8IXcngCrHkuvFt0+8rFz7xYXrHgNayIX0UZvQ==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.1.tgz", + "integrity": "sha512-UP9rzNn/XyGwb5RQ2fok+DzcIRIYwc16qTXse5+Smsy8MOIccCChT15KAwnsgQx4PzJkaMq4myFyZ4CL5TjhIQ==", "dev": true, "dependencies": { "@types/estree": "*", @@ -3313,9 +3324,9 @@ } }, "node_modules/@types/html-minifier-terser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.0.0.tgz", - "integrity": "sha512-NZwaaynfs1oIoLAV1vg18e7QMVDvw+6SQrdJc8w3BwUaoroVSf6EBj/Sk4PBWGxsq0dzhA2drbsuMC1/6C6KgQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true }, "node_modules/@types/http-proxy": { @@ -3368,17 +3379,17 @@ "dev": true }, "node_modules/@types/mapbox-gl": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-2.4.2.tgz", - "integrity": "sha512-mKgjmhUN780YGy9ZEyJK0Sr9gMtERmTQimGsIa5WrBHPlBXdmjYfqtz8nSMI7hOnQFphcuSMyqQswaQESFLHsA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-2.6.0.tgz", + "integrity": "sha512-lHdITzC0IVn9+Pq6WFkkK0N6rUKIqxsdrNeixiQdvROFn2Aeu3TDvhpuag1IdengL5WGGRuEhK6m6HB916ReLw==", "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/node": { - "version": "16.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.9.tgz", - "integrity": "sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==", + "version": "16.11.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", + "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -3412,9 +3423,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "17.0.36", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.36.tgz", - "integrity": "sha512-CUFUp01OdfbpN/76v4koqgcpcRGT3sYOq3U3N6q0ZVGcyeP40NUdVU+EWe3hs34RNaTefiYyBzOpxBBidCc5zw==", + "version": "17.0.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz", + "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -3833,18 +3844,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -4322,44 +4321,6 @@ "node": ">=0.10.0" } }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -4498,15 +4459,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", @@ -4556,13 +4508,13 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", - "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.0.tgz", + "integrity": "sha512-JGHzm73ei2OnAcobcQ61GXNnN6vDCg5Oz5MayudL+FyzjoLnCzUWnuLtDLMIYw8aXgQzzdCZMVky+fftD5jbtA==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001280", - "electron-to-chromium": "^1.3.896", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", "node-releases": "^2.0.1", "picocolors": "^1.0.0" @@ -4740,9 +4692,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001282", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001282.tgz", - "integrity": "sha512-YhF/hG6nqBEllymSIjLtR2iWDDnChvhnVJqp+vloyt2tEHFG1yBR+ac2B/rOw0qOK0m0lEXU2dv4E/sMk5P9Kg==", + "version": "1.0.30001286", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz", + "integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==", "dev": true, "funding": { "type": "opencollective", @@ -4865,41 +4817,112 @@ "node": ">=0.10.0" } }, - "node_modules/clean-css": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz", - "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==", + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "dependencies": { - "source-map": "~0.6.0" + "kind-of": "^3.0.2" }, "engines": { - "node": ">= 10.0" + "node": ">=0.10.0" } }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz", + "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -4929,18 +4952,6 @@ "node": ">=8" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -5068,9 +5079,9 @@ "dev": true }, "node_modules/color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "dev": true, "dependencies": { "color-name": "^1.0.0", @@ -5105,9 +5116,13 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } }, "node_modules/component-emitter": { "version": "1.3.0", @@ -5236,12 +5251,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", - "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.3.tgz", + "integrity": "sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA==", "dev": true, "dependencies": { - "browserslist": "^4.17.6", + "browserslist": "^4.18.1", "semver": "7.0.0" }, "funding": { @@ -5290,28 +5305,17 @@ } }, "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node": ">= 8" } }, "node_modules/css-loader": { @@ -5361,15 +5365,19 @@ "integrity": "sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA=" }, "node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/css-select-base-adapter": { @@ -5401,9 +5409,9 @@ } }, "node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "dev": true, "engines": { "node": ">= 6" @@ -5621,6 +5629,11 @@ "tsv2json": "bin/dsv2json" } }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "node_modules/d3-ease": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", @@ -5810,9 +5823,9 @@ } }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -5915,20 +5928,6 @@ "node": ">= 10" } }, - "node_modules/default-gateway/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/default-gateway/node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -5952,82 +5951,25 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/default-gateway/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-gateway/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-gateway/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-gateway/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-gateway/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-gateway/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/default-gateway/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, "engines": { - "node": ">= 8" + "node": ">=10.17.0" } }, "node_modules/define-lazy-prop": { @@ -6064,73 +6006,35 @@ "node": ">=0.10.0" } }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "dev": true, "dependencies": { - "kind-of": "^6.0.0" + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-property/node_modules/is-data-descriptor": { + "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" + "node": ">=0.4.0" } }, "node_modules/delegates": { @@ -6237,16 +6141,26 @@ } }, "node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, "dependencies": { "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/dom-serializer/node_modules/domelementtype": { + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "node_modules/domelementtype": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", @@ -6258,18 +6172,6 @@ } ] }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", - "dev": true - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, "node_modules/domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -6292,9 +6194,9 @@ } }, "node_modules/domhandler": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", "dev": true, "dependencies": { "domelementtype": "^2.2.0" @@ -6306,26 +6208,18 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/domhandler/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, "node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/dot-case": { @@ -6360,9 +6254,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.904", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.904.tgz", - "integrity": "sha512-x5uZWXcVNYkTh4JubD7KSC1VMKz0vZwJUqVwY3ihsW0bst1BXDe494Uqbg3Y0fDGVjJqA8vEeGuvO5foyH2+qw==", + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.17.tgz", + "integrity": "sha512-zhk1MravPtq/KBhmGB7TLBILmXTgRG9TFSI3qS3DbgyfHzIl72iiTE37r/BHIbPCJJlWIo5rySyxiH4vWhu2ZA==", "dev": true }, "node_modules/emittery": { @@ -6668,33 +6562,26 @@ "dev": true }, "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/get-stream": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "dependencies": { - "pump": "^3.0.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/exif-parser": { @@ -6763,6 +6650,86 @@ "node": ">=0.10.0" } }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/expand-brackets/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -6890,15 +6857,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/express/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6918,18 +6876,6 @@ "node": ">=0.10.0" } }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -6973,40 +6919,11 @@ "node": ">=0.10.0" } }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, "engines": { "node": ">=0.10.0" } @@ -7210,9 +7127,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.14.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", - "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==", + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", + "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==", "dev": true, "funding": [ { @@ -7248,17 +7165,17 @@ } }, "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.12" + "node": ">= 6" } }, "node_modules/forwarded": { @@ -7313,6 +7230,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -7344,6 +7262,27 @@ "wide-align": "^1.1.0" } }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7391,11 +7330,15 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7786,15 +7729,6 @@ "node": ">=12" } }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/html-webpack-plugin": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", @@ -7837,46 +7771,6 @@ "entities": "^2.0.0" } }, - "node_modules/htmlparser2/node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/htmlparser2/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -7906,9 +7800,9 @@ "dev": true }, "node_modules/http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", "dev": true }, "node_modules/http-proxy": { @@ -8144,33 +8038,6 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "node_modules/internal-ip": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", - "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", - "dev": true, - "dependencies": { - "default-gateway": "^6.0.0", - "ipaddr.js": "^1.9.1", - "is-ip": "^3.1.0", - "p-event": "^4.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/internal-ip?sponsor=1" - } - }, - "node_modules/internal-ip/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -8219,24 +8086,12 @@ } }, "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "kind-of": "^6.0.0" }, "engines": { "node": ">=0.10.0" @@ -8347,24 +8202,12 @@ } }, "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "kind-of": "^6.0.0" }, "engines": { "node": ">=0.10.0" @@ -8386,28 +8229,19 @@ } }, "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -8424,10 +8258,13 @@ } }, "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, "engines": { "node": ">=0.10.0" } @@ -8480,31 +8317,10 @@ "node": ">=0.10.0" } }, - "node_modules/is-ip": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", - "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", - "dev": true, - "dependencies": { - "ip-regex": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ip/node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { "node": ">= 0.4" @@ -8611,12 +8427,15 @@ } }, "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { @@ -8656,12 +8475,12 @@ "dev": true }, "node_modules/is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8798,9 +8617,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", - "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.1.tgz", + "integrity": "sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -8841,125 +8660,101 @@ "node": ">= 10.14.2" } }, - "node_modules/jest-changed-files/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/jest-changed-files/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "node_modules/jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" }, - "engines": { - "node": ">=10" + "bin": { + "jest": "bin/jest.js" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/jest-changed-files/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "pump": "^3.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-changed-files/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-changed-files/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/jest-changed-files/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/jest-changed-files/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/jest-changed-files/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, "node_modules/jest-config": { @@ -10396,103 +10191,6 @@ "node": ">=8" } }, - "node_modules/jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest/node_modules/jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "dependencies": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jimp": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz", @@ -10582,34 +10280,6 @@ } } }, - "node_modules/jsdom/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsdom/node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -10635,9 +10305,9 @@ "dev": true }, "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "node_modules/json-schema-traverse": { @@ -10677,18 +10347,18 @@ } }, "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, - "engines": [ - "node >=0.6.0" - ], "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/kdbush": { @@ -10962,9 +10632,9 @@ } }, "node_modules/memfs": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.3.0.tgz", - "integrity": "sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.0.tgz", + "integrity": "sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA==", "dev": true, "dependencies": { "fs-monkey": "1.0.3" @@ -11115,18 +10785,6 @@ "node": ">=0.10.0" } }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mjolnir.js": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mjolnir.js/-/mjolnir.js-2.6.0.tgz", @@ -11313,15 +10971,6 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/node-notifier": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", @@ -11339,44 +10988,18 @@ }, "node_modules/node-notifier/node_modules/semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-notifier/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/node-notifier/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "optional": true, "dependencies": { - "isexe": "^2.0.0" + "lru-cache": "^6.0.0" }, "bin": { - "node-which": "bin/node-which" + "semver": "bin/semver.js" }, "engines": { - "node": ">= 8" + "node": ">=10" } }, "node_modules/node-releases": { @@ -11421,15 +11044,15 @@ "integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==" }, "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/npmlog": { @@ -11445,12 +11068,15 @@ } }, "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, "dependencies": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, "node_modules/number-is-nan": { @@ -11511,6 +11137,53 @@ "node": ">=0.10.0" } }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-copy/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -11524,9 +11197,9 @@ } }, "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", + "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11736,21 +11409,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dev": true, - "dependencies": { - "p-timeout": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -11815,18 +11473,6 @@ "node": ">=8" } }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -11987,12 +11633,12 @@ } }, "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-parse": { @@ -12080,13 +11726,10 @@ } }, "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", + "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", "dev": true, - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, "engines": { "node": ">= 6" } @@ -12157,14 +11800,14 @@ } }, "node_modules/postcss": { - "version": "8.3.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz", - "integrity": "sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "dev": true, "dependencies": { "nanoid": "^3.1.30", "picocolors": "^1.0.0", - "source-map-js": "^0.6.2" + "source-map-js": "^1.0.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -12234,9 +11877,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz", + "integrity": "sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -12247,9 +11890,9 @@ } }, "node_modules/postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "node_modules/potpack": { @@ -12363,12 +12006,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -12413,6 +12050,11 @@ "react-is": "^16.8.1" } }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/protocol-buffers-schema": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", @@ -12476,9 +12118,9 @@ } }, "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true, "engines": { "node": ">=0.6" @@ -12611,14 +12253,15 @@ } }, "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true }, "node_modules/react-map-gl": { - "version": "5.3.17", - "resolved": "https://registry.npmjs.org/react-map-gl/-/react-map-gl-5.3.17.tgz", - "integrity": "sha512-AUMFPTsm0OQ128PhGIeK4Unul/2+i6amQD5EyokxWJmuGr37YPvKWBy/i6Zw2F3pDQmQ2ORlsroM99NeS8XEag==", + "version": "5.3.18", + "resolved": "https://registry.npmjs.org/react-map-gl/-/react-map-gl-5.3.18.tgz", + "integrity": "sha512-NERQDx7Blvmmqm7RBjhfDt++6PXr4gpjBejkKVw557gxs1vGohoS6pjDUp5qMZ2a/tsu4vmkmUBG9tefLXFEjQ==", "dependencies": { "@babel/runtime": "^7.0.0", "@types/geojson": "^7946.0.7", @@ -12695,6 +12338,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", @@ -12876,98 +12528,6 @@ "strip-ansi": "^6.0.1" } }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/repeat-element": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", @@ -13024,7 +12584,53 @@ "uuid": "^3.3.2" }, "engines": { - "node": ">= 6" + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" } }, "node_modules/require-directory": { @@ -13393,6 +12999,40 @@ "node": ">=0.10.0" } }, + "node_modules/sane/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/sane/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/sane/node_modules/fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -13420,6 +13060,27 @@ "node": ">=0.10.0" } }, + "node_modules/sane/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sane/node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -13444,6 +13105,15 @@ "node": ">=0.10.0" } }, + "node_modules/sane/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sane/node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -13480,6 +13150,57 @@ "node": ">=0.10.0" } }, + "node_modules/sane/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sane/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sane/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", @@ -13493,6 +13214,18 @@ "node": ">=0.10.0" } }, + "node_modules/sane/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -13724,6 +13457,15 @@ "node": ">=0.10.0" } }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -13786,24 +13528,24 @@ } }, "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shellwords": { @@ -13939,57 +13681,76 @@ "node": ">=0.10.0" } }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "dependencies": { - "kind-of": "^6.0.0" + "kind-of": "^3.2.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { - "kind-of": "^6.0.0" + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "dependencies": { - "kind-of": "^3.2.0" + "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-util/node_modules/kind-of": { + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", @@ -14001,35 +13762,58 @@ "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "dependencies": { - "ms": "2.0.0" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { - "is-descriptor": "^0.1.0" + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, "engines": { "node": ">=0.10.0" } @@ -14041,13 +13825,13 @@ "dev": true }, "node_modules/sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "dependencies": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, @@ -14061,9 +13845,9 @@ } }, "node_modules/source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -14102,6 +13886,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-loader/node_modules/source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -14311,6 +14104,77 @@ "node": ">=0.10.0" } }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -14363,18 +14227,6 @@ "node": ">=10" } }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -14389,6 +14241,27 @@ "node": ">=0.10.0" } }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", @@ -14416,24 +14289,15 @@ } }, "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/strip-bom": { @@ -14576,6 +14440,65 @@ "node": ">=4.0.0" } }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -14718,9 +14641,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz", - "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", + "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", "dev": true, "dependencies": { "@types/node": "*", @@ -14755,6 +14678,12 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/terser/node_modules/source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -14937,16 +14866,17 @@ } }, "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" }, "engines": { - "node": ">=0.8" + "node": ">=6" } }, "node_modules/tr46": { @@ -15016,15 +14946,6 @@ "node": ">=10" } }, - "node_modules/ts-jest/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/ts-loader": { "version": "9.2.6", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz", @@ -15175,12 +15096,15 @@ } }, "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/type-is": { @@ -15206,9 +15130,9 @@ } }, "node_modules/typescript": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", - "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -15288,6 +15212,15 @@ "node": ">=0.10.0" } }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -15459,13 +15392,12 @@ } }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/v8-to-istanbul": { @@ -15596,9 +15528,9 @@ } }, "node_modules/watchpack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -15627,9 +15559,9 @@ } }, "node_modules/webpack": { - "version": "5.64.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.64.2.tgz", - "integrity": "sha512-4KGc0+Ozi0aS3EaLNRvEppfZUer+CaORKqL6OBjDLZOPf9YfN8leagFzwe6/PoBdHFxc/utKArl8LMC0Ivtmdg==", + "version": "5.65.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz", + "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.0", @@ -15654,7 +15586,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", + "watchpack": "^2.3.1", "webpack-sources": "^3.2.2" }, "bin": { @@ -15720,23 +15652,9 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-cli/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, + "dev": true, "engines": { - "node": ">= 8" + "node": ">= 10" } }, "node_modules/webpack-cli/node_modules/execa": { @@ -15762,82 +15680,25 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/webpack-cli/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/webpack-cli/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/webpack-cli/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-cli/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-cli/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-cli/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-cli/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-cli/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/webpack-cli/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, "engines": { - "node": ">= 8" + "node": ">=10.17.0" } }, "node_modules/webpack-dev-middleware": { @@ -15917,9 +15778,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.5.0.tgz", - "integrity": "sha512-Ss4WptsUjYa+3hPI4iYZYEc8FrtnfkaPrm5WTjk9ux5kiCS718836srs0ppKMHRaCHP5mQ6g4JZGcfDdGbCjpQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz", + "integrity": "sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg==", "dev": true, "dependencies": { "ansi-html-community": "^0.0.8", @@ -15928,17 +15789,17 @@ "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", + "default-gateway": "^6.0.3", "del": "^6.0.0", "express": "^4.17.1", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.0", - "internal-ip": "^6.2.0", "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", "portfinder": "^1.0.28", - "schema-utils": "^3.1.0", + "schema-utils": "^4.0.0", "selfsigned": "^1.10.11", "serve-index": "^1.9.1", "sockjs": "^0.3.21", @@ -15963,6 +15824,34 @@ } } }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, "node_modules/webpack-dev-server/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -15975,6 +15864,31 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/webpack-dev-server/node_modules/strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", @@ -15991,9 +15905,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", + "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -16086,15 +16000,18 @@ } }, "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-boxed-primitive": { @@ -16213,18 +16130,6 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -16244,9 +16149,9 @@ } }, "node_modules/ws": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", - "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", "dev": true, "engines": { "node": ">=8.3.0" @@ -16369,19 +16274,15 @@ } }, "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/yargs-parser/node_modules/camelcase": { + "node_modules/yargs/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", @@ -16413,16 +16314,17 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/yargs/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "engines": { - "node": ">=8" + "node": ">=6" } } }, @@ -16443,19 +16345,19 @@ "dev": true }, "@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz", + "integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==", "dev": true, "requires": { "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helpers": "^7.16.5", + "@babel/parser": "^7.16.5", "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", @@ -16466,9 +16368,9 @@ } }, "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", "dev": true, "requires": { "@babel/types": "^7.16.0", @@ -16486,9 +16388,9 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", - "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.5.tgz", + "integrity": "sha512-3JEA9G5dmmnIWdzaT9d0NmFRgYnWUThLsDaL7982H0XqqWr56lRrsmwheXFMjR+TMl7QMBb6mzy9kvgr1lRLUA==", "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.16.0", @@ -16508,16 +16410,17 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", - "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz", + "integrity": "sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-function-name": "^7.16.0", - "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.5", "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.5", "@babel/helper-split-export-declaration": "^7.16.0" } }, @@ -16547,6 +16450,15 @@ "semver": "^6.1.2" } }, + "@babel/helper-environment-visitor": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz", + "integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, "@babel/helper-explode-assignable-expression": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", @@ -16586,9 +16498,9 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", + "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", "dev": true, "requires": { "@babel/types": "^7.16.0" @@ -16604,18 +16516,18 @@ } }, "@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", "dev": true, "requires": { + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", "@babel/helper-simple-access": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0", "@babel/helper-validator-identifier": "^7.15.7", "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" } }, @@ -16629,31 +16541,32 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", - "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.5.tgz", + "integrity": "sha512-X+aAJldyxrOmN9v3FKp+Hu1NO69VWgYgDGq6YDykwRPzxs5f2N+X988CBXS7EQahDU+Vpet5QYMqLk+nsp+Qxw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-wrap-function": "^7.16.0", + "@babel/helper-wrap-function": "^7.16.5", "@babel/types": "^7.16.0" } }, "@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", + "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-member-expression-to-functions": "^7.16.5", "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" } }, @@ -16697,25 +16610,25 @@ "dev": true }, "@babel/helper-wrap-function": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", - "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.5.tgz", + "integrity": "sha512-2J2pmLBqUqVdJw78U0KPNdeE2qeuIyKoG4mKV7wAq3mc4jJG282UgjZw4ZYDnqiWQuS3Y3IYdF/AQ6CpyBV3VA==", "dev": true, "requires": { "@babel/helper-function-name": "^7.16.0", "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" } }, "@babel/helpers": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", - "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", + "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", "dev": true, "requires": { "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.3", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" } }, @@ -16731,9 +16644,9 @@ } }, "@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.5.tgz", + "integrity": "sha512-+Ce7T5iPNWzfu9C1aB5tN3Lyafs5xb3Ic7vBWyZL2KXT3QSdD1dD3CvgOzPmQKoNNRt6uauc0XwNJTQtXC2/Mw==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -16757,161 +16670,161 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", - "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.5.tgz", + "integrity": "sha512-C/FX+3HNLV6sz7AqbTQqEo1L9/kfrKjxcVtgyBCmvIgOjvuBVUWooDoi7trsLxOzCEo5FccjRvKHkfDsJFZlfA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-remap-async-to-generator": "^7.16.5", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", - "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz", + "integrity": "sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", - "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.5.tgz", + "integrity": "sha512-EEFzuLZcm/rNJ8Q5krK+FRKdVkd6FjfzT9tuSZql9sQn64K0hHA2KLJ0DqVot9/iV6+SsuadC5yI39zWnm+nmQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", - "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.5.tgz", + "integrity": "sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", - "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.5.tgz", + "integrity": "sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", - "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.5.tgz", + "integrity": "sha512-QQJueTFa0y9E4qHANqIvMsuxM/qcLQmKttBACtPCQzGUEizsXDACGonlPiSwynHfOa3vNw0FPMVvQzbuXwh4SQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", - "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.5.tgz", + "integrity": "sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", - "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz", + "integrity": "sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", - "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.5.tgz", + "integrity": "sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", - "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.5.tgz", + "integrity": "sha512-UEd6KpChoyPhCoE840KRHOlGhEZFutdPDMGj+0I56yuTTOaT51GzmnEl/0uT41fB/vD2nT+Pci2KjezyE3HmUw==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.0" + "@babel/plugin-transform-parameters": "^7.16.5" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", - "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.5.tgz", + "integrity": "sha512-ihCMxY1Iljmx4bWy/PIMJGXN4NS4oUj1MKynwO07kiKms23pNvIn1DMB92DNB2R0EA882sw0VXIelYGdtF7xEQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", - "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.5.tgz", + "integrity": "sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", - "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.5.tgz", + "integrity": "sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", - "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.5.tgz", + "integrity": "sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", - "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.5.tgz", + "integrity": "sha512-s5sKtlKQyFSatt781HQwv1hoM5BQ9qRH30r+dK56OLDsHmV74mzwJNX7R1yMuE7VZKG5O6q/gmOGSAO6ikTudg==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-syntax-async-generators": { @@ -16987,12 +16900,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz", - "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.5.tgz", + "integrity": "sha512-42OGssv9NPk4QHKVgIHlzeLgPOW5rGgfV5jzG90AhcXXIv6hu/eqj63w4VgvRxdvZY3AlYeDgPiSJ3BqAd1Y6Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -17068,394 +16981,395 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", - "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.5.tgz", + "integrity": "sha512-8bTHiiZyMOyfZFULjsCnYOWG059FVMes0iljEHSfARhNgFfpsqE92OrCffv3veSw9rwMkYcFe9bj0ZoXU2IGtQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", - "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.5.tgz", + "integrity": "sha512-TMXgfioJnkXU+XRoj7P2ED7rUm5jbnDWwlCuFVTpQboMfbSya5WrmubNBAMlk7KXvywpo8rd8WuYZkis1o2H8w==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-remap-async-to-generator": "^7.16.5" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", - "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.5.tgz", + "integrity": "sha512-BxmIyKLjUGksJ99+hJyL/HIxLIGnLKtw772zYDER7UuycDZ+Xvzs98ZQw6NGgM2ss4/hlFAaGiZmMNKvValEjw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", - "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.5.tgz", + "integrity": "sha512-JxjSPNZSiOtmxjX7PBRBeRJTUKTyJ607YUYeT0QJCNdsedOe+/rXITjP08eG8xUpsLfPirgzdCFN+h0w6RI+pQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-classes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", - "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.5.tgz", + "integrity": "sha512-DzJ1vYf/7TaCYy57J3SJ9rV+JEuvmlnvvyvYKFbk5u46oQbBvuB9/0w+YsVsxkOv8zVWKpDmUoj4T5ILHoXevA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-function-name": "^7.16.0", "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-replace-supers": "^7.16.5", "@babel/helper-split-export-declaration": "^7.16.0", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", - "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.5.tgz", + "integrity": "sha512-n1+O7xtU5lSLraRzX88CNcpl7vtGdPakKzww74bVwpAIRgz9JVLJJpOLb0uYqcOaXVM0TL6X0RVeIJGD2CnCkg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-destructuring": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", - "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.5.tgz", + "integrity": "sha512-GuRVAsjq+c9YPK6NeTkRLWyQskDC099XkBSVO+6QzbnOnH2d/4mBVXYStaPrZD3dFRfg00I6BFJ9Atsjfs8mlg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", - "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.5.tgz", + "integrity": "sha512-iQiEMt8Q4/5aRGHpGVK2Zc7a6mx7qEAO7qehgSug3SDImnuMzgmm/wtJALXaz25zUj1PmnNHtShjFgk4PDx4nw==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", - "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.5.tgz", + "integrity": "sha512-81tijpDg2a6I1Yhj4aWY1l3O1J4Cg/Pd7LfvuaH2VVInAkXtzibz9+zSPdUM1WvuUi128ksstAP0hM5w48vQgg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", - "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.5.tgz", + "integrity": "sha512-12rba2HwemQPa7BLIKCzm1pT2/RuQHtSFHdNl41cFiC6oi4tcrp7gjB07pxQvFpcADojQywSjblQth6gJyE6CA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-for-of": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", - "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.5.tgz", + "integrity": "sha512-+DpCAJFPAvViR17PIMi9x2AE34dll5wNlXO43wagAX2YcRGgEVHCNFC4azG85b4YyyFarvkc/iD5NPrz4Oneqw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", - "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.5.tgz", + "integrity": "sha512-Fuec/KPSpVLbGo6z1RPw4EE1X+z9gZk1uQmnYy7v4xr4TO9p41v1AoUuXEtyqAI7H+xNJYSICzRqZBhDEkd3kQ==", "dev": true, "requires": { "@babel/helper-function-name": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", - "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.5.tgz", + "integrity": "sha512-B1j9C/IfvshnPcklsc93AVLTrNVa69iSqztylZH6qnmiAsDDOmmjEYqOm3Ts2lGSgTSywnBNiqC949VdD0/gfw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", - "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.5.tgz", + "integrity": "sha512-d57i3vPHWgIde/9Y8W/xSFUndhvhZN5Wu2TjRrN1MVz5KzdUihKnfDVlfP1U7mS5DNj/WHHhaE4/tTi4hIyHwQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", - "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.5.tgz", + "integrity": "sha512-oHI15S/hdJuSCfnwIz+4lm6wu/wBn7oJ8+QrkzPPwSFGXk8kgdI/AIKcbR/XnD1nQVMg/i6eNaXpszbGuwYDRQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", - "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.5.tgz", + "integrity": "sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-simple-access": "^7.16.0", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", - "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.5.tgz", + "integrity": "sha512-53gmLdScNN28XpjEVIm7LbWnD/b/TpbwKbLk6KV4KqC9WyU6rq1jnNmVG6UgAdQZVVGZVoik3DqHNxk4/EvrjA==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-identifier": "^7.15.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", - "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.5.tgz", + "integrity": "sha512-qTFnpxHMoenNHkS3VoWRdwrcJ3FhX567GvDA3hRZKF0Dj8Fmg0UzySZp3AP2mShl/bzcywb/UWAMQIjA1bhXvw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", - "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.5.tgz", + "integrity": "sha512-/wqGDgvFUeKELW6ex6QB7dLVRkd5ehjw34tpXu1nhKC0sFfmaLabIswnpf8JgDyV2NeDmZiwoOb0rAmxciNfjA==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.0" } }, "@babel/plugin-transform-new-target": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", - "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.5.tgz", + "integrity": "sha512-ZaIrnXF08ZC8jnKR4/5g7YakGVL6go6V9ql6Jl3ecO8PQaQqFE74CuM384kezju7Z9nGCCA20BqZaR1tJ/WvHg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-object-super": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", - "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.5.tgz", + "integrity": "sha512-tded+yZEXuxt9Jdtkc1RraW1zMF/GalVxaVVxh41IYwirdRgyAxxxCKZ9XB7LxZqmsjfjALxupNE1MIz9KH+Zg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-replace-supers": "^7.16.5" } }, "@babel/plugin-transform-parameters": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", - "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.5.tgz", + "integrity": "sha512-B3O6AL5oPop1jAVg8CV+haeUte9oFuY85zu0jwnRNZZi3tVAbJriu5tag/oaO2kGaQM/7q7aGPBlTI5/sr9enA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", - "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.5.tgz", + "integrity": "sha512-+IRcVW71VdF9pEH/2R/Apab4a19LVvdVsr/gEeotH00vSDVlKD+XgfSIw+cgGWsjDB/ziqGv/pGoQZBIiQVXHg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.0.tgz", - "integrity": "sha512-OgtklS+p9t1X37eWA4XdvvbZG/3gqzX569gqmo3q4/Ui6qjfTQmOs5UTSrfdD9nVByHhX6Gbm/Pyc4KbwUXGWA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.5.tgz", + "integrity": "sha512-fdc1s5npHMZ9A+w9bYbrZu4499WyYPVaTTsRO8bU0GJcMuK4ejIX4lyjnpvi+YGLK/EhFQxWszqylO0vaMciFw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz", - "integrity": "sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.5.tgz", + "integrity": "sha512-dHYCOnzSsXFz8UcdNQIHGvg94qPL/teF7CCiCEMRxmA1G2p5Mq4JnKVowCDxYfiQ9D7RstaAp9kwaSI+sXbnhw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz", - "integrity": "sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.5.tgz", + "integrity": "sha512-+arLIz1d7kmwX0fKxTxbnoeG85ONSnLpvdODa4P3pc1sS7CV1hfmtYWufkW/oYsPnkDrEeQFxhUWcFnrXW7jQQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-jsx": "^7.16.5", "@babel/types": "^7.16.0" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz", - "integrity": "sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.5.tgz", + "integrity": "sha512-uQSLacMZSGLCxOw20dzo1dmLlKkd+DsayoV54q3MHXhbqgPzoiGerZQgNPl/Ro8/OcXV2ugfnkx+rxdS0sN5Uw==", "dev": true, "requires": { - "@babel/plugin-transform-react-jsx": "^7.16.0" + "@babel/plugin-transform-react-jsx": "^7.16.5" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz", - "integrity": "sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.5.tgz", + "integrity": "sha512-0nYU30hCxnCVCbRjSy9ahlhWZ2Sn6khbY4FqR91W+2RbSqkWEbVu2gXh45EqNy4Bq7sRU+H4i0/6YKwOSzh16A==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-regenerator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", - "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.5.tgz", + "integrity": "sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", - "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.5.tgz", + "integrity": "sha512-aIB16u8lNcf7drkhXJRoggOxSTUAuihTSTfAcpynowGJOZiGf+Yvi7RuTwFzVYSYPmWyARsPqUGoZWWWxLiknw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", - "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.5.tgz", + "integrity": "sha512-ZbuWVcY+MAXJuuW7qDoCwoxDUNClfZxoo7/4swVbOW1s/qYLOMHlm9YRWMsxMFuLs44eXsv4op1vAaBaBaDMVg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", - "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.5.tgz", + "integrity": "sha512-5d6l/cnG7Lw4tGHEoga4xSkYp1euP7LAtrah1h1PgJ3JY7yNsjybsxQAnVK4JbtReZ/8z6ASVmd3QhYYKLaKZw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", - "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.5.tgz", + "integrity": "sha512-usYsuO1ID2LXxzuUxifgWtJemP7wL2uZtyrTVM4PKqsmJycdS4U4mGovL5xXkfUheds10Dd2PjoQLXw6zCsCbg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-template-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", - "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.5.tgz", + "integrity": "sha512-gnyKy9RyFhkovex4BjKWL3BVYzUDG6zC0gba7VMLbQoDuqMfJ1SDXs8k/XK41Mmt1Hyp4qNAvGFb9hKzdCqBRQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", - "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.5.tgz", + "integrity": "sha512-ldxCkW180qbrvyCVDzAUZqB0TAeF8W/vGJoRcaf75awm6By+PxfJKvuqVAnq8N9wz5Xa6mSpM19OfVKKVmGHSQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", - "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.5.tgz", + "integrity": "sha512-shiCBHTIIChGLdyojsKQjoAyB8MBwat25lKM7MJjbe1hE0bgIppD+LX9afr41lLHOhqceqeWl4FkLp+Bgn9o1Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", - "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.5.tgz", + "integrity": "sha512-GTJ4IW012tiPEMMubd7sD07iU9O/LOo8Q/oU4xNhcaq0Xn8+6TcUQaHtC8YxySo1T+ErQ8RaWogIEeFhKGNPzw==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/preset-env": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", - "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.5.tgz", + "integrity": "sha512-MiJJW5pwsktG61NDxpZ4oJ1CKxM1ncam9bzRtx9g40/WkLRkxFP6mhpkYV0/DxcciqoiHicx291+eUQrXb/SfQ==", "dev": true, "requires": { "@babel/compat-data": "^7.16.4", "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-option": "^7.14.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-async-generator-functions": "^7.16.4", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-class-static-block": "^7.16.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.0", - "@babel/plugin-proposal-export-namespace-from": "^7.16.0", - "@babel/plugin-proposal-json-strings": "^7.16.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-object-rest-spread": "^7.16.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-proposal-private-property-in-object": "^7.16.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.5", + "@babel/plugin-proposal-class-properties": "^7.16.5", + "@babel/plugin-proposal-class-static-block": "^7.16.5", + "@babel/plugin-proposal-dynamic-import": "^7.16.5", + "@babel/plugin-proposal-export-namespace-from": "^7.16.5", + "@babel/plugin-proposal-json-strings": "^7.16.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.5", + "@babel/plugin-proposal-numeric-separator": "^7.16.5", + "@babel/plugin-proposal-object-rest-spread": "^7.16.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.5", + "@babel/plugin-proposal-optional-chaining": "^7.16.5", + "@babel/plugin-proposal-private-methods": "^7.16.5", + "@babel/plugin-proposal-private-property-in-object": "^7.16.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.5", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", @@ -17470,38 +17384,38 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.0", - "@babel/plugin-transform-async-to-generator": "^7.16.0", - "@babel/plugin-transform-block-scoped-functions": "^7.16.0", - "@babel/plugin-transform-block-scoping": "^7.16.0", - "@babel/plugin-transform-classes": "^7.16.0", - "@babel/plugin-transform-computed-properties": "^7.16.0", - "@babel/plugin-transform-destructuring": "^7.16.0", - "@babel/plugin-transform-dotall-regex": "^7.16.0", - "@babel/plugin-transform-duplicate-keys": "^7.16.0", - "@babel/plugin-transform-exponentiation-operator": "^7.16.0", - "@babel/plugin-transform-for-of": "^7.16.0", - "@babel/plugin-transform-function-name": "^7.16.0", - "@babel/plugin-transform-literals": "^7.16.0", - "@babel/plugin-transform-member-expression-literals": "^7.16.0", - "@babel/plugin-transform-modules-amd": "^7.16.0", - "@babel/plugin-transform-modules-commonjs": "^7.16.0", - "@babel/plugin-transform-modules-systemjs": "^7.16.0", - "@babel/plugin-transform-modules-umd": "^7.16.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", - "@babel/plugin-transform-new-target": "^7.16.0", - "@babel/plugin-transform-object-super": "^7.16.0", - "@babel/plugin-transform-parameters": "^7.16.3", - "@babel/plugin-transform-property-literals": "^7.16.0", - "@babel/plugin-transform-regenerator": "^7.16.0", - "@babel/plugin-transform-reserved-words": "^7.16.0", - "@babel/plugin-transform-shorthand-properties": "^7.16.0", - "@babel/plugin-transform-spread": "^7.16.0", - "@babel/plugin-transform-sticky-regex": "^7.16.0", - "@babel/plugin-transform-template-literals": "^7.16.0", - "@babel/plugin-transform-typeof-symbol": "^7.16.0", - "@babel/plugin-transform-unicode-escapes": "^7.16.0", - "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/plugin-transform-arrow-functions": "^7.16.5", + "@babel/plugin-transform-async-to-generator": "^7.16.5", + "@babel/plugin-transform-block-scoped-functions": "^7.16.5", + "@babel/plugin-transform-block-scoping": "^7.16.5", + "@babel/plugin-transform-classes": "^7.16.5", + "@babel/plugin-transform-computed-properties": "^7.16.5", + "@babel/plugin-transform-destructuring": "^7.16.5", + "@babel/plugin-transform-dotall-regex": "^7.16.5", + "@babel/plugin-transform-duplicate-keys": "^7.16.5", + "@babel/plugin-transform-exponentiation-operator": "^7.16.5", + "@babel/plugin-transform-for-of": "^7.16.5", + "@babel/plugin-transform-function-name": "^7.16.5", + "@babel/plugin-transform-literals": "^7.16.5", + "@babel/plugin-transform-member-expression-literals": "^7.16.5", + "@babel/plugin-transform-modules-amd": "^7.16.5", + "@babel/plugin-transform-modules-commonjs": "^7.16.5", + "@babel/plugin-transform-modules-systemjs": "^7.16.5", + "@babel/plugin-transform-modules-umd": "^7.16.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.5", + "@babel/plugin-transform-new-target": "^7.16.5", + "@babel/plugin-transform-object-super": "^7.16.5", + "@babel/plugin-transform-parameters": "^7.16.5", + "@babel/plugin-transform-property-literals": "^7.16.5", + "@babel/plugin-transform-regenerator": "^7.16.5", + "@babel/plugin-transform-reserved-words": "^7.16.5", + "@babel/plugin-transform-shorthand-properties": "^7.16.5", + "@babel/plugin-transform-spread": "^7.16.5", + "@babel/plugin-transform-sticky-regex": "^7.16.5", + "@babel/plugin-transform-template-literals": "^7.16.5", + "@babel/plugin-transform-typeof-symbol": "^7.16.5", + "@babel/plugin-transform-unicode-escapes": "^7.16.5", + "@babel/plugin-transform-unicode-regex": "^7.16.5", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.16.0", "babel-plugin-polyfill-corejs2": "^0.3.0", @@ -17525,23 +17439,23 @@ } }, "@babel/preset-react": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.0.tgz", - "integrity": "sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.5.tgz", + "integrity": "sha512-3kzUOQeaxY/2vhPDS7CX/KGEGu/1bOYGvdRDJ2U5yjEz5o5jmIeTPLoiQBPGjfhPascLuW5OlMiPzwOOuB6txg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-react-jsx": "^7.16.0", - "@babel/plugin-transform-react-jsx-development": "^7.16.0", - "@babel/plugin-transform-react-pure-annotations": "^7.16.0" + "@babel/plugin-transform-react-display-name": "^7.16.5", + "@babel/plugin-transform-react-jsx": "^7.16.5", + "@babel/plugin-transform-react-jsx-development": "^7.16.5", + "@babel/plugin-transform-react-pure-annotations": "^7.16.5" } }, "@babel/runtime": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", - "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.5.tgz", + "integrity": "sha512-TXWihFIS3Pyv5hzR7j6ihmeLkZfrXGxAr5UfSl8CHf+6q/wpiYDkUau0czckpYG8QmnCIuPpdLtuA9VmuGGyMA==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -17558,17 +17472,18 @@ } }, "@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", "dev": true, "requires": { "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-function-name": "^7.16.0", "@babel/helper-hoist-variables": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", + "@babel/parser": "^7.16.5", "@babel/types": "^7.16.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -17601,9 +17516,9 @@ } }, "@discoveryjs/json-ext": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", - "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", "dev": true }, "@istanbuljs/load-nyc-config": { @@ -17780,15 +17695,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -18474,6 +18380,13 @@ "requires": { "get-stream": "^6.0.1", "minimist": "^1.2.5" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + } } }, "@mapbox/geojson-types": { @@ -18710,9 +18623,9 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.16", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", - "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "version": "7.1.17", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.17.tgz", + "integrity": "sha512-6zzkezS9QEIL8yCBvXWxPTJPNuMeECJVxSOhxNY/jfq9LxOTHivaYTqr37n9LknWWRTIkzqH2UilS5QFvfa90A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -18751,9 +18664,9 @@ } }, "@types/eslint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.0.tgz", - "integrity": "sha512-74hbvsnc+7TEDa1z5YLSe4/q8hGYB3USNvCuzHUJrjPV6hXaq8IXcngCrHkuvFt0+8rFz7xYXrHgNayIX0UZvQ==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.1.tgz", + "integrity": "sha512-UP9rzNn/XyGwb5RQ2fok+DzcIRIYwc16qTXse5+Smsy8MOIccCChT15KAwnsgQx4PzJkaMq4myFyZ4CL5TjhIQ==", "dev": true, "requires": { "@types/estree": "*", @@ -18800,9 +18713,9 @@ } }, "@types/html-minifier-terser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.0.0.tgz", - "integrity": "sha512-NZwaaynfs1oIoLAV1vg18e7QMVDvw+6SQrdJc8w3BwUaoroVSf6EBj/Sk4PBWGxsq0dzhA2drbsuMC1/6C6KgQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true }, "@types/http-proxy": { @@ -18855,17 +18768,17 @@ "dev": true }, "@types/mapbox-gl": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-2.4.2.tgz", - "integrity": "sha512-mKgjmhUN780YGy9ZEyJK0Sr9gMtERmTQimGsIa5WrBHPlBXdmjYfqtz8nSMI7hOnQFphcuSMyqQswaQESFLHsA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-2.6.0.tgz", + "integrity": "sha512-lHdITzC0IVn9+Pq6WFkkK0N6rUKIqxsdrNeixiQdvROFn2Aeu3TDvhpuag1IdengL5WGGRuEhK6m6HB916ReLw==", "requires": { "@types/geojson": "*" } }, "@types/node": { - "version": "16.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.9.tgz", - "integrity": "sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==", + "version": "16.11.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", + "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==", "dev": true }, "@types/normalize-package-data": { @@ -18899,9 +18812,9 @@ "dev": true }, "@types/react": { - "version": "17.0.36", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.36.tgz", - "integrity": "sha512-CUFUp01OdfbpN/76v4koqgcpcRGT3sYOq3U3N6q0ZVGcyeP40NUdVU+EWe3hs34RNaTefiYyBzOpxBBidCc5zw==", + "version": "17.0.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz", + "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==", "dev": true, "requires": { "@types/prop-types": "*", @@ -19259,14 +19172,6 @@ "dev": true, "requires": { "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } } }, "ansi-html-community": { @@ -19638,35 +19543,6 @@ "requires": { "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } } } }, @@ -19777,12 +19653,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true } } }, @@ -19832,13 +19702,13 @@ "dev": true }, "browserslist": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", - "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.0.tgz", + "integrity": "sha512-JGHzm73ei2OnAcobcQ61GXNnN6vDCg5Oz5MayudL+FyzjoLnCzUWnuLtDLMIYw8aXgQzzdCZMVky+fftD5jbtA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001280", - "electron-to-chromium": "^1.3.896", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", "node-releases": "^2.0.1", "picocolors": "^1.0.0" @@ -19968,9 +19838,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001282", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001282.tgz", - "integrity": "sha512-YhF/hG6nqBEllymSIjLtR2iWDDnChvhnVJqp+vloyt2tEHFG1yBR+ac2B/rOw0qOK0m0lEXU2dv4E/sMk5P9Kg==", + "version": "1.0.30001286", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz", + "integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==", "dev": true }, "capture-exit": { @@ -20065,6 +19935,63 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -20118,15 +20045,6 @@ "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } } } }, @@ -20235,9 +20153,9 @@ "dev": true }, "color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "dev": true, "requires": { "color-name": "^1.0.0", @@ -20266,9 +20184,10 @@ } }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true }, "component-emitter": { "version": "1.3.0", @@ -20378,12 +20297,12 @@ "dev": true }, "core-js-compat": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", - "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.3.tgz", + "integrity": "sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA==", "dev": true, "requires": { - "browserslist": "^4.17.6", + "browserslist": "^4.18.1", "semver": "7.0.0" }, "dependencies": { @@ -20424,24 +20343,14 @@ } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "css-loader": { @@ -20477,15 +20386,16 @@ "integrity": "sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA=" }, "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" } }, "css-select-base-adapter": { @@ -20513,9 +20423,9 @@ } }, "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "dev": true }, "csscolorparser": { @@ -20700,6 +20610,13 @@ "commander": "2", "iconv-lite": "0.4", "rw": "1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } } }, "d3-ease": { @@ -20885,9 +20802,9 @@ } }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -20961,17 +20878,6 @@ "execa": "^5.0.0" }, "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -20989,56 +20895,17 @@ "strip-final-newline": "^2.0.0" } }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -21062,40 +20929,9 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" } }, "del": { @@ -21206,21 +21042,14 @@ } }, "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, "requires": { "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - } } }, "dom-walk": { @@ -21230,9 +21059,9 @@ "dev": true }, "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", "dev": true }, "domexception": { @@ -21253,30 +21082,23 @@ } }, "domhandler": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", "dev": true, "requires": { "domelementtype": "^2.2.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - } } }, "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } }, "dot-case": { @@ -21311,9 +21133,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.904", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.904.tgz", - "integrity": "sha512-x5uZWXcVNYkTh4JubD7KSC1VMKz0vZwJUqVwY3ihsW0bst1BXDe494Uqbg3Y0fDGVjJqA8vEeGuvO5foyH2+qw==", + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.17.tgz", + "integrity": "sha512-zhk1MravPtq/KBhmGB7TLBILmXTgRG9TFSI3qS3DbgyfHzIl72iiTE37r/BHIbPCJJlWIo5rySyxiH4vWhu2ZA==", "dev": true }, "emittery": { @@ -21541,29 +21363,20 @@ "dev": true }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, "exif-parser": { @@ -21620,6 +21433,69 @@ "is-extendable": "^0.1.0" } }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -21732,12 +21608,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true } } }, @@ -21755,17 +21625,6 @@ "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } } }, "extglob": { @@ -21802,34 +21661,11 @@ "is-extendable": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true } } }, @@ -22001,9 +21837,9 @@ } }, "follow-redirects": { - "version": "1.14.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", - "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==", + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", + "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==", "dev": true }, "for-in": { @@ -22019,13 +21855,13 @@ "dev": true }, "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, @@ -22072,6 +21908,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "optional": true }, "function-bind": { @@ -22094,6 +21931,23 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "gensync": { @@ -22131,9 +21985,13 @@ "dev": true }, "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } }, "get-symbol-description": { "version": "1.0.0", @@ -22437,14 +22295,6 @@ "param-case": "^3.0.4", "relateurl": "^0.2.7", "terser": "^5.10.0" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - } } }, "html-webpack-plugin": { @@ -22470,36 +22320,6 @@ "domhandler": "^4.0.0", "domutils": "^2.5.2", "entities": "^2.0.0" - }, - "dependencies": { - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - } } }, "http-deceiver": { @@ -22530,9 +22350,9 @@ } }, "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", "dev": true }, "http-proxy": { @@ -22697,26 +22517,6 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "internal-ip": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", - "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", - "dev": true, - "requires": { - "default-gateway": "^6.0.0", - "ipaddr.js": "^1.9.1", - "is-ip": "^3.1.0", - "p-event": "^4.2.0" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } - } - }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -22753,23 +22553,12 @@ "dev": true }, "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "kind-of": "^6.0.0" } }, "is-arguments": { @@ -22847,23 +22636,12 @@ } }, "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "kind-of": "^6.0.0" } }, "is-date-object": { @@ -22876,22 +22654,14 @@ } }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-docker": { @@ -22901,10 +22671,13 @@ "dev": true }, "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } }, "is-extglob": { "version": "2.1.1", @@ -22942,27 +22715,10 @@ "is-extglob": "^2.1.1" } }, - "is-ip": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", - "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", - "dev": true, - "requires": { - "ip-regex": "^4.0.0" - }, - "dependencies": { - "ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true - } - } - }, "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-number": { @@ -23030,9 +22786,9 @@ "dev": true }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-string": { @@ -23060,12 +22816,12 @@ "dev": true }, "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" } }, "is-windows": { @@ -23173,9 +22929,9 @@ } }, "istanbul-reports": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", - "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.1.tgz", + "integrity": "sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -23191,6 +22947,38 @@ "@jest/core": "^26.6.3", "import-local": "^3.0.2", "jest-cli": "^26.6.3" + } + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + } + }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" }, "dependencies": { "ansi-styles": { @@ -23233,27 +23021,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -23265,101 +23032,6 @@ } } }, - "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "jest-config": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", @@ -24515,30 +24187,6 @@ "whatwg-url": "^8.5.0", "ws": "^7.4.6", "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - } - } } }, "jsesc": { @@ -24560,9 +24208,9 @@ "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { @@ -24593,14 +24241,14 @@ "dev": true }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, @@ -24828,9 +24476,9 @@ "dev": true }, "memfs": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.3.0.tgz", - "integrity": "sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.0.tgz", + "integrity": "sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA==", "dev": true, "requires": { "fs-monkey": "1.0.3" @@ -24940,17 +24588,6 @@ "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } } }, "mjolnir.js": { @@ -25110,12 +24747,6 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, "node-notifier": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", @@ -25140,23 +24771,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "optional": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -25198,12 +24812,12 @@ "integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==" }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" } }, "npmlog": { @@ -25219,12 +24833,12 @@ } }, "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, "requires": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" } }, "number-is-nan": { @@ -25270,6 +24884,43 @@ "is-descriptor": "^0.1.0" } }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -25282,9 +24933,9 @@ } }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", + "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==", "dev": true }, "object-is": { @@ -25431,15 +25082,6 @@ "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "dev": true }, - "p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dev": true, - "requires": { - "p-timeout": "^3.1.0" - } - }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -25483,15 +25125,6 @@ "retry": "^0.13.1" } }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -25622,9 +25255,9 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -25694,13 +25327,10 @@ } }, "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", + "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", + "dev": true }, "pixelmatch": { "version": "4.0.2", @@ -25755,14 +25385,14 @@ "dev": true }, "postcss": { - "version": "8.3.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz", - "integrity": "sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "dev": true, "requires": { "nanoid": "^3.1.30", "picocolors": "^1.0.0", - "source-map-js": "^0.6.2" + "source-map-js": "^1.0.1" } }, "postcss-modules-extract-imports": { @@ -25802,9 +25432,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz", + "integrity": "sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -25812,9 +25442,9 @@ } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "potpack": { @@ -25900,12 +25530,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true } } }, @@ -25945,6 +25569,13 @@ "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.8.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } } }, "protocol-buffers-schema": { @@ -25999,9 +25630,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true }, "querystring": { @@ -26097,14 +25728,15 @@ } }, "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true }, "react-map-gl": { - "version": "5.3.17", - "resolved": "https://registry.npmjs.org/react-map-gl/-/react-map-gl-5.3.17.tgz", - "integrity": "sha512-AUMFPTsm0OQ128PhGIeK4Unul/2+i6amQD5EyokxWJmuGr37YPvKWBy/i6Zw2F3pDQmQ2ORlsroM99NeS8XEag==", + "version": "5.3.18", + "resolved": "https://registry.npmjs.org/react-map-gl/-/react-map-gl-5.3.18.tgz", + "integrity": "sha512-NERQDx7Blvmmqm7RBjhfDt++6PXr4gpjBejkKVw557gxs1vGohoS6pjDUp5qMZ2a/tsu4vmkmUBG9tefLXFEjQ==", "requires": { "@babel/runtime": "^7.0.0", "@types/geojson": "^7946.0.7", @@ -26162,6 +25794,14 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } } }, "readable-stream": { @@ -26306,73 +25946,6 @@ "htmlparser2": "^6.1.0", "lodash": "^4.17.21", "strip-ansi": "^6.0.1" - }, - "dependencies": { - "css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" - } - }, - "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", - "dev": true - }, - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } } }, "repeat-element": { @@ -26419,6 +25992,41 @@ "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "require-directory": { @@ -26717,6 +26325,34 @@ } } }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -26740,6 +26376,21 @@ } } }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -26760,6 +26411,12 @@ } } }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -26790,6 +26447,42 @@ "remove-trailing-separator": "^1.0.1" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", @@ -26799,6 +26492,15 @@ "is-number": "^3.0.0", "repeat-string": "^1.6.1" } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -27007,6 +26709,12 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true } } }, @@ -27058,18 +26766,18 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shellwords": { @@ -27185,6 +26893,69 @@ "is-extendable": "^0.1.0" } }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -27212,35 +26983,6 @@ "requires": { "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } } } }, @@ -27265,13 +27007,13 @@ } }, "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "requires": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, @@ -27282,9 +27024,9 @@ "dev": true }, "source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", "dev": true }, "source-map-loader": { @@ -27306,6 +27048,12 @@ "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true } } }, @@ -27489,8 +27237,65 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -27532,17 +27337,6 @@ "requires": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } } }, "string-width": { @@ -27554,6 +27348,23 @@ "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "string.prototype.trimend": { @@ -27577,20 +27388,12 @@ } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -27693,6 +27496,63 @@ "stable": "^0.1.8", "unquote": "~1.1.1", "util.promisify": "~1.0.0" + }, + "dependencies": { + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + } + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + } } }, "symbol-tree": { @@ -27766,6 +27626,12 @@ "source-map-support": "~0.5.20" }, "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -27794,9 +27660,9 @@ "dev": true }, "jest-worker": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz", - "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", + "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", "dev": true, "requires": { "@types/node": "*", @@ -27964,13 +27830,14 @@ "dev": true }, "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" } }, "tr46": { @@ -28014,12 +27881,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true } } }, @@ -28132,9 +27993,9 @@ "dev": true }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, "type-is": { @@ -28157,9 +28018,9 @@ } }, "typescript": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", - "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", "dev": true }, "unbox-primitive": { @@ -28212,6 +28073,14 @@ "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } } }, "universalify": { @@ -28360,9 +28229,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, "v8-to-istanbul": { @@ -28479,9 +28348,9 @@ } }, "watchpack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -28504,9 +28373,9 @@ "dev": true }, "webpack": { - "version": "5.64.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.64.2.tgz", - "integrity": "sha512-4KGc0+Ozi0aS3EaLNRvEppfZUer+CaORKqL6OBjDLZOPf9YfN8leagFzwe6/PoBdHFxc/utKArl8LMC0Ivtmdg==", + "version": "5.65.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz", + "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -28531,7 +28400,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", + "watchpack": "^2.3.1", "webpack-sources": "^3.2.2" } }, @@ -28561,17 +28430,6 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -28589,56 +28447,17 @@ "strip-final-newline": "^2.0.0" } }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -28697,9 +28516,9 @@ } }, "webpack-dev-server": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.5.0.tgz", - "integrity": "sha512-Ss4WptsUjYa+3hPI4iYZYEc8FrtnfkaPrm5WTjk9ux5kiCS718836srs0ppKMHRaCHP5mQ6g4JZGcfDdGbCjpQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz", + "integrity": "sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg==", "dev": true, "requires": { "ansi-html-community": "^0.0.8", @@ -28708,17 +28527,17 @@ "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", + "default-gateway": "^6.0.3", "del": "^6.0.0", "express": "^4.17.1", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.0", - "internal-ip": "^6.2.0", "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", "portfinder": "^1.0.28", - "schema-utils": "^3.1.0", + "schema-utils": "^4.0.0", "selfsigned": "^1.10.11", "serve-index": "^1.9.1", "sockjs": "^0.3.21", @@ -28729,12 +28548,51 @@ "ws": "^8.1.0" }, "dependencies": { + "ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, "ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, "strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", @@ -28745,9 +28603,9 @@ } }, "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", + "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", "dev": true, "requires": {} } @@ -28813,9 +28671,9 @@ } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -28912,15 +28770,6 @@ "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } } } }, @@ -28943,9 +28792,9 @@ } }, "ws": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", - "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", "dev": true, "requires": {} }, @@ -29038,6 +28887,12 @@ "yargs-parser": "^18.1.2" }, "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -29055,34 +28910,23 @@ "strip-ansi": "^6.0.1" } }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { - "ansi-regex": "^5.0.1" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true } } } diff --git a/package.json b/package.json index 223cb096..8a1b9217 100644 --- a/package.json +++ b/package.json @@ -39,8 +39,5 @@ "webpack-cli": "^4.9.1", "webpack-dev-server": "^4.5.0", "webpack-merge": "^5.8.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" } } From 40c8d5e41ce92998c1e2e6e30117bcbb73ba0399 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 14 Dec 2021 17:06:25 +0100 Subject: [PATCH 092/322] move warning text into translation assets --- src/sidebar/RoutingResults.tsx | 3 +- src/translation/tr.json | 132 ++++++++++++++++++++++----------- 2 files changed, 90 insertions(+), 45 deletions(-) diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index e5f03c04..f2a9048a 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -12,6 +12,7 @@ import { useMediaQuery } from 'react-responsive' import { getLocationStore } from '@/stores/Stores' import startNavigation from '@/sidebar/start_turn_navigation.png' import { TurnNavigationState } from "@/stores/TurnNavigationStore"; +import {tr} from "@/translation/Translation"; export interface RoutingResultsProps { paths: Path[] @@ -48,7 +49,7 @@ function RoutingResult({ path, isSelected, turnNaviState }: { path: Path; isSele ? (!showRisk ? setShowRisk(true)} src={startNavigation}/> :
-
WARNING: This application is highly experimental! Use at your own risk!
+
{tr("warning")}
{ Dispatcher.dispatch(new TurnNavigationUpdate({acceptedRisk: true} as TurnNavigationState)) return getLocationStore().initReal()} diff --git a/src/translation/tr.json b/src/translation/tr.json index efa8b5c4..393fd5b6 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -50,7 +50,8 @@ "in_mi_singular":"In 1 mile", "in_mi":"In %1$s miles", "in_ft":"In %1$s feet", -"for_mi":"for %1$s miles" +"for_mi":"for %1$s miles", +"warning":"WARNING: This application is highly experimental! Use at your own risk!" }, "ar":{ "via_hint":"خلال", @@ -104,7 +105,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "ast":{ "via_hint":"Pasando per", @@ -158,7 +160,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "bg":{ "via_hint":"през", @@ -212,7 +215,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "bn_BN":{ "via_hint":"", @@ -266,7 +270,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "ca":{ "via_hint":"Passant per", @@ -320,7 +325,8 @@ "in_mi_singular":"En una milla", "in_mi":"En %1$s milles", "in_ft":"En %1$s peus", -"for_mi":"per %1$s milles" +"for_mi":"per %1$s milles", +"warning":"" }, "cs_CZ":{ "via_hint":"Přes ", @@ -374,7 +380,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "da_DK":{ "via_hint":"Via", @@ -428,7 +435,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "de_DE":{ "via_hint":"Über", @@ -482,7 +490,8 @@ "in_mi_singular":"In 1 Meile", "in_mi":"In %1$s Meilen", "in_ft":"In %1$s Fuß", -"for_mi":"für %1$s Meilen" +"for_mi":"für %1$s Meilen", +"warning":"" }, "el":{ "via_hint":"Μέσω", @@ -536,7 +545,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "eo":{ "via_hint":"Tra", @@ -590,7 +600,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "es":{ "via_hint":"Pasando por", @@ -644,7 +655,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "fa":{ "via_hint":"با گذر از", @@ -698,7 +710,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "fil":{ "via_hint":"", @@ -752,7 +765,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "fi":{ "via_hint":"Reittipiste", @@ -806,7 +820,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "fr_FR":{ "via_hint":"Via", @@ -860,7 +875,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "fr_CH":{ "via_hint":"Via", @@ -914,7 +930,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "gl":{ "via_hint":"Vía", @@ -968,7 +985,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "he":{ "via_hint":"דרך", @@ -1022,7 +1040,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "hr_HR":{ "via_hint":"Preko", @@ -1076,7 +1095,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "hsb":{ "via_hint":"přez", @@ -1130,7 +1150,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "hu_HU":{ "via_hint":"Ezen keresztül", @@ -1184,7 +1205,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "in_ID":{ "via_hint":"melalui", @@ -1238,7 +1260,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "it":{ "via_hint":"attraverso", @@ -1292,7 +1315,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "ja":{ "via_hint":"経由", @@ -1346,7 +1370,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "ko":{ "via_hint":"경유", @@ -1400,7 +1425,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "lt_LT":{ "via_hint":"Per", @@ -1454,7 +1480,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "ne":{ "via_hint":"बाट", @@ -1508,7 +1535,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "nl":{ "via_hint":"via", @@ -1562,7 +1590,8 @@ "in_mi_singular":"Over 1 mijl", "in_mi":"Over %1$s mijl", "in_ft":"Over %1$s voet", -"for_mi":"Voor %1$s mijl" +"for_mi":"Voor %1$s mijl", +"warning":"" }, "pl_PL":{ "via_hint":"Przez", @@ -1616,7 +1645,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "pt_BR":{ "via_hint":"Via", @@ -1670,7 +1700,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "pt_PT":{ "via_hint":"Por", @@ -1724,7 +1755,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "ro":{ "via_hint":"Prin", @@ -1778,7 +1810,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "ru":{ "via_hint":"Через", @@ -1832,7 +1865,8 @@ "in_mi_singular":"В 1 миле", "in_mi":"В %1$s милях", "in_ft":"В %1$s футах", -"for_mi":"В %1$s милях" +"for_mi":"В %1$s милях", +"warning":"" }, "sk":{ "via_hint":"Cez", @@ -1886,7 +1920,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "sl_SI":{ "via_hint":"Preko", @@ -1940,7 +1975,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "sr_RS":{ "via_hint":"Preko", @@ -1994,7 +2030,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "sv_SE":{ "via_hint":"Via", @@ -2048,7 +2085,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "tr":{ "via_hint":"Yoluyla", @@ -2102,7 +2140,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "uk":{ "via_hint":"через", @@ -2156,7 +2195,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "vi_VN":{ "via_hint":"Qua", @@ -2210,7 +2250,8 @@ "in_mi_singular":"Trong 1 dặm", "in_mi":"Trong %1$s dặm", "in_ft":"Trong %1$s ft", -"for_mi":"Khoảng %1$s dặm" +"for_mi":"Khoảng %1$s dặm", +"warning":"" }, "zh_CN":{ "via_hint":"途经点", @@ -2264,7 +2305,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "zh_HK":{ "via_hint":"途經", @@ -2318,7 +2360,8 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }, "zh_TW":{ "via_hint":"途經", @@ -2372,5 +2415,6 @@ "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"" +"for_mi":"", +"warning":"" }} \ No newline at end of file From 7d07e14e402fb392ec9cc42e6186ba512e9243bc Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 14 Dec 2021 17:15:15 +0100 Subject: [PATCH 093/322] include button too --- src/sidebar/RoutingResults.tsx | 2 +- src/translation/tr.json | 132 ++++++++++++++++++++++----------- 2 files changed, 89 insertions(+), 45 deletions(-) diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index f2a9048a..44c7fc55 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -53,7 +53,7 @@ function RoutingResult({ path, isSelected, turnNaviState }: { path: Path; isSele { Dispatcher.dispatch(new TurnNavigationUpdate({acceptedRisk: true} as TurnNavigationState)) return getLocationStore().initReal()} - }>I understand and agree + }>{tr("accept_risks_after_warning")}
) : turnNaviState.fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal()} src={startNavigation}/> } diff --git a/src/translation/tr.json b/src/translation/tr.json index 393fd5b6..c4081a65 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -51,7 +51,8 @@ "in_mi":"In %1$s miles", "in_ft":"In %1$s feet", "for_mi":"for %1$s miles", -"warning":"WARNING: This application is highly experimental! Use at your own risk!" +"warning":"WARNING: This application is highly experimental! Use at your own risk!", +"accept_risks_after_warning":"I understand and agree" }, "ar":{ "via_hint":"خلال", @@ -106,7 +107,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "ast":{ "via_hint":"Pasando per", @@ -161,7 +163,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "bg":{ "via_hint":"през", @@ -216,7 +219,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "bn_BN":{ "via_hint":"", @@ -271,7 +275,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "ca":{ "via_hint":"Passant per", @@ -326,7 +331,8 @@ "in_mi":"En %1$s milles", "in_ft":"En %1$s peus", "for_mi":"per %1$s milles", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "cs_CZ":{ "via_hint":"Přes ", @@ -381,7 +387,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "da_DK":{ "via_hint":"Via", @@ -436,7 +443,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "de_DE":{ "via_hint":"Über", @@ -491,7 +499,8 @@ "in_mi":"In %1$s Meilen", "in_ft":"In %1$s Fuß", "for_mi":"für %1$s Meilen", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "el":{ "via_hint":"Μέσω", @@ -546,7 +555,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "eo":{ "via_hint":"Tra", @@ -601,7 +611,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "es":{ "via_hint":"Pasando por", @@ -656,7 +667,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "fa":{ "via_hint":"با گذر از", @@ -711,7 +723,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "fil":{ "via_hint":"", @@ -766,7 +779,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "fi":{ "via_hint":"Reittipiste", @@ -821,7 +835,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "fr_FR":{ "via_hint":"Via", @@ -876,7 +891,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "fr_CH":{ "via_hint":"Via", @@ -931,7 +947,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "gl":{ "via_hint":"Vía", @@ -986,7 +1003,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "he":{ "via_hint":"דרך", @@ -1041,7 +1059,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "hr_HR":{ "via_hint":"Preko", @@ -1096,7 +1115,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "hsb":{ "via_hint":"přez", @@ -1151,7 +1171,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "hu_HU":{ "via_hint":"Ezen keresztül", @@ -1206,7 +1227,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "in_ID":{ "via_hint":"melalui", @@ -1261,7 +1283,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "it":{ "via_hint":"attraverso", @@ -1316,7 +1339,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "ja":{ "via_hint":"経由", @@ -1371,7 +1395,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "ko":{ "via_hint":"경유", @@ -1426,7 +1451,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "lt_LT":{ "via_hint":"Per", @@ -1481,7 +1507,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "ne":{ "via_hint":"बाट", @@ -1536,7 +1563,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "nl":{ "via_hint":"via", @@ -1591,7 +1619,8 @@ "in_mi":"Over %1$s mijl", "in_ft":"Over %1$s voet", "for_mi":"Voor %1$s mijl", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "pl_PL":{ "via_hint":"Przez", @@ -1646,7 +1675,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "pt_BR":{ "via_hint":"Via", @@ -1701,7 +1731,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "pt_PT":{ "via_hint":"Por", @@ -1756,7 +1787,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "ro":{ "via_hint":"Prin", @@ -1811,7 +1843,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "ru":{ "via_hint":"Через", @@ -1866,7 +1899,8 @@ "in_mi":"В %1$s милях", "in_ft":"В %1$s футах", "for_mi":"В %1$s милях", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "sk":{ "via_hint":"Cez", @@ -1921,7 +1955,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "sl_SI":{ "via_hint":"Preko", @@ -1976,7 +2011,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "sr_RS":{ "via_hint":"Preko", @@ -2031,7 +2067,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "sv_SE":{ "via_hint":"Via", @@ -2086,7 +2123,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "tr":{ "via_hint":"Yoluyla", @@ -2141,7 +2179,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "uk":{ "via_hint":"через", @@ -2196,7 +2235,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "vi_VN":{ "via_hint":"Qua", @@ -2251,7 +2291,8 @@ "in_mi":"Trong %1$s dặm", "in_ft":"Trong %1$s ft", "for_mi":"Khoảng %1$s dặm", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "zh_CN":{ "via_hint":"途经点", @@ -2306,7 +2347,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "zh_HK":{ "via_hint":"途經", @@ -2361,7 +2403,8 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }, "zh_TW":{ "via_hint":"途經", @@ -2416,5 +2459,6 @@ "in_mi":"", "in_ft":"", "for_mi":"", -"warning":"" +"warning":"", +"accept_risks_after_warning":"" }} \ No newline at end of file From be4ac5405817f34e64154d57097260d219219f48 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 20 Dec 2021 08:39:58 +0100 Subject: [PATCH 094/322] fix translation --- src/translation/tr.json | 572 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 528 insertions(+), 44 deletions(-) diff --git a/src/translation/tr.json b/src/translation/tr.json index 0d92a032..3def5343 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -41,7 +41,18 @@ "route_request_failed":"Route request failed", "current_location":"Current Location", "searching_location":"Searching location", -"searching_location_failed":"Searching location failed" +"searching_location_failed":"Searching location failed", +"in_km_singular":"In 1 kilometer", +"in_km":"In %1$s kilometers", +"in_m":"In %1$s meters", +"for_km":"for %1$s kilometers", +"then":"then", +"in_mi_singular":"In 1 mile", +"in_mi":"In %1$s miles", +"in_ft":"In %1$s feet", +"for_mi":"for %1$s miles", +"warning":"WARNING: This application is highly experimental! Use at your own risk!", +"accept_risks_after_warning":"I understand and agree" }, "ar":{ "via_hint":"خلال", @@ -86,7 +97,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "ast":{ "via_hint":"Pasando per", @@ -131,7 +153,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "bg":{ "via_hint":"през", @@ -176,7 +209,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "bn_BN":{ "via_hint":"", @@ -221,7 +265,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "ca":{ "via_hint":"Passant per", @@ -266,7 +321,18 @@ "route_request_failed":"Ha fallat la resolució de la ruta.", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"En un quilòmetre", +"in_km":"En %1$s quilòmetres", +"in_m":"En %1$s metres", +"for_km":"per %1$s quilòmetres", +"then":"després", +"in_mi_singular":"En una milla", +"in_mi":"En %1$s milles", +"in_ft":"En %1$s peus", +"for_mi":"per %1$s milles", +"warning":"", +"accept_risks_after_warning":"" }, "cs_CZ":{ "via_hint":"Přes ", @@ -311,7 +377,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "da_DK":{ "via_hint":"Via", @@ -356,7 +433,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "de_DE":{ "via_hint":"Über", @@ -401,7 +489,18 @@ "route_request_failed":"Route konnte nicht berechnet werden", "current_location":"Aktueller Standort", "searching_location":"Suche Standort", -"searching_location_failed":"Standortsuche fehlgeschlagen" +"searching_location_failed":"Standortsuche fehlgeschlagen", +"in_km_singular":"In 1 Kilometer", +"in_km":"In %1$s Kilometern", +"in_m":"In %1$s Metern", +"for_km":"für %1$s Kilometer", +"then":"dann", +"in_mi_singular":"In 1 Meile", +"in_mi":"In %1$s Meilen", +"in_ft":"In %1$s Fuß", +"for_mi":"für %1$s Meilen", +"warning":"", +"accept_risks_after_warning":"" }, "el":{ "via_hint":"Μέσω", @@ -446,7 +545,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "eo":{ "via_hint":"Tra", @@ -491,7 +601,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "es":{ "via_hint":"Pasando por", @@ -536,7 +657,18 @@ "route_request_failed":"Solicitud de ruta fallida", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"En un kilómetro", +"in_km":"En %1$s kilómetros", +"in_m":"En %1$s metros", +"for_km":"por %1$s kilómetros", +"then":"luego", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "fa":{ "via_hint":"با گذر از", @@ -581,7 +713,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "fil":{ "via_hint":"", @@ -626,7 +769,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "fi":{ "via_hint":"Reittipiste", @@ -671,7 +825,18 @@ "route_request_failed":"Reittipyyntö epäonnistui", "current_location":"Nykyinen paikka", "searching_location":"Paikkaa haetaan", -"searching_location_failed":"Paikan haku epäonnistui" +"searching_location_failed":"Paikan haku epäonnistui", +"in_km_singular":"Kilometrin päässä", +"in_km":"%1$s kilometrin päässä", +"in_m":"%1$s metrin päässä", +"for_km":"kulje %1$s kilometriä", +"then":"sen jälkeen", +"in_mi_singular":"Mailin päässä", +"in_mi":"%1$s mailin päässä", +"in_ft":"%1$s jalan päässä", +"for_mi":"kulje %1$s mailia", +"warning":"VAROITUS: Tämä sovellus on erittäin kokeellinen! Käytä omalla vastuullasi!", +"accept_risks_after_warning":"Ymmärrän ja hyväksyn" }, "fr_FR":{ "via_hint":"Via", @@ -716,7 +881,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "fr_CH":{ "via_hint":"Via", @@ -761,7 +937,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "gl":{ "via_hint":"Vía", @@ -806,7 +993,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "he":{ "via_hint":"דרך", @@ -851,7 +1049,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "hr_HR":{ "via_hint":"Preko", @@ -896,7 +1105,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "hsb":{ "via_hint":"přez", @@ -941,7 +1161,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "hu_HU":{ "via_hint":"Ezen keresztül", @@ -986,7 +1217,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "in_ID":{ "via_hint":"melalui", @@ -1031,7 +1273,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "it":{ "via_hint":"attraverso", @@ -1076,7 +1329,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "ja":{ "via_hint":"経由", @@ -1121,7 +1385,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "ko":{ "via_hint":"경유", @@ -1166,7 +1441,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "lt_LT":{ "via_hint":"Per", @@ -1211,7 +1497,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"Už 1 kilometro", +"in_km":"Už %1$s kilometrų", +"in_m":"Už %1$s metrų", +"for_km":"%1$s kilometrus", +"then":"tada", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "ne":{ "via_hint":"बाट", @@ -1256,7 +1553,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "nl":{ "via_hint":"via", @@ -1301,7 +1609,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"Over 1 kilometer", +"in_km":"Over %1$s kilometer", +"in_m":"Over %1$s meter", +"for_km":"Voor %1$s kilometer", +"then":"dan", +"in_mi_singular":"Over 1 mijl", +"in_mi":"Over %1$s mijl", +"in_ft":"Over %1$s voet", +"for_mi":"Voor %1$s mijl", +"warning":"", +"accept_risks_after_warning":"" }, "pl_PL":{ "via_hint":"Przez", @@ -1346,7 +1665,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "pt_BR":{ "via_hint":"Via", @@ -1391,7 +1721,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "pt_PT":{ "via_hint":"Por", @@ -1436,7 +1777,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "ro":{ "via_hint":"Prin", @@ -1481,7 +1833,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "ru":{ "via_hint":"Через", @@ -1526,7 +1889,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"В 1 километре", +"in_km":"В %1$s километрах", +"in_m":"В %1$s метрах", +"for_km":"За %1$s километрах", +"then":"Затем", +"in_mi_singular":"В 1 миле", +"in_mi":"В %1$s милях", +"in_ft":"В %1$s футах", +"for_mi":"В %1$s милях", +"warning":"", +"accept_risks_after_warning":"" }, "sk":{ "via_hint":"Cez", @@ -1571,7 +1945,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "sl_SI":{ "via_hint":"Preko", @@ -1616,7 +2001,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "sr_RS":{ "via_hint":"Preko", @@ -1661,7 +2057,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "sv_SE":{ "via_hint":"Via", @@ -1706,7 +2113,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "tr":{ "via_hint":"Yoluyla", @@ -1751,7 +2169,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "uk":{ "via_hint":"через", @@ -1796,7 +2225,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "vi_VN":{ "via_hint":"Qua", @@ -1841,7 +2281,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"Trong 1 km", +"in_km":"Trong %1$s km", +"in_m":"Trong %1$s m", +"for_km":"Khoảng %1$s km", +"then":"Gần đó", +"in_mi_singular":"Trong 1 dặm", +"in_mi":"Trong %1$s dặm", +"in_ft":"Trong %1$s ft", +"for_mi":"Khoảng %1$s dặm", +"warning":"", +"accept_risks_after_warning":"" }, "zh_CN":{ "via_hint":"途经点", @@ -1886,7 +2337,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "zh_HK":{ "via_hint":"途經", @@ -1931,7 +2393,18 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }, "zh_TW":{ "via_hint":"途經", @@ -1976,5 +2449,16 @@ "route_request_failed":"", "current_location":"", "searching_location":"", -"searching_location_failed":"" +"searching_location_failed":"", +"in_km_singular":"", +"in_km":"", +"in_m":"", +"for_km":"", +"then":"", +"in_mi_singular":"", +"in_mi":"", +"in_ft":"", +"for_mi":"", +"warning":"", +"accept_risks_after_warning":"" }} \ No newline at end of file From e2c228b04fabe46229e37a3d0493f87206c1876f Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 20 Dec 2021 08:40:06 +0100 Subject: [PATCH 095/322] make debug info larger --- src/turnNavigation/TurnNavigation.module.css | 2 +- src/turnNavigation/TurnNavigation.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 66a7da0b..966cb861 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -47,7 +47,7 @@ } .debug { - font-size: x-small; + font-size: smaller; float: right; } diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 0e414188..c8ae0420 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -128,7 +128,7 @@ export default function ({path, location, turnNaviState}: TurnNavigationProps) { { maxSpeed != null ?
{Math.round(maxSpeed)}
: null } { showDebug ?
-
s={estimatedAvgSpeed}
+
{estimatedAvgSpeed}
{surface}
{roadClass}
: null From fda5dd835194b1ca0a8fe774384e459537d153b3 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 20 Dec 2021 08:45:21 +0100 Subject: [PATCH 096/322] minor style --- src/sidebar/RoutingResult.module.css | 4 ++++ src/sidebar/RoutingResults.tsx | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/sidebar/RoutingResult.module.css b/src/sidebar/RoutingResult.module.css index 9c27dca9..f48e8463 100644 --- a/src/sidebar/RoutingResult.module.css +++ b/src/sidebar/RoutingResult.module.css @@ -95,6 +95,10 @@ This is not a very nice duplication but I have to stop now... animation-delay: 0.25s; } +.warning { + padding: 5px; +} + .acceptRiskButton { float: right; color: #2a2b31; diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 44c7fc55..1a98fbfb 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -48,7 +48,7 @@ function RoutingResult({ path, isSelected, turnNaviState }: { path: Path; isSele {!turnNaviState.acceptedRisk && !turnNaviState.fakeGPS ? (!showRisk ? setShowRisk(true)} src={startNavigation}/> - :
+ :
{tr("warning")}
{ Dispatcher.dispatch(new TurnNavigationUpdate({acceptedRisk: true} as TurnNavigationState)) From d0119c5680dbe0d14662186aa9c5d421661b9f26 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 5 Feb 2022 14:42:43 +0100 Subject: [PATCH 097/322] path details sometimes to late, bug fix --- src/turnNavigation/GeoMethods.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 7ca30152..9d629e0f 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -31,7 +31,7 @@ export function getCurrentDetails(path: Path, location: Coordinate, details: [an let detailOnPath = details[i] for (let d = 0; d < detailOnPath.length; d++) { let [from, to, val] = detailOnPath[d]; - if (foundIndex >= from && foundIndex <= to) { + if (foundIndex >= from && foundIndex < to || foundIndex == to && d + 1 == detailOnPath.length) { result.push(val) break } From 901b9da478e43cd71ad29c546a87067ec6b9dbfe Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 16 Oct 2022 18:04:40 +0200 Subject: [PATCH 098/322] first working version --- src/App.tsx | 27 ++++++++++++++++-- src/map/map.ts | 4 +-- src/sidebar/RoutingResults.tsx | 14 ++++++++- src/sidebar/navigation.svg | 1 + src/sidebar/start_turn_navigation.png | Bin 1935 -> 0 bytes src/stores/LocationStore.ts | 38 +++++++++++++------------ src/stores/MapActionReceiver.ts | 5 +++- src/turnNavigation/GeoMethods.ts | 9 ++++++ src/turnNavigation/TurnNavigation.tsx | 19 +++++-------- test/turnNavigation/GeoMethods.test.ts | 24 +++++++++++++++- 10 files changed, 103 insertions(+), 38 deletions(-) create mode 100644 src/sidebar/navigation.svg delete mode 100644 src/sidebar/start_turn_navigation.png diff --git a/src/App.tsx b/src/App.tsx index c893b446..ad7d5aa5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -10,7 +10,8 @@ import { getPathDetailsStore, getQueryStore, getRouteStore, - getSettingsStore, getTurnNavigationStore, + getSettingsStore, + getTurnNavigationStore, } from '@/stores/Stores' import MapComponent from '@/map/MapComponent' import {ApiInfo} from '@/api/graphhopper' @@ -25,7 +26,6 @@ import {MapOptionsStoreState} from '@/stores/MapOptionsStore' import {ErrorStoreState} from '@/stores/ErrorStore' import Search from '@/sidebar/search/Search' import ErrorMessage from '@/sidebar/ErrorMessage' -import createCurrentLocationLayer from '@/layers/CurrentLocationLayer' import {LocationStoreState} from './stores/LocationStore' import {TurnNavigationState} from "@/stores/TurnNavigationStore"; import useBackgroundLayer from '@/layers/UseBackgroundLayer' @@ -43,6 +43,12 @@ import useUrbanDensityLayer from '@/layers/UseUrbanDensityLayer' import useMapBorderLayer from '@/layers/UseMapBorderLayer' import {ShowDistanceInMilesContext} from '@/ShowDistanceInMilesContext' import RoutingProfiles from '@/sidebar/search/routingProfiles/RoutingProfiles' +import {TurnNavigationUpdate} from "@/actions/Actions"; +import Dispatcher from "@/stores/Dispatcher"; +import VolumeUpIcon from "@/turnNavigation/volume_up.svg"; +import VolumeOffIcon from "@/turnNavigation/volume_off.svg"; +import PlainButton from "@/PlainButton"; +import TurnNavigation from "@/turnNavigation/TurnNavigation"; export const POPUP_CONTAINER_ID = 'popup-container' export const SIDEBAR_CONTENT_ID = 'sidebar-content' @@ -166,7 +172,22 @@ interface LayoutProps { turnNaviState: TurnNavigationState } -function LargeScreenLayout({query, route, map, error, mapOptions, info}: LayoutProps) { +function LargeScreenLayout({query, route, map, error, mapOptions, info, location, turnNaviState}: LayoutProps) { + if(location.turnNavigation) + return <> +
+ +
+
+ Dispatcher.dispatch(new TurnNavigationUpdate({soundEnabled: !turnNaviState.soundEnabled} as TurnNavigationState))}> + {turnNaviState.soundEnabled ? : } + +
+
+ +
+ + return ( <>
diff --git a/src/map/map.ts b/src/map/map.ts index cb52637f..f24a9583 100644 --- a/src/map/map.ts +++ b/src/map/map.ts @@ -9,14 +9,14 @@ let map: Map | undefined export function createMap(): Map { map = new Map({ view: new View({ - enableRotation: false, + enableRotation: true, multiWorld: false, constrainResolution: true, center: fromLonLat([10, 10]), zoom: 2, }), controls: defaultControls({ - zoom: false, + zoom: true, attribution: true, attributionOptions: { collapsible: false, diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index f7716b97..deb8cf6b 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -3,10 +3,11 @@ import { CurrentRequest, RequestState, SubRequest } from '@/stores/QueryStore' import styles from './RoutingResult.module.css' import React, { useContext, useEffect, useState } from 'react' import Dispatcher from '@/stores/Dispatcher' -import { SetSelectedPath } from '@/actions/Actions' +import {SetSelectedPath, TurnNavigationUpdate} from '@/actions/Actions' import { metersToText, milliSecondsToText } from '@/Converters' import PlainButton from '@/PlainButton' import Details from '@/sidebar/list.svg' +import NaviSVG from '@/sidebar/navigation.svg' import GPXDownload from '@/sidebar/file_download.svg' import Instructions from '@/sidebar/instructions/Instructions' import { Position } from 'geojson' @@ -14,6 +15,8 @@ import { useMediaQuery } from 'react-responsive' import { tr } from '@/translation/Translation' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import { ApiImpl } from '@/api/Api' +import {TurnNavigationState} from "@/stores/TurnNavigationStore"; +import {getLocationStore} from "@/stores/Stores"; export interface RoutingResultsProps { paths: Path[] @@ -45,6 +48,7 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: const hasBorderCrossed = crossesBorder(path.details.country) const showDistanceInMiles = useContext(ShowDistanceInMilesContext) + let [showRisk, setShowRisk] = useState(false) return (
@@ -71,6 +75,14 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: )}
+ {isSelected && ( + getLocationStore().initFake() /* : getLocationStore().initReal()*/}> + +
{tr('Navi')}
+
+ )} {isSelected && ( \ No newline at end of file diff --git a/src/sidebar/start_turn_navigation.png b/src/sidebar/start_turn_navigation.png deleted file mode 100644 index dffd8340ae81fe5badf07cdc147b3cb64abf7f8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1935 zcmV;A2XOd_P)EX>4Tx04R}tkv&MmKpe$iTT6>n6wDyvkfAzR5EXIMDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1lefMBD_G^=Y2&~)3( zq>^GTzamCn5r%+1L=l&nWz0%a8ouM}9s$1IC3u$qxj#pbTCf-p5Q%4)VcNvaEL z!FiupU}ae)J|`YE>4LKlt6PRh$_2l4409{Ngwt!$4#gXx1I)``B@sCqU>KxYFDHjRr9NNqW7l z#gBmAZQ$a%ttorJeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00n1BL_t(&-nE*)i(N$&$3JuPT!Ip@@kc~(A8$d|LJMWH z#%RPs1yO7S!6I6SSo$y6r?Cntv{10I5JZF&79v3-5iuBr%_>4LQB1Q*Fl@|@Mb2Gk z=gp6E?%W-C?7nyJ%$%9;Ip6c0AI^JESe$d6_kN2)DZMk~S^RtWU1LwR-*}K=1#Jh` zk{g7zKlP*mqcl9$pu^t)w0)KAQn_aMJvVcu`nl)fKwA2#g-Fs}hoVuN`I;BRgANBj z)TOgAIkwyFMqFD;XK~db#XReVKDF<5L&!iAhqY(9zm`eSrWU8oleOSBbh=N%WMgb5 z&%NJi8!dI_z28y}Z~=H6Se5^isOKiF^lr(;E0Ukj17}kVYR!!) zTSHqW7DZAUP{|7fxfS4P`T1+-+&S<4W-3o=yeXcP(5CR+u2i{ZxRDKKz+qr2pToec zmBBUcnq|wHN=Y@`tD9Km2#Tw~Az+Vu4gm*p-ZTco_BM1iSFo^M7}pWfGvFyfurJ$a z);wb<+I^dymc3GcbGkH|h>0N9qu7^iG<&Aikj{`vP$%LTp&qpy;z7qfii?S67vAf#wiNnBx@h{Z==m0fPY{qvpzv*t8O#hEuvB z`AIV&L0*hwF)n>XK@MT`fdn{ zG1D$-G-+wyHmu)SD%S$M0mV5Ll#0#DDkuAH^BzvrXbXySOly&NB`~@X^J6QDMNM1d z4OL7I$xj(|vp9ldBvnvJ+m?u_s(5mh6YIs2Mr}cJuXU#&t9Y~`J@Z>>rO_IjE%E)o z;;~kWK4YU8qM2QxD7?$I3Q0-3K;rENiq-XIjTEaXL`yco-p$x3rq-K#hpv{oQqEE6 z#w9UgH&BexoHoh2oHi_xlFaOi5yeg53~&nAu%a3FQ+Y@as0FMCg2+EfW?fnaU zAQM%zInmF2g?L~_6t{q1f#bl-zz||BxS9alkbIx55 za`_&35qK21HDcPYoOA2m`%TqCUPC$s6mJ0MfMdW*z`Zs1(ZrLWdN=SK@E-7s#AFuD zVxJn)$;9Gcz^A~QzyqQ+JFELE20Ig0{RFs}ip|Re!X}P@U5hU6Wly4zC5>i4Ytww3 zuH8)1zOP-RTlb($#{^n8wC?g*jsb?ezoRdVXOv^Ow&l+Gkh^~BQ!UMgv-PMibN!{L zZA6HKg002ovPDHLkV1m!wlV<<` diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index cc48aec7..412e5cbd 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -1,12 +1,13 @@ import {Coordinate} from '@/stores/QueryStore' import Store from '@/stores/Store' -import {ErrorAction, LocationUpdate} from '@/actions/Actions' +import {ErrorAction, LocationUpdate, SetPoint, ZoomMapToPoint} from '@/actions/Actions' import Dispatcher, {Action} from '@/stores/Dispatcher' import NoSleep from 'nosleep.js' import {SpeechSynthesizer} from '@/SpeechSynthesizer' import {ApiImpl} from '@/api/Api' -import {calcOrientation} from '@/turnNavigation/GeoMethods' +import {calcOrientation, toNorthBased} from '@/turnNavigation/GeoMethods' import * as config from 'config' +import {toDegrees} from "ol/math"; export interface LocationStoreState { turnNavigation: boolean @@ -38,7 +39,7 @@ export default class LocationStore extends Store { reduce(state: LocationStoreState, action: Action): LocationStoreState { if (action instanceof LocationUpdate) { - console.log('LocationUpdate action {}', action.location) + // console.log('LocationUpdate action {}', action.location) return action.location } return state @@ -66,20 +67,21 @@ export default class LocationStore extends Store { let latlon: number[][] = new Array(coords.length) for (let idx = 0; idx < coords.length; idx++) { - // very ugly: in JS it is not initializable with a seed - let lat = coords[idx][1] + 0.0001 * Math.random(), // approx +-5m ? - lon = coords[idx][0] + 0.0001 * Math.random() - let heading = 180 + // very ugly: in JS the random object cannot be initialed with a seed + const lat = coords[idx][1] // + 0.0001 * Math.random() // approx +-5m ? + const lon = coords[idx][0] // + 0.0001 * Math.random() + let heading = 0 if (idx > 0) { - let prevLat = coords[idx - 1][1], - prevLon = coords[idx - 1][0] - heading = ((3 * Math.PI) / 2 - calcOrientation(lat, lon, prevLat, prevLon)) * 57.29577951308232 // factor 57.29... to convert radion to degrees + const prevLat = coords[idx - 1][1] + const prevLon = coords[idx - 1][0] + let o = calcOrientation(lat, lon, prevLat, prevLon); + heading = Math.PI - toNorthBased(o) } latlon[idx] = [lat, lon, heading, 4] } let currentIndex: number = 0 - this.locationUpdate({ + LocationStore.locationUpdate({ coords: { latitude: latlon[currentIndex][0], longitude: latlon[currentIndex][1], @@ -91,8 +93,8 @@ export default class LocationStore extends Store { this.interval = setInterval(() => { currentIndex++ currentIndex %= latlon.length - console.log(currentIndex) - this.locationUpdate({ + // console.log(currentIndex) + LocationStore.locationUpdate({ coords: { latitude: latlon[currentIndex][0], longitude: latlon[currentIndex][1], @@ -103,7 +105,7 @@ export default class LocationStore extends Store { }, 3000) } - private locationUpdate(pos: any) { + private static locationUpdate(pos: any) { // TODO NOW: 'this is undefined' if called from watchPosition: if (!this.started) return let c = {lat: pos.coords.latitude, lng: pos.coords.longitude} @@ -111,7 +113,7 @@ export default class LocationStore extends Store { let bearing: number = pos.coords.heading if (Number.isNaN(bearing)) console.log('skip dispatching SetViewportToPoint because bearing is ' + bearing) - // TODO NOW else Dispatcher.dispatch(new SetViewportToPoint(c, 17, 50, bearing)) + else Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, bearing)) } public initReal() { @@ -132,7 +134,7 @@ export default class LocationStore extends Store { enableHighAccuracy: true } this.watchId = navigator.geolocation.watchPosition( - this.locationUpdate, + LocationStore.locationUpdate, err => { if (this.started) Dispatcher.dispatch(new ErrorAction('location watch error: ' + err.message)) }, @@ -143,13 +145,13 @@ export default class LocationStore extends Store { let requestFullscreenFct = el.requestFullscreen requestFullscreenFct.call(el) } catch (e) { - console.log(e) + console.log("error requesting full screen " + JSON.stringify(e)) } } } public stop() { - console.log('LocationStore.stop', this.watchId, this.interval) + // console.log('LocationStore.stop', this.watchId, this.interval) if (document.fullscreenElement) document.exitFullscreen() this.started = false diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 2a18010a..af986116 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -12,6 +12,7 @@ import { } from '@/actions/Actions' import RouteStore from '@/stores/RouteStore' import { Bbox } from '@/api/graphhopper' +import {between} from "ol/format/filter"; export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -38,8 +39,10 @@ export default class MapActionReceiver implements ActionReceiver { 'noopener,noreferrer' ) } else if (action instanceof ZoomMapToPoint) { - this.map.getView().setCenter(fromLonLat([action.coordinate.lng, action.coordinate.lat])) + console.log("bearing: " + action.bearing*180/Math.PI) this.map.getView().setZoom(action.zoom) + this.map.getView().setRotation(action.bearing) + this.map.getView().setCenter(fromLonLat([action.coordinate.lng, action.coordinate.lat])) } else if (action instanceof RouteRequestSuccess) { // this assumes that always the first path is selected as result. One could use the // state of the routeStore as well, but then we would have to make sure that the route diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 9d629e0f..b1943060 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -1,5 +1,6 @@ import {Instruction, Path} from '@/api/graphhopper' import {Coordinate} from '@/stores/QueryStore' +import {or} from "ol/format/filter"; export function getCurrentDetails(path: Path, location: Coordinate, details: [any, any, any][][]): number[] { let smallestDist = Number.MAX_VALUE @@ -193,7 +194,15 @@ function calcCrossingPointToEdge( return {lat: c_lat, lng: c_lon / shrinkFactor} } +// returns orientation in interval -pi to +pi where 0 is east export function calcOrientation(lat1: number, lon1: number, lat2: number, lon2: number): number { let shrinkFactor = Math.cos(toRadians((lat1 + lat2) / 2)) return Math.atan2(lat2 - lat1, shrinkFactor * (lon2 - lon1)) } + +// convert east-based radians into north based +export function toNorthBased(orientation: number): number { + orientation = orientation >= 0 ? (5 * Math.PI / 2 - orientation) : ( Math.PI/2 - orientation) + // modulo with decimals seems to work too!? orientation % (2 * Math.PI) + return orientation > 2 * Math.PI? orientation - 2 * Math.PI : orientation; +} \ No newline at end of file diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 1a773269..445a2060 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -18,21 +18,21 @@ type TurnNavigationProps = { export default function ({path, location, turnNaviState}: TurnNavigationProps) { let currentLocation = location.coordinate - if (currentLocation.lat == 0 && currentLocation.lng == 0) return Searching GPS... const {instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance} = getCurrentInstruction( path.instructions, currentLocation ) + // TODO NOW we have to move this below the useEffect methods etc as react doesn't like conditional creation of these + // TODO too far from route - recalculate? + if (instructionIndex < 0) return <>Cannot find instruction + let [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, currentLocation, [path.details.average_speed, path.details.max_speed, path.details.surface, path.details.road_class]); estimatedAvgSpeed = Math.round(estimatedAvgSpeed) - console.log('remaining distance: ' + remainingDistance + ', time: ' + remainingTime + ', avg: ' + estimatedAvgSpeed + ", max: " + maxSpeed) - - // TODO too far from route - recalculate? - if (instructionIndex < 0) return <>Cannot find instruction + // console.log('remaining distance: ' + remainingDistance + ', time: ' + remainingTime + ', avg: ' + estimatedAvgSpeed + ", max: " + maxSpeed) const nextInstruction: Instruction = path.instructions[instructionIndex] @@ -50,12 +50,7 @@ export default function ({path, location, turnNaviState}: TurnNavigationProps) { // speak text out loud after render only if index changed and distance is close next instruction useEffect(() => { - console.log( - 'useEffect', - state, - {index: instructionIndex, distanceToNext: distanceToNext}, - nextInstruction.text - ) + // console.log('useEffect', state, {index: instructionIndex, distanceToNext: distanceToNext}, nextInstruction.text) let text = nextInstruction.street_name if (turnNaviState.soundEnabled) { @@ -80,7 +75,7 @@ export default function ({path, location, turnNaviState}: TurnNavigationProps) { ) { let inString = distanceToNext > 800 ? tr('in_km_singular') : tr("in_m", ["" + Math.round(distanceToNext / 100) * 100]) - console.log(inString + ' ' + nextInstruction.text) + // console.log(inString + ' ' + nextInstruction.text) getLocationStore() .getSpeechSynthesizer() .synthesize(inString + ' ' + nextInstruction.text) diff --git a/test/turnNavigation/GeoMethods.test.ts b/test/turnNavigation/GeoMethods.test.ts index fd1574ea..b3b1502f 100644 --- a/test/turnNavigation/GeoMethods.test.ts +++ b/test/turnNavigation/GeoMethods.test.ts @@ -1,4 +1,4 @@ -import { getCurrentInstruction } from '../../src/turnNavigation/GeoMethods' +import {calcOrientation, getCurrentInstruction, toNorthBased} from '../../src/turnNavigation/GeoMethods' import Dispatcher from '../../src/stores/Dispatcher' import { ApiImpl } from '../../src/api/Api' @@ -35,4 +35,26 @@ describe('calculate instruction', () => { expect(Math.round(remainingTime / 1000)).toEqual(101) expect(Math.round(remainingDistance)).toEqual(578) }) + + it('calc angle', () => { + // downwards+west + expect(Math.round(toDegrees(calcOrientation(51.439146,14.245258, 51.438908,14.245931)))).toEqual(-30) + expect(Math.round(toDegrees(toNorthBased(calcOrientation(51.439146,14.245258, 51.438908,14.245931))))).toEqual(120) + // downwards + expect(Math.round(toDegrees(calcOrientation(51.439146,14.245258, 51.438748,14.245255)))).toEqual(-90) + expect(Math.round(toDegrees(toNorthBased(calcOrientation(51.439146,14.245258, 51.438748,14.245255))))).toEqual(180) + // down+west + expect(Math.round(toDegrees(calcOrientation(51.439146,14.245258, 51.439015,14.244568)))).toEqual(-163) + expect(Math.round(toDegrees(toNorthBased(calcOrientation(51.439146,14.245258, 51.439015,14.244568))))).toEqual(253) + // upward+west + expect(Math.round(toDegrees(calcOrientation(51.439146,14.245258, 51.43953,14.244536)))).toEqual(140) + expect(Math.round(toDegrees(toNorthBased(calcOrientation(51.439146,14.245258, 51.43953,14.244536))))).toEqual(310) + // upward+east + expect(Math.round(toDegrees(calcOrientation(51.439146,14.245258, 51.439584,14.24592)))).toEqual(47) + expect(Math.round(toDegrees(toNorthBased(calcOrientation(51.439146,14.245258, 51.439584,14.24592))))).toEqual(43) + }) + + function toDegrees(radian:number) { + return radian/Math.PI*180.0 + } }) From 94b6656dbed4c897c48f2c4bab619210cc11325c Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 16 Oct 2022 18:22:28 +0200 Subject: [PATCH 099/322] animate rotation --- src/stores/MapActionReceiver.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index af986116..c570c0df 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -39,10 +39,13 @@ export default class MapActionReceiver implements ActionReceiver { 'noopener,noreferrer' ) } else if (action instanceof ZoomMapToPoint) { - console.log("bearing: " + action.bearing*180/Math.PI) - this.map.getView().setZoom(action.zoom) - this.map.getView().setRotation(action.bearing) - this.map.getView().setCenter(fromLonLat([action.coordinate.lng, action.coordinate.lat])) + // console.log("bearing: " + action.bearing*180/Math.PI) + this.map.getView().animate({ + zoom: action.zoom, + center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), + rotation: action.bearing, + duration: 1000, + }); } else if (action instanceof RouteRequestSuccess) { // this assumes that always the first path is selected as result. One could use the // state of the routeStore as well, but then we would have to make sure that the route From 828f83937f56d279113117ded01366088b559eba Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 16 Oct 2022 19:02:16 +0200 Subject: [PATCH 100/322] show current location --- src/App.tsx | 115 +++++++++++-------- src/Converters.ts | 8 +- src/NavBar.ts | 1 - src/actions/Actions.ts | 29 ++--- src/index.tsx | 43 ++++--- src/layers/CurrentLocationLayer.tsx | 88 ++++++++------ src/map/Popup.tsx | 10 +- src/sidebar/RoutingResults.tsx | 9 +- src/stores/LocationStore.ts | 34 +++--- src/stores/MapActionReceiver.ts | 4 +- src/stores/Stores.ts | 2 +- src/stores/TurnNavigationStore.ts | 12 +- src/turnNavigation/GeoMethods.ts | 30 ++--- src/turnNavigation/TurnNavigation.module.css | 5 +- src/turnNavigation/TurnNavigation.tsx | 81 +++++++------ test/turnNavigation/GeoMethods.test.ts | 36 +++--- 16 files changed, 275 insertions(+), 232 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index ad7d5aa5..1c04e6eb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import React, {useEffect, useState} from 'react' +import React, { useEffect, useState } from 'react' import PathDetails from '@/pathDetails/PathDetails' import styles from './App.module.css' import { @@ -14,41 +14,42 @@ import { getTurnNavigationStore, } from '@/stores/Stores' import MapComponent from '@/map/MapComponent' -import {ApiInfo} from '@/api/graphhopper' +import { ApiInfo } from '@/api/graphhopper' import MapOptions from '@/map/MapOptions' import MobileSidebar from '@/sidebar/MobileSidebar' -import {useMediaQuery} from 'react-responsive' +import { useMediaQuery } from 'react-responsive' import RoutingResults from '@/sidebar/RoutingResults' import PoweredBy from '@/sidebar/PoweredBy' -import {QueryStoreState, RequestState} from '@/stores/QueryStore' -import {RouteStoreState} from '@/stores/RouteStore' -import {MapOptionsStoreState} from '@/stores/MapOptionsStore' -import {ErrorStoreState} from '@/stores/ErrorStore' +import { QueryStoreState, RequestState } from '@/stores/QueryStore' +import { RouteStoreState } from '@/stores/RouteStore' +import { MapOptionsStoreState } from '@/stores/MapOptionsStore' +import { ErrorStoreState } from '@/stores/ErrorStore' import Search from '@/sidebar/search/Search' import ErrorMessage from '@/sidebar/ErrorMessage' -import {LocationStoreState} from './stores/LocationStore' -import {TurnNavigationState} from "@/stores/TurnNavigationStore"; +import { LocationStoreState } from './stores/LocationStore' +import { TurnNavigationState } from '@/stores/TurnNavigationStore' import useBackgroundLayer from '@/layers/UseBackgroundLayer' import useQueryPointsLayer from '@/layers/UseQueryPointsLayer' import usePathsLayer from '@/layers/UsePathsLayer' import ContextMenu from '@/layers/ContextMenu' import usePathDetailsLayer from '@/layers/UsePathDetailsLayer' import PathDetailPopup from '@/layers/PathDetailPopup' -import {Map} from 'ol' -import {getMap} from '@/map/map' +import { Map } from 'ol' +import { getMap } from '@/map/map' import CustomModelBox from '@/sidebar/CustomModelBox' import useRoutingGraphLayer from '@/layers/UseRoutingGraphLayer' import MapFeaturePopup from '@/layers/MapFeaturePopup' import useUrbanDensityLayer from '@/layers/UseUrbanDensityLayer' import useMapBorderLayer from '@/layers/UseMapBorderLayer' -import {ShowDistanceInMilesContext} from '@/ShowDistanceInMilesContext' +import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import RoutingProfiles from '@/sidebar/search/routingProfiles/RoutingProfiles' -import {TurnNavigationUpdate} from "@/actions/Actions"; -import Dispatcher from "@/stores/Dispatcher"; -import VolumeUpIcon from "@/turnNavigation/volume_up.svg"; -import VolumeOffIcon from "@/turnNavigation/volume_off.svg"; -import PlainButton from "@/PlainButton"; -import TurnNavigation from "@/turnNavigation/TurnNavigation"; +import { TurnNavigationUpdate } from '@/actions/Actions' +import Dispatcher from '@/stores/Dispatcher' +import VolumeUpIcon from '@/turnNavigation/volume_up.svg' +import VolumeOffIcon from '@/turnNavigation/volume_off.svg' +import PlainButton from '@/PlainButton' +import TurnNavigation from '@/turnNavigation/TurnNavigation' +import useCurrentLocationLayer from '@/layers/CurrentLocationLayer' export const POPUP_CONTAINER_ID = 'popup-container' export const SIDEBAR_CONTENT_ID = 'sidebar-content' @@ -122,17 +123,15 @@ export default function App() { usePathsLayer(map, route.routingResult.paths, route.selectedPath) useQueryPointsLayer(map, query.queryPoints) usePathDetailsLayer(map, pathDetails) + useCurrentLocationLayer(map, location.coordinate) - // if (location.coordinate.lat != 0 && location.coordinate.lng != 0) - // mapLayers.push(createCurrentLocationLayer(location.coordinate)) - - const isSmallScreen = useMediaQuery({query: '(max-width: 44rem)'}) + const isSmallScreen = useMediaQuery({ query: '(max-width: 44rem)' }) return (
- - - + + + {isSmallScreen ? ( -
- -
-
- Dispatcher.dispatch(new TurnNavigationUpdate({soundEnabled: !turnNaviState.soundEnabled} as TurnNavigationState))}> - {turnNaviState.soundEnabled ? : } - -
-
- -
- +function LargeScreenLayout({ query, route, map, error, mapOptions, info, location, turnNaviState }: LayoutProps) { + if (location.turnNavigation) + return ( + <> +
+ +
+
+ + Dispatcher.dispatch( + new TurnNavigationUpdate({ + soundEnabled: !turnNaviState.soundEnabled, + } as TurnNavigationState) + ) + } + > + {turnNaviState.soundEnabled ? ( + + ) : ( + + )} + +
+
+ +
+ + ) return ( <> @@ -204,8 +217,8 @@ function LargeScreenLayout({query, route, map, error, mapOptions, info, location initialCustomModelStr={query.initialCustomModelStr} queryOngoing={query.currentRequest.subRequests[0]?.state === RequestState.SENT} /> - -
{!error.isDismissed && }
+ +
{!error.isDismissed && }
- +
-
+
- +
- +
) } -function SmallScreenLayout({query, route, map, error, mapOptions, info, location, turnNaviState}: LayoutProps) { +function SmallScreenLayout({ query, route, map, error, mapOptions, info, location, turnNaviState }: LayoutProps) { return ( <>
- +
- +
@@ -257,8 +270,8 @@ function SmallScreenLayout({query, route, map, error, mapOptions, info, location
- +
) -} \ No newline at end of file +} diff --git a/src/Converters.ts b/src/Converters.ts index 4a78acc5..e46f0701 100644 --- a/src/Converters.ts +++ b/src/Converters.ts @@ -1,6 +1,6 @@ -import {GeocodingHit} from '@/api/graphhopper' +import { GeocodingHit } from '@/api/graphhopper' -import {Coordinate} from '@/stores/QueryStore' +import { Coordinate } from '@/stores/QueryStore' export function milliSecondsToText(seconds: number) { const hours = Math.floor(seconds / 3600000) @@ -11,8 +11,8 @@ export function milliSecondsToText(seconds: number) { return hourText + ' ' + minutes + ' min' } -const distanceFormatPrecise = new Intl.NumberFormat(navigator.language, {maximumFractionDigits: 1}) -const distanceFormat = new Intl.NumberFormat(navigator.language, {maximumFractionDigits: 0}) +const distanceFormatPrecise = new Intl.NumberFormat(navigator.language, { maximumFractionDigits: 1 }) +const distanceFormat = new Intl.NumberFormat(navigator.language, { maximumFractionDigits: 0 }) export function metersToText(meters: number, showDistanceInMiles: boolean, forceSmallUnits: boolean = false) { if (showDistanceInMiles) { diff --git a/src/NavBar.ts b/src/NavBar.ts index f7d74a22..a6f9d36c 100644 --- a/src/NavBar.ts +++ b/src/NavBar.ts @@ -182,4 +182,3 @@ export default class NavBar { return bbox[0] < bbox[2] && bbox[1] < bbox[3] ? bbox : null } } - diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 6af51747..892a8732 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -1,10 +1,10 @@ -import {Action} from '@/stores/Dispatcher' -import {Coordinate, CustomModel, QueryPoint} from '@/stores/QueryStore' -import {ApiInfo, Bbox, Path, RoutingArgs, RoutingProfile, RoutingResult} from '@/api/graphhopper' -import {StyleOption} from '@/stores/MapOptionsStore' -import {PathDetailsPoint} from '@/stores/PathDetailsStore' -import {LocationStoreState} from '@/stores/LocationStore' -import {TurnNavigationState} from "@/stores/TurnNavigationStore"; +import { Action } from '@/stores/Dispatcher' +import { Coordinate, CustomModel, QueryPoint } from '@/stores/QueryStore' +import { ApiInfo, Bbox, Path, RoutingArgs, RoutingProfile, RoutingResult } from '@/api/graphhopper' +import { StyleOption } from '@/stores/MapOptionsStore' +import { PathDetailsPoint } from '@/stores/PathDetailsStore' +import { LocationStoreState } from '@/stores/LocationStore' +import { TurnNavigationState } from '@/stores/TurnNavigationStore' export class InfoReceived implements Action { readonly result: ApiInfo @@ -70,8 +70,7 @@ export class SetRoutingParametersAtOnce implements Action { } } -export class ClearPoints implements Action { -} +export class ClearPoints implements Action {} export class RemovePoint implements Action { readonly point: QueryPoint @@ -146,8 +145,7 @@ export class RouteRequestFailed extends ErrorAction { } } -export class ClearRoute implements Action { -} +export class ClearRoute implements Action {} export class SetSelectedPath implements Action { readonly path: Path @@ -157,8 +155,7 @@ export class SetSelectedPath implements Action { } } -export class DismissLastError implements Action { -} +export class DismissLastError implements Action {} export class SelectMapStyle implements Action { readonly styleOption: StyleOption @@ -184,8 +181,7 @@ export class ToggleUrbanDensityLayer implements Action { } } -export class MapIsLoaded implements Action { -} +export class MapIsLoaded implements Action {} export class ZoomMapToPoint implements Action { readonly coordinate: Coordinate @@ -251,5 +247,4 @@ export class RoutingGraphHover implements Action { } } -export class ToggleDistanceUnits implements Action { -} +export class ToggleDistanceUnits implements Action {} diff --git a/src/index.tsx b/src/index.tsx index 72ba1f56..ab3ad6e8 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -6,28 +6,33 @@ import MapActionReceiver from '@/stores/MapActionReceiver' import { createMap, getMap, setMap } from '@/map/map' import MapFeatureStore from '@/stores/MapFeatureStore' import SettingsStore from '@/stores/SettingsStore' -import {SpeechSynthesizer} from "@/SpeechSynthesizer"; -import {setTranslation} from "@/translation/Translation"; -import {getApi, setApi} from "@/api/Api"; -import QueryStore from "@/stores/QueryStore"; -import RouteStore from "@/stores/RouteStore"; -import ApiInfoStore from "@/stores/ApiInfoStore"; -import ErrorStore from "@/stores/ErrorStore"; +import { SpeechSynthesizer } from '@/SpeechSynthesizer' +import { setTranslation } from '@/translation/Translation' +import { getApi, setApi } from '@/api/Api' +import QueryStore from '@/stores/QueryStore' +import RouteStore from '@/stores/RouteStore' +import ApiInfoStore from '@/stores/ApiInfoStore' +import ErrorStore from '@/stores/ErrorStore' import { getApiInfoStore, - getErrorStore, getLocationStore, getMapFeatureStore, getMapOptionsStore, getPathDetailsStore, + getErrorStore, + getLocationStore, + getMapFeatureStore, + getMapOptionsStore, + getPathDetailsStore, getQueryStore, getRouteStore, - getSettingsStore, getTurnNavigationStore, - setStores -} from "@/stores/Stores"; -import MapOptionsStore from "@/stores/MapOptionsStore"; -import LocationStore from "@/stores/LocationStore"; -import PathDetailsStore from "@/stores/PathDetailsStore"; -import Dispatcher from "@/stores/Dispatcher"; -import TurnNavigationStore from "@/stores/TurnNavigationStore"; -import NavBar from "@/NavBar"; -import App from "@/App"; + getSettingsStore, + getTurnNavigationStore, + setStores, +} from '@/stores/Stores' +import MapOptionsStore from '@/stores/MapOptionsStore' +import LocationStore from '@/stores/LocationStore' +import PathDetailsStore from '@/stores/PathDetailsStore' +import Dispatcher from '@/stores/Dispatcher' +import TurnNavigationStore from '@/stores/TurnNavigationStore' +import NavBar from '@/NavBar' +import App from '@/App' let speechSynthesizer = new SpeechSynthesizer(navigator.language) const url = new URL(window.location.href) @@ -94,4 +99,4 @@ root.render( // // -) \ No newline at end of file +) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index 58c80b6f..9fce7fc1 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -1,39 +1,59 @@ -import React from 'react' -import { Coordinate } from '@/stores/QueryStore' +import React, { useEffect } from 'react' +import { Feature, Map } from 'ol' +import { Coordinate, QueryPoint, QueryPointType } from '@/stores/QueryStore' +import { Point } from 'ol/geom' +import { fromLonLat } from 'ol/proj' +import VectorLayer from 'ol/layer/Vector' +import VectorSource from 'ol/source/Vector' +import { Circle, Fill, Stroke, Style } from 'ol/style' -import { FeatureCollection } from 'geojson' +export default function useCurrentLocationLayer(map: Map, location: Coordinate) { + useEffect(() => { + removeCurrentLocation(map) + if (location.lat != 0 && location.lng != 0) addCurrentLocation(map, location) + }, [map, location]) +} + +function removeCurrentLocation(map: Map) { + map.getLayers() + .getArray() + .filter(l => l.get('gh:current_location')) + .forEach(l => map.removeLayer(l)) +} -// TODO NOW adapt to OpenLayers -const currentLocationLayerKey = 'currentLocationLayer' +function addCurrentLocation(map: Map, location: Coordinate) { + const currentLocationLayer = new VectorLayer({ + source: new VectorSource({ + features: [ + new Feature({ + geometry: new Point(fromLonLat([location.lng, location.lat])), + }), + ], + }), + }) + currentLocationLayer.set('gh:current_location', true) + currentLocationLayer.setZIndex(3) -export default function (coordinate: Coordinate) { - const featureCollection: FeatureCollection = { - type: 'FeatureCollection', - features: [ - { - type: 'Feature', - properties: {}, - geometry: { type: 'Point', coordinates: [coordinate.lng, coordinate.lat] }, - }, - ], - } + const fill = new Fill({ + color: 'rgba(255,255,255,0.4)', + }) + const stroke = new Stroke({ + color: '#0054ff', + width: 2, + }) - return { - interactiveLayerIds: [], - onClick: (feature: any) => {}, - // layer: ( - // - // - // - // ), - } + currentLocationLayer.setStyle( + feature => + new Style({ + image: new Circle({ + fill: fill, + stroke: stroke, + radius: 10, + }), + fill: fill, + stroke: stroke, + }) + ) + map.addLayer(currentLocationLayer) + return currentLocationLayer } diff --git a/src/map/Popup.tsx b/src/map/Popup.tsx index 68d7d457..d397d33e 100644 --- a/src/map/Popup.tsx +++ b/src/map/Popup.tsx @@ -10,11 +10,11 @@ import { tr } from '@/translation/Translation' import { MarkerComponent } from '@/map/Marker' export function PopupComponent({ - coordinate, - queryPoints, - route, - onSelect, - }: { + coordinate, + queryPoints, + route, + onSelect, +}: { coordinate: Coordinate queryPoints: QueryPoint[] route: RouteStoreState diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index deb8cf6b..41dc3221 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -3,7 +3,7 @@ import { CurrentRequest, RequestState, SubRequest } from '@/stores/QueryStore' import styles from './RoutingResult.module.css' import React, { useContext, useEffect, useState } from 'react' import Dispatcher from '@/stores/Dispatcher' -import {SetSelectedPath, TurnNavigationUpdate} from '@/actions/Actions' +import { SetSelectedPath, TurnNavigationUpdate } from '@/actions/Actions' import { metersToText, milliSecondsToText } from '@/Converters' import PlainButton from '@/PlainButton' import Details from '@/sidebar/list.svg' @@ -15,8 +15,8 @@ import { useMediaQuery } from 'react-responsive' import { tr } from '@/translation/Translation' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import { ApiImpl } from '@/api/Api' -import {TurnNavigationState} from "@/stores/TurnNavigationStore"; -import {getLocationStore} from "@/stores/Stores"; +import { TurnNavigationState } from '@/stores/TurnNavigationStore' +import { getLocationStore } from '@/stores/Stores' export interface RoutingResultsProps { paths: Path[] @@ -78,7 +78,8 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: {isSelected && ( getLocationStore().initFake() /* : getLocationStore().initReal()*/}> + onClick={() => getLocationStore().initFake() /* : getLocationStore().initReal()*/} + >
{tr('Navi')}
diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 412e5cbd..fb53c24e 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -1,13 +1,12 @@ -import {Coordinate} from '@/stores/QueryStore' +import { Coordinate } from '@/stores/QueryStore' import Store from '@/stores/Store' -import {ErrorAction, LocationUpdate, SetPoint, ZoomMapToPoint} from '@/actions/Actions' -import Dispatcher, {Action} from '@/stores/Dispatcher' +import { ErrorAction, LocationUpdate, ZoomMapToPoint } from '@/actions/Actions' +import Dispatcher, { Action } from '@/stores/Dispatcher' import NoSleep from 'nosleep.js' -import {SpeechSynthesizer} from '@/SpeechSynthesizer' -import {ApiImpl} from '@/api/Api' -import {calcOrientation, toNorthBased} from '@/turnNavigation/GeoMethods' +import { SpeechSynthesizer } from '@/SpeechSynthesizer' +import { ApiImpl } from '@/api/Api' +import { calcOrientation, toNorthBased } from '@/turnNavigation/GeoMethods' import * as config from 'config' -import {toDegrees} from "ol/math"; export interface LocationStoreState { turnNavigation: boolean @@ -15,8 +14,6 @@ export interface LocationStoreState { speed: number } -// TODO investigate what we can learn from https://github.com/visgl/react-map-gl/blob/master/docs/api-reference/geolocate-control.md -// TODO include compass in map https://github.com/visgl/react-map-gl/blob/master/docs/api-reference/navigation-control.md export default class LocationStore extends Store { private watchId: any = undefined private interval: any @@ -27,7 +24,7 @@ export default class LocationStore extends Store { constructor(speechSynthesizer: SpeechSynthesizer) { super({ turnNavigation: false, - coordinate: {lat: 0, lng: 0}, + coordinate: { lat: 0, lng: 0 }, speed: 0, }) this.speechSynthesizer = speechSynthesizer @@ -46,7 +43,7 @@ export default class LocationStore extends Store { } public async initFake() { - console.log("started fake GPS injection") + console.log('started fake GPS injection') this.started = true // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car&layer=MapTiler&fake=true @@ -74,7 +71,7 @@ export default class LocationStore extends Store { if (idx > 0) { const prevLat = coords[idx - 1][1] const prevLon = coords[idx - 1][0] - let o = calcOrientation(lat, lon, prevLat, prevLon); + let o = calcOrientation(lat, lon, prevLat, prevLon) heading = Math.PI - toNorthBased(o) } latlon[idx] = [lat, lon, heading, 4] @@ -108,8 +105,8 @@ export default class LocationStore extends Store { private static locationUpdate(pos: any) { // TODO NOW: 'this is undefined' if called from watchPosition: if (!this.started) return - let c = {lat: pos.coords.latitude, lng: pos.coords.longitude} - Dispatcher.dispatch(new LocationUpdate({coordinate: c, turnNavigation: true, speed: pos.coords.speed})) + let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } + Dispatcher.dispatch(new LocationUpdate({ coordinate: c, turnNavigation: true, speed: pos.coords.speed })) let bearing: number = pos.coords.heading if (Number.isNaN(bearing)) console.log('skip dispatching SetViewportToPoint because bearing is ' + bearing) @@ -131,7 +128,7 @@ export default class LocationStore extends Store { let options = { timeout: 300_000, // maximumAge is not a problem here like with getCurrentPosition but let's use identical settings - enableHighAccuracy: true + enableHighAccuracy: true, } this.watchId = navigator.geolocation.watchPosition( LocationStore.locationUpdate, @@ -145,7 +142,7 @@ export default class LocationStore extends Store { let requestFullscreenFct = el.requestFullscreen requestFullscreenFct.call(el) } catch (e) { - console.log("error requesting full screen " + JSON.stringify(e)) + console.log('error requesting full screen ' + JSON.stringify(e)) } } } @@ -160,11 +157,10 @@ export default class LocationStore extends Store { if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) // exit "navigation view" => use no pitch and no bearing (rotation) - // TODO NOW - // Dispatcher.dispatch(new SetViewportToPoint(this.state.coordinate, 15, 0, 0)) + Dispatcher.dispatch(new ZoomMapToPoint(this.state.coordinate, 15, 0, 0)) // directly writing the state does not work: this.state.turnNavigation = false - Dispatcher.dispatch(new LocationUpdate({coordinate: {lat: 0, lng: 0}, turnNavigation: false, speed: 0})) + Dispatcher.dispatch(new LocationUpdate({ coordinate: { lat: 0, lng: 0 }, turnNavigation: false, speed: 0 })) if (this.noSleep) this.noSleep.disable() } diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index c570c0df..3539dea9 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -12,7 +12,7 @@ import { } from '@/actions/Actions' import RouteStore from '@/stores/RouteStore' import { Bbox } from '@/api/graphhopper' -import {between} from "ol/format/filter"; +import { between } from 'ol/format/filter' export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -45,7 +45,7 @@ export default class MapActionReceiver implements ActionReceiver { center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), rotation: action.bearing, duration: 1000, - }); + }) } else if (action instanceof RouteRequestSuccess) { // this assumes that always the first path is selected as result. One could use the // state of the routeStore as well, but then we would have to make sure that the route diff --git a/src/stores/Stores.ts b/src/stores/Stores.ts index f3c59e36..9bfbd767 100644 --- a/src/stores/Stores.ts +++ b/src/stores/Stores.ts @@ -5,7 +5,7 @@ import ErrorStore from '@/stores/ErrorStore' import MapOptionsStore from '@/stores/MapOptionsStore' import LocationStore from '@/stores/LocationStore' import PathDetailsStore from '@/stores/PathDetailsStore' -import TurnNavigationStore from "@/stores/TurnNavigationStore"; +import TurnNavigationStore from '@/stores/TurnNavigationStore' import MapFeatureStore from '@/stores/MapFeatureStore' import SettingsStore from '@/stores/SettingsStore' diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index c383f67e..d05e86a6 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -1,6 +1,6 @@ -import Store from "@/stores/Store"; -import {Action} from "@/stores/Dispatcher"; -import {TurnNavigationUpdate} from "@/actions/Actions"; +import Store from '@/stores/Store' +import { Action } from '@/stores/Dispatcher' +import { TurnNavigationUpdate } from '@/actions/Actions' export interface TurnNavigationState { fakeGPS: boolean @@ -9,7 +9,6 @@ export interface TurnNavigationState { } export default class TurnNavigationStore extends Store { - constructor() { super({ fakeGPS: false, @@ -20,9 +19,8 @@ export default class TurnNavigationStore extends Store { reduce(state: TurnNavigationState, action: Action): TurnNavigationState { if (action instanceof TurnNavigationUpdate) { - return {...state, ...action.update} + return { ...state, ...action.update } } return state } - -} \ No newline at end of file +} diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index b1943060..35b05306 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -1,6 +1,6 @@ -import {Instruction, Path} from '@/api/graphhopper' -import {Coordinate} from '@/stores/QueryStore' -import {or} from "ol/format/filter"; +import { Instruction, Path } from '@/api/graphhopper' +import { Coordinate } from '@/stores/QueryStore' +import { or } from 'ol/format/filter' export function getCurrentDetails(path: Path, location: Coordinate, details: [any, any, any][][]): number[] { let smallestDist = Number.MAX_VALUE @@ -9,7 +9,7 @@ export function getCurrentDetails(path: Path, location: Coordinate, details: [an for (let pIdx = 0; pIdx < points.length; pIdx++) { const p: number[] = points[pIdx] - let snapped = {lat: p[1], lng: p[0]} + let snapped = { lat: p[1], lng: p[0] } let dist = distCalc(p[1], p[0], location.lat, location.lng) if (pIdx + 1 < points.length) { @@ -27,12 +27,12 @@ export function getCurrentDetails(path: Path, location: Coordinate, details: [an } if (foundIndex < 0) return [] - let result = []; + let result = [] for (let i = 0; i < details.length; i++) { let detailOnPath = details[i] for (let d = 0; d < detailOnPath.length; d++) { - let [from, to, val] = detailOnPath[d]; - if (foundIndex >= from && foundIndex < to || foundIndex == to && d + 1 == detailOnPath.length) { + let [from, to, val] = detailOnPath[d] + if ((foundIndex >= from && foundIndex < to) || (foundIndex == to && d + 1 == detailOnPath.length)) { result.push(val) break } @@ -61,7 +61,7 @@ export function getCurrentInstruction( for (let pIdx = 0; pIdx < points.length; pIdx++) { const p: number[] = points[pIdx] - let snapped = {lat: p[1], lng: p[0]} + let snapped = { lat: p[1], lng: p[0] } let dist = distCalc(p[1], p[0], location.lat, location.lng) // calculate the snapped point, TODO use first point of next instruction for "next" if last point of current instruction if (pIdx + 1 < points.length) { @@ -101,7 +101,7 @@ export function getCurrentInstruction( } } - return {instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance} + return { instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance } } export function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: number): number { @@ -179,11 +179,11 @@ function calcCrossingPointToEdge( if (delta_lat == 0) // special case: horizontal edge - return {lat: a_lat_deg, lng: r_lon_deg} + return { lat: a_lat_deg, lng: r_lon_deg } if (delta_lon == 0) // special case: vertical edge - return {lat: r_lat_deg, lng: a_lon_deg} + return { lat: r_lat_deg, lng: a_lon_deg } let norm = delta_lon * delta_lon + delta_lat * delta_lat let factor = ((r_lon - a_lon) * delta_lon + (r_lat - a_lat) * delta_lat) / norm @@ -191,7 +191,7 @@ function calcCrossingPointToEdge( // x,y is projection of r onto segment a-b let c_lon = a_lon + factor * delta_lon let c_lat = a_lat + factor * delta_lat - return {lat: c_lat, lng: c_lon / shrinkFactor} + return { lat: c_lat, lng: c_lon / shrinkFactor } } // returns orientation in interval -pi to +pi where 0 is east @@ -202,7 +202,7 @@ export function calcOrientation(lat1: number, lon1: number, lat2: number, lon2: // convert east-based radians into north based export function toNorthBased(orientation: number): number { - orientation = orientation >= 0 ? (5 * Math.PI / 2 - orientation) : ( Math.PI/2 - orientation) + orientation = orientation >= 0 ? (5 * Math.PI) / 2 - orientation : Math.PI / 2 - orientation // modulo with decimals seems to work too!? orientation % (2 * Math.PI) - return orientation > 2 * Math.PI? orientation - 2 * Math.PI : orientation; -} \ No newline at end of file + return orientation > 2 * Math.PI ? orientation - 2 * Math.PI : orientation +} diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 966cb861..55542d49 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -43,7 +43,6 @@ } .arrivalDuration { - } .debug { @@ -55,8 +54,7 @@ max-height: 20px; } -.details { - +.details { } .maxSpeed { @@ -68,4 +66,3 @@ border-radius: 50%; border: 4px solid rgba(255, 0, 0, 0.6); /* red */ } - diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 445a2060..cfd7d6c8 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,14 +1,14 @@ -import React, {useEffect, useReducer, useState} from 'react' -import {Instruction, Path} from '@/api/graphhopper' -import {metersToText, milliSecondsToText} from '@/Converters' -import {getTurnSign} from '@/sidebar/instructions/Instructions' -import {getCurrentDetails, getCurrentInstruction} from './GeoMethods' +import React, { useEffect, useReducer, useState } from 'react' +import { Instruction, Path } from '@/api/graphhopper' +import { metersToText, milliSecondsToText } from '@/Converters' +import { getTurnSign } from '@/sidebar/instructions/Instructions' +import { getCurrentDetails, getCurrentInstruction } from './GeoMethods' import styles from '@/turnNavigation/TurnNavigation.module.css' import endNavigation from '@/turnNavigation/end_turn_navigation.png' -import {getLocationStore} from '@/stores/Stores' -import {LocationStoreState} from '@/stores/LocationStore' -import {tr} from '@/translation/Translation' -import {TurnNavigationState} from "@/stores/TurnNavigationStore"; +import { getLocationStore } from '@/stores/Stores' +import { LocationStoreState } from '@/stores/LocationStore' +import { tr } from '@/translation/Translation' +import { TurnNavigationState } from '@/stores/TurnNavigationStore' type TurnNavigationProps = { path: Path @@ -16,10 +16,10 @@ type TurnNavigationProps = { turnNaviState: TurnNavigationState } -export default function ({path, location, turnNaviState}: TurnNavigationProps) { +export default function ({ path, location, turnNaviState }: TurnNavigationProps) { let currentLocation = location.coordinate - const {instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance} = getCurrentInstruction( + const { instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance } = getCurrentInstruction( path.instructions, currentLocation ) @@ -28,8 +28,12 @@ export default function ({path, location, turnNaviState}: TurnNavigationProps) { // TODO too far from route - recalculate? if (instructionIndex < 0) return <>Cannot find instruction - let [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, currentLocation, - [path.details.average_speed, path.details.max_speed, path.details.surface, path.details.road_class]); + let [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, currentLocation, [ + path.details.average_speed, + path.details.max_speed, + path.details.surface, + path.details.road_class, + ]) estimatedAvgSpeed = Math.round(estimatedAvgSpeed) // console.log('remaining distance: ' + remainingDistance + ', time: ' + remainingTime + ', avg: ' + estimatedAvgSpeed + ", max: " + maxSpeed) @@ -44,9 +48,9 @@ export default function ({path, location, turnNaviState}: TurnNavigationProps) { return action } - let [showTime, setShowTime] = useState(true); - let [showDebug, setShowDebug] = useState(false); - const [state, dispatch] = useReducer(reducer, {index: -1, distanceToNext: -1, text: ''}) + let [showTime, setShowTime] = useState(true) + let [showDebug, setShowDebug] = useState(false) + const [state, dispatch] = useReducer(reducer, { index: -1, distanceToNext: -1, text: '' }) // speak text out loud after render only if index changed and distance is close next instruction useEffect(() => { @@ -69,12 +73,14 @@ export default function ({path, location, turnNaviState}: TurnNavigationProps) { let firstAnnounceDistance = 1150 if ( averageSpeed > 15 && // two announcements only if faster speed - distanceToNext > (lastAnnounceDistance + 50) && // do not interfere with last announcement. also "1 km" should stay valid (approximately) + distanceToNext > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) distanceToNext <= firstAnnounceDistance && (state.distanceToNext > firstAnnounceDistance || instructionIndex != state.index) ) { - let inString = distanceToNext > 800 ? tr('in_km_singular') - : tr("in_m", ["" + Math.round(distanceToNext / 100) * 100]) + let inString = + distanceToNext > 800 + ? tr('in_km_singular') + : tr('in_m', ['' + Math.round(distanceToNext / 100) * 100]) // console.log(inString + ' ' + nextInstruction.text) getLocationStore() .getSpeechSynthesizer() @@ -82,7 +88,7 @@ export default function ({path, location, turnNaviState}: TurnNavigationProps) { } } - dispatch({index: instructionIndex, distanceToNext: distanceToNext, text: text}) + dispatch({ index: instructionIndex, distanceToNext: distanceToNext, text: text }) }, [instructionIndex, distanceToNext]) const arrivalDate = new Date() @@ -94,43 +100,46 @@ export default function ({path, location, turnNaviState}: TurnNavigationProps) {
-
- {getTurnSign(nextInstruction.sign, instructionIndex)} -
+
{getTurnSign(nextInstruction.sign, instructionIndex)}
{metersToText(distanceToNext, false)}
setShowTime(!showTime)}> - {showTime - ?
{arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)} + {showTime ? ( +
+ {arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)} - - + +
- :
{milliSecondsToText(remainingTime)} + ) : ( +
+ {milliSecondsToText(remainingTime)} - - + +
- } + )}
{metersToText(remainingDistance, false)}
setShowDebug(!showDebug)}>
{currentSpeed} km/h
- { maxSpeed != null ?
{Math.round(maxSpeed)}
: null } - { showDebug ? + {maxSpeed != null ? ( +
{Math.round(maxSpeed)}
+ ) : null} + {showDebug ? (
{estimatedAvgSpeed}
{surface}
{roadClass}
-
: null - } +
+ ) : null}
getLocationStore().stop()}> - +
{state.text}
diff --git a/test/turnNavigation/GeoMethods.test.ts b/test/turnNavigation/GeoMethods.test.ts index b3b1502f..41e62be0 100644 --- a/test/turnNavigation/GeoMethods.test.ts +++ b/test/turnNavigation/GeoMethods.test.ts @@ -1,4 +1,4 @@ -import {calcOrientation, getCurrentInstruction, toNorthBased} from '../../src/turnNavigation/GeoMethods' +import { calcOrientation, getCurrentInstruction, toNorthBased } from '../../src/turnNavigation/GeoMethods' import Dispatcher from '../../src/stores/Dispatcher' import { ApiImpl } from '../../src/api/Api' @@ -38,23 +38,33 @@ describe('calculate instruction', () => { it('calc angle', () => { // downwards+west - expect(Math.round(toDegrees(calcOrientation(51.439146,14.245258, 51.438908,14.245931)))).toEqual(-30) - expect(Math.round(toDegrees(toNorthBased(calcOrientation(51.439146,14.245258, 51.438908,14.245931))))).toEqual(120) + expect(Math.round(toDegrees(calcOrientation(51.439146, 14.245258, 51.438908, 14.245931)))).toEqual(-30) + expect( + Math.round(toDegrees(toNorthBased(calcOrientation(51.439146, 14.245258, 51.438908, 14.245931)))) + ).toEqual(120) // downwards - expect(Math.round(toDegrees(calcOrientation(51.439146,14.245258, 51.438748,14.245255)))).toEqual(-90) - expect(Math.round(toDegrees(toNorthBased(calcOrientation(51.439146,14.245258, 51.438748,14.245255))))).toEqual(180) + expect(Math.round(toDegrees(calcOrientation(51.439146, 14.245258, 51.438748, 14.245255)))).toEqual(-90) + expect( + Math.round(toDegrees(toNorthBased(calcOrientation(51.439146, 14.245258, 51.438748, 14.245255)))) + ).toEqual(180) // down+west - expect(Math.round(toDegrees(calcOrientation(51.439146,14.245258, 51.439015,14.244568)))).toEqual(-163) - expect(Math.round(toDegrees(toNorthBased(calcOrientation(51.439146,14.245258, 51.439015,14.244568))))).toEqual(253) + expect(Math.round(toDegrees(calcOrientation(51.439146, 14.245258, 51.439015, 14.244568)))).toEqual(-163) + expect( + Math.round(toDegrees(toNorthBased(calcOrientation(51.439146, 14.245258, 51.439015, 14.244568)))) + ).toEqual(253) // upward+west - expect(Math.round(toDegrees(calcOrientation(51.439146,14.245258, 51.43953,14.244536)))).toEqual(140) - expect(Math.round(toDegrees(toNorthBased(calcOrientation(51.439146,14.245258, 51.43953,14.244536))))).toEqual(310) + expect(Math.round(toDegrees(calcOrientation(51.439146, 14.245258, 51.43953, 14.244536)))).toEqual(140) + expect(Math.round(toDegrees(toNorthBased(calcOrientation(51.439146, 14.245258, 51.43953, 14.244536))))).toEqual( + 310 + ) // upward+east - expect(Math.round(toDegrees(calcOrientation(51.439146,14.245258, 51.439584,14.24592)))).toEqual(47) - expect(Math.round(toDegrees(toNorthBased(calcOrientation(51.439146,14.245258, 51.439584,14.24592))))).toEqual(43) + expect(Math.round(toDegrees(calcOrientation(51.439146, 14.245258, 51.439584, 14.24592)))).toEqual(47) + expect(Math.round(toDegrees(toNorthBased(calcOrientation(51.439146, 14.245258, 51.439584, 14.24592))))).toEqual( + 43 + ) }) - function toDegrees(radian:number) { - return radian/Math.PI*180.0 + function toDegrees(radian: number) { + return (radian / Math.PI) * 180.0 } }) From 53fa17fa01dc75fb231e9114ec9d6e4e3d645159 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 16 Oct 2022 20:25:21 +0200 Subject: [PATCH 101/322] show turn panel also for mobile and avoid removing the layer to move location --- src/App.tsx | 29 +++++++++++++++++++++++++++++ src/layers/CurrentLocationLayer.tsx | 23 +++++++++++++++-------- src/map/map.ts | 3 ++- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 1c04e6eb..0ede7fdb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -246,6 +246,35 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, info, locatio } function SmallScreenLayout({ query, route, map, error, mapOptions, info, location, turnNaviState }: LayoutProps) { + if (location.turnNavigation) + return ( + <> +
+ +
+
+ + Dispatcher.dispatch( + new TurnNavigationUpdate({ + soundEnabled: !turnNaviState.soundEnabled, + } as TurnNavigationState) + ) + } + > + {turnNaviState.soundEnabled ? ( + + ) : ( + + )} + +
+
+ +
+ + ) + return ( <>
diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index 9fce7fc1..725b6f5c 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react' import { Feature, Map } from 'ol' -import { Coordinate, QueryPoint, QueryPointType } from '@/stores/QueryStore' +import { Coordinate } from '@/stores/QueryStore' import { Point } from 'ol/geom' import { fromLonLat } from 'ol/proj' import VectorLayer from 'ol/layer/Vector' @@ -9,16 +9,23 @@ import { Circle, Fill, Stroke, Style } from 'ol/style' export default function useCurrentLocationLayer(map: Map, location: Coordinate) { useEffect(() => { - removeCurrentLocation(map) - if (location.lat != 0 && location.lng != 0) addCurrentLocation(map, location) + let layer = findLayer(map) + if (location.lat != 0 && location.lng != 0) { + if(layer == null) addCurrentLocation(map, location) + else changeLocation(layer, location) + } }, [map, location]) } -function removeCurrentLocation(map: Map) { - map.getLayers() - .getArray() - .filter(l => l.get('gh:current_location')) - .forEach(l => map.removeLayer(l)) +function findLayer(map: Map) : any { + let layers = map.getLayers().getArray().filter(l => l.get('gh:current_location')) + return layers.length > 0 && layers[0] instanceof VectorLayer && layers[0].getSource() instanceof VectorSource ? layers[0] : null +} + +function changeLocation(layer: VectorLayer, location: Coordinate) { + // TODO animate movement https://openlayers.org/en/latest/examples/feature-move-animation.html + let feature = layer.getSource()?.getFeatures()[0] as Feature; + feature.setGeometry(new Point(fromLonLat([location.lng, location.lat]))) } function addCurrentLocation(map: Map, location: Coordinate) { diff --git a/src/map/map.ts b/src/map/map.ts index f24a9583..d7afc36a 100644 --- a/src/map/map.ts +++ b/src/map/map.ts @@ -16,7 +16,8 @@ export function createMap(): Map { zoom: 2, }), controls: defaultControls({ - zoom: true, + zoom: false, // zoom control is nice but currently overlaps with sound button + rotate: false, // for now also disable this extra button attribution: true, attributionOptions: { collapsible: false, From e7c605f95f03661187c8b3278dfcf793e7f7eb36 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 16 Oct 2022 20:36:22 +0200 Subject: [PATCH 102/322] fake parameter --- src/App.tsx | 2 ++ src/index.tsx | 8 ++++-- src/layers/CurrentLocationLayer.tsx | 15 +++++++---- src/sidebar/RoutingResults.tsx | 40 ++++++++++++++++++++++++----- 4 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 0ede7fdb..b045f13d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -224,6 +224,7 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, info, locatio selectedPath={route.selectedPath} currentRequest={query.currentRequest} profile={query.routingProfile.name} + turnNaviState={turnNaviState} />
@@ -295,6 +296,7 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, locatio selectedPath={route.selectedPath} currentRequest={query.currentRequest} profile={query.routingProfile.name} + turnNaviState={turnNaviState} />
diff --git a/src/index.tsx b/src/index.tsx index ab3ad6e8..b866ea41 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -30,13 +30,15 @@ import MapOptionsStore from '@/stores/MapOptionsStore' import LocationStore from '@/stores/LocationStore' import PathDetailsStore from '@/stores/PathDetailsStore' import Dispatcher from '@/stores/Dispatcher' -import TurnNavigationStore from '@/stores/TurnNavigationStore' +import TurnNavigationStore, { TurnNavigationState } from '@/stores/TurnNavigationStore' import NavBar from '@/NavBar' import App from '@/App' +import { TurnNavigationUpdate } from '@/actions/Actions' let speechSynthesizer = new SpeechSynthesizer(navigator.language) const url = new URL(window.location.href) const locale = url.searchParams.get('locale') +const fake = url.searchParams.get('fake') setTranslation(locale || navigator.language) // use graphhopper api key from url or try using one from the config @@ -79,7 +81,9 @@ const smallScreenMediaQuery = window.matchMedia('(max-width: 44rem)') const mapActionReceiver = new MapActionReceiver(getMap(), routeStore, () => smallScreenMediaQuery.matches) Dispatcher.register(mapActionReceiver) -// Dispatcher.dispatch(new TurnNavigationUpdate({fakeGPS: fake !== null, soundEnabled: fake === null} as TurnNavigationState)) +Dispatcher.dispatch( + new TurnNavigationUpdate({ fakeGPS: fake !== null, soundEnabled: fake === null } as TurnNavigationState) +) getApi().infoWithDispatch() // get infos about the api as soon as possible diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index 725b6f5c..e12a2634 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -11,20 +11,25 @@ export default function useCurrentLocationLayer(map: Map, location: Coordinate) useEffect(() => { let layer = findLayer(map) if (location.lat != 0 && location.lng != 0) { - if(layer == null) addCurrentLocation(map, location) + if (layer == null) addCurrentLocation(map, location) else changeLocation(layer, location) } }, [map, location]) } -function findLayer(map: Map) : any { - let layers = map.getLayers().getArray().filter(l => l.get('gh:current_location')) - return layers.length > 0 && layers[0] instanceof VectorLayer && layers[0].getSource() instanceof VectorSource ? layers[0] : null +function findLayer(map: Map): any { + let layers = map + .getLayers() + .getArray() + .filter(l => l.get('gh:current_location')) + return layers.length > 0 && layers[0] instanceof VectorLayer && layers[0].getSource() instanceof VectorSource + ? layers[0] + : null } function changeLocation(layer: VectorLayer, location: Coordinate) { // TODO animate movement https://openlayers.org/en/latest/examples/feature-move-animation.html - let feature = layer.getSource()?.getFeatures()[0] as Feature; + let feature = layer.getSource()?.getFeatures()[0] as Feature feature.setGeometry(new Point(fromLonLat([location.lng, location.lat]))) } diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 41dc3221..8033d77a 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -15,14 +15,16 @@ import { useMediaQuery } from 'react-responsive' import { tr } from '@/translation/Translation' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import { ApiImpl } from '@/api/Api' -import { TurnNavigationState } from '@/stores/TurnNavigationStore' import { getLocationStore } from '@/stores/Stores' +import turnNavigation from '@/turnNavigation/TurnNavigation' +import { TurnNavigationState } from '@/stores/TurnNavigationStore' export interface RoutingResultsProps { paths: Path[] selectedPath: Path currentRequest: CurrentRequest profile: string + turnNaviState: TurnNavigationState } export default function RoutingResults(props: RoutingResultsProps) { @@ -33,7 +35,17 @@ export default function RoutingResults(props: RoutingResultsProps) { return
    {isShortScreen ? createSingletonListContent(props) : createListContent(props)}
} -function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: boolean; profile: string }) { +function RoutingResult({ + path, + isSelected, + profile, + turnNaviState, +}: { + path: Path + isSelected: boolean + profile: string + turnNaviState: TurnNavigationState +}) { const [isExpanded, setExpanded] = useState(false) const resultSummaryClass = isSelected ? styles.resultSummary + ' ' + styles.selectedResultSummary @@ -48,6 +60,7 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: const hasBorderCrossed = crossesBorder(path.details.country) const showDistanceInMiles = useContext(ShowDistanceInMilesContext) + // TODO NOW let [showRisk, setShowRisk] = useState(false) return ( @@ -78,7 +91,9 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: {isSelected && ( getLocationStore().initFake() /* : getLocationStore().initReal()*/} + onClick={() => + turnNaviState.fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal() + } >
{tr('Navi')}
@@ -220,19 +235,32 @@ function getLength(paths: Path[], subRequests: SubRequest[]) { function createSingletonListContent(props: RoutingResultsProps) { if (props.paths.length > 0) - return + return ( + + ) if (hasPendingRequests(props.currentRequest.subRequests)) return return '' } -function createListContent({ paths, currentRequest, selectedPath, profile }: RoutingResultsProps) { +function createListContent({ paths, currentRequest, selectedPath, profile, turnNaviState }: RoutingResultsProps) { const length = getLength(paths, currentRequest.subRequests) const result = [] for (let i = 0; i < length; i++) { if (i < paths.length) result.push( - + ) else result.push() } From c1a9d07f83fd920a1e11e290b48d396aa527b0a4 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 16 Oct 2022 21:47:40 +0200 Subject: [PATCH 103/322] include showRisk warning --- src/sidebar/RoutingResult.module.css | 7 +++++++ src/sidebar/RoutingResults.tsx | 26 +++++++++++++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/sidebar/RoutingResult.module.css b/src/sidebar/RoutingResult.module.css index 804e7ad8..e37fc91b 100644 --- a/src/sidebar/RoutingResult.module.css +++ b/src/sidebar/RoutingResult.module.css @@ -150,3 +150,10 @@ .routeHints { padding-bottom: 1em; } + +.showRisk { + display: flex; + flex-direction: column; + align-self: center; + padding: 0.5em; +} diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 8033d77a..9c24628a 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -60,9 +60,23 @@ function RoutingResult({ const hasBorderCrossed = crossesBorder(path.details.country) const showDistanceInMiles = useContext(ShowDistanceInMilesContext) - // TODO NOW let [showRisk, setShowRisk] = useState(false) + if (showRisk) + return ( +
+
{tr('warning')}
+ { + Dispatcher.dispatch(new TurnNavigationUpdate({ acceptedRisk: true } as TurnNavigationState)) + return turnNaviState.fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal() + }} + > + {tr('accept_risks_after_warning')} + +
+ ) + return (
Dispatcher.dispatch(new SetSelectedPath(path))}> @@ -88,18 +102,16 @@ function RoutingResult({ )}
- {isSelected && ( + {isSelected && !showRisk && ( - turnNaviState.fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal() - } + onClick={() => setShowRisk(true)} >
{tr('Navi')}
)} - {isSelected && ( + {isSelected && !showRisk && ( downloadGPX(path, showDistanceInMiles)} @@ -108,7 +120,7 @@ function RoutingResult({
{tr('gpx_button')}
)} - {isSelected && ( + {isSelected && !showRisk && ( setExpanded(!isExpanded)} From 94a78927decb96e5ac33b5e9c5cf05d1bd8c959d Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 16 Oct 2022 21:53:53 +0200 Subject: [PATCH 104/322] cancel button for showRisk --- src/sidebar/RoutingResult.module.css | 11 ++++++++--- src/sidebar/RoutingResults.tsx | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/sidebar/RoutingResult.module.css b/src/sidebar/RoutingResult.module.css index e37fc91b..510d6644 100644 --- a/src/sidebar/RoutingResult.module.css +++ b/src/sidebar/RoutingResult.module.css @@ -152,8 +152,13 @@ } .showRisk { - display: flex; - flex-direction: column; - align-self: center; padding: 0.5em; } + +.showRiskButtons { + padding: 0.5em; + display: flex; + flex-direction: row; + justify-content: space-around; + align-self: center; +} \ No newline at end of file diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 9c24628a..e91bdfc7 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -66,6 +66,8 @@ function RoutingResult({ return (
{tr('warning')}
+
+ setShowRisk(false)}>{tr('back')} { Dispatcher.dispatch(new TurnNavigationUpdate({ acceptedRisk: true } as TurnNavigationState)) @@ -74,6 +76,7 @@ function RoutingResult({ > {tr('accept_risks_after_warning')} +
) From 84cac6e9d30a497ee7d8fd803b77932e35572872 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 16 Oct 2022 21:56:43 +0200 Subject: [PATCH 105/322] format --- src/sidebar/RoutingResult.module.css | 2 +- src/sidebar/RoutingResults.tsx | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/sidebar/RoutingResult.module.css b/src/sidebar/RoutingResult.module.css index 510d6644..ba2bc06f 100644 --- a/src/sidebar/RoutingResult.module.css +++ b/src/sidebar/RoutingResult.module.css @@ -161,4 +161,4 @@ flex-direction: row; justify-content: space-around; align-self: center; -} \ No newline at end of file +} diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index e91bdfc7..0cb5669f 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -67,15 +67,15 @@ function RoutingResult({
{tr('warning')}
- setShowRisk(false)}>{tr('back')} - { - Dispatcher.dispatch(new TurnNavigationUpdate({ acceptedRisk: true } as TurnNavigationState)) - return turnNaviState.fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal() - }} - > - {tr('accept_risks_after_warning')} - + setShowRisk(false)}>{tr('back')} + { + Dispatcher.dispatch(new TurnNavigationUpdate({ acceptedRisk: true } as TurnNavigationState)) + return turnNaviState.fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal() + }} + > + {tr('accept_risks_after_warning')} +
) From e9805bd84e954c3e1f102541132b9394b065a17b Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 16 Oct 2022 22:10:20 +0200 Subject: [PATCH 106/322] minor remove --- src/Converters.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Converters.ts b/src/Converters.ts index e46f0701..7c8f061e 100644 --- a/src/Converters.ts +++ b/src/Converters.ts @@ -11,7 +11,6 @@ export function milliSecondsToText(seconds: number) { return hourText + ' ' + minutes + ' min' } -const distanceFormatPrecise = new Intl.NumberFormat(navigator.language, { maximumFractionDigits: 1 }) const distanceFormat = new Intl.NumberFormat(navigator.language, { maximumFractionDigits: 0 }) export function metersToText(meters: number, showDistanceInMiles: boolean, forceSmallUnits: boolean = false) { From 2ee4785cbcacbc7fe91eb9d10df6774332aa17b7 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 16 Oct 2022 22:27:29 +0200 Subject: [PATCH 107/322] move navigation settings into global Settings --- src/App.tsx | 46 ++++++++--------------- src/ShowDistanceInMilesContext.ts | 8 +++- src/actions/Actions.ts | 6 +-- src/index.tsx | 10 +---- src/layers/PathDetailPopup.tsx | 2 +- src/sidebar/RoutingResults.tsx | 41 ++++---------------- src/sidebar/instructions/Instructions.tsx | 2 +- src/stores/SettingsStore.ts | 10 ++++- src/stores/Stores.ts | 5 --- src/stores/TurnNavigationStore.ts | 26 ------------- src/turnNavigation/TurnNavigation.tsx | 10 ++--- 11 files changed, 51 insertions(+), 115 deletions(-) delete mode 100644 src/stores/TurnNavigationStore.ts diff --git a/src/App.tsx b/src/App.tsx index b045f13d..f2c57d26 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -11,7 +11,6 @@ import { getQueryStore, getRouteStore, getSettingsStore, - getTurnNavigationStore, } from '@/stores/Stores' import MapComponent from '@/map/MapComponent' import { ApiInfo } from '@/api/graphhopper' @@ -27,7 +26,6 @@ import { ErrorStoreState } from '@/stores/ErrorStore' import Search from '@/sidebar/search/Search' import ErrorMessage from '@/sidebar/ErrorMessage' import { LocationStoreState } from './stores/LocationStore' -import { TurnNavigationState } from '@/stores/TurnNavigationStore' import useBackgroundLayer from '@/layers/UseBackgroundLayer' import useQueryPointsLayer from '@/layers/UseQueryPointsLayer' import usePathsLayer from '@/layers/UsePathsLayer' @@ -50,6 +48,7 @@ import VolumeOffIcon from '@/turnNavigation/volume_off.svg' import PlainButton from '@/PlainButton' import TurnNavigation from '@/turnNavigation/TurnNavigation' import useCurrentLocationLayer from '@/layers/CurrentLocationLayer' +import { Settings } from '@/stores/SettingsStore' export const POPUP_CONTAINER_ID = 'popup-container' export const SIDEBAR_CONTENT_ID = 'sidebar-content' @@ -59,7 +58,6 @@ export default function App() { const [query, setQuery] = useState(getQueryStore().state) const [info, setInfo] = useState(getApiInfoStore().state) const [route, setRoute] = useState(getRouteStore().state) - const [turnNaviState, setTurnNaviState] = useState(getTurnNavigationStore().state) const [location, setLocation] = useState(getLocationStore().state) const [error, setError] = useState(getErrorStore().state) const [mapOptions, setMapOptions] = useState(getMapOptionsStore().state) @@ -75,7 +73,6 @@ export default function App() { const onRouteChanged = () => setRoute(getRouteStore().state) const onErrorChanged = () => setError(getErrorStore().state) const onMapOptionsChanged = () => setMapOptions(getMapOptionsStore().state) - const onTurnNavigationStateChanged = () => setTurnNaviState(getTurnNavigationStore().state) const onLocationChanged = () => setLocation(getLocationStore().state) const onPathDetailsChanged = () => setPathDetails(getPathDetailsStore().state) const onMapFeaturesChanged = () => setMapFeatures(getMapFeatureStore().state) @@ -86,7 +83,6 @@ export default function App() { getRouteStore().register(onRouteChanged) getErrorStore().register(onErrorChanged) getMapOptionsStore().register(onMapOptionsChanged) - getTurnNavigationStore().register(onTurnNavigationStateChanged) getLocationStore().register(onLocationChanged) getPathDetailsStore().register(onPathDetailsChanged) getMapFeatureStore().register(onMapFeaturesChanged) @@ -96,7 +92,6 @@ export default function App() { onRouteChanged() onErrorChanged() onMapOptionsChanged() - onTurnNavigationStateChanged() onLocationChanged() onPathDetailsChanged() onMapFeaturesChanged() @@ -108,7 +103,6 @@ export default function App() { getRouteStore().deregister(onRouteChanged) getErrorStore().deregister(onErrorChanged) getMapOptionsStore().deregister(onMapOptionsChanged) - getTurnNavigationStore().deregister(onTurnNavigationStateChanged) getLocationStore().deregister(onLocationChanged) getPathDetailsStore().deregister(onPathDetailsChanged) getMapFeatureStore().deregister(onMapFeaturesChanged) @@ -127,7 +121,7 @@ export default function App() { const isSmallScreen = useMediaQuery({ query: '(max-width: 44rem)' }) return ( - +
@@ -141,7 +135,7 @@ export default function App() { error={error} info={info} location={location} - turnNaviState={turnNaviState} + settings={settings} /> ) : ( )}
@@ -168,31 +162,27 @@ interface LayoutProps { mapOptions: MapOptionsStoreState error: ErrorStoreState info: ApiInfo - turnNaviState: TurnNavigationState + settings: Settings } -function LargeScreenLayout({ query, route, map, error, mapOptions, info, location, turnNaviState }: LayoutProps) { +function LargeScreenLayout({ query, route, map, error, mapOptions, info, location, settings }: LayoutProps) { if (location.turnNavigation) return ( <>
- +
Dispatcher.dispatch( new TurnNavigationUpdate({ - soundEnabled: !turnNaviState.soundEnabled, - } as TurnNavigationState) + soundEnabled: !settings.soundEnabled, + } as Settings) ) } > - {turnNaviState.soundEnabled ? ( - - ) : ( - - )} + {settings.soundEnabled ? : }
@@ -224,7 +214,6 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, info, locatio selectedPath={route.selectedPath} currentRequest={query.currentRequest} profile={query.routingProfile.name} - turnNaviState={turnNaviState} />
@@ -246,7 +235,7 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, info, locatio ) } -function SmallScreenLayout({ query, route, map, error, mapOptions, info, location, turnNaviState }: LayoutProps) { +function SmallScreenLayout({ query, route, map, error, mapOptions, info, settings, location }: LayoutProps) { if (location.turnNavigation) return ( <> @@ -258,20 +247,16 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, locatio onClick={() => Dispatcher.dispatch( new TurnNavigationUpdate({ - soundEnabled: !turnNaviState.soundEnabled, - } as TurnNavigationState) + soundEnabled: !settings.soundEnabled, + } as Settings) ) } > - {turnNaviState.soundEnabled ? ( - - ) : ( - - )} + {settings.soundEnabled ? : }
- +
) @@ -296,7 +281,6 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, locatio selectedPath={route.selectedPath} currentRequest={query.currentRequest} profile={query.routingProfile.name} - turnNaviState={turnNaviState} />
diff --git a/src/ShowDistanceInMilesContext.ts b/src/ShowDistanceInMilesContext.ts index 3498d311..95a4f442 100644 --- a/src/ShowDistanceInMilesContext.ts +++ b/src/ShowDistanceInMilesContext.ts @@ -1,2 +1,8 @@ import React from 'react' -export const ShowDistanceInMilesContext = React.createContext(false) +import { Settings } from '@/stores/SettingsStore' +export const ShowDistanceInMilesContext = React.createContext({ + showDistanceInMiles: false, + fakeGPS: false, + acceptedRisk: false, + soundEnabled: false, +}) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 892a8732..1352d6ce 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -4,7 +4,7 @@ import { ApiInfo, Bbox, Path, RoutingArgs, RoutingProfile, RoutingResult } from import { StyleOption } from '@/stores/MapOptionsStore' import { PathDetailsPoint } from '@/stores/PathDetailsStore' import { LocationStoreState } from '@/stores/LocationStore' -import { TurnNavigationState } from '@/stores/TurnNavigationStore' +import { Settings } from '@/stores/SettingsStore' export class InfoReceived implements Action { readonly result: ApiInfo @@ -23,9 +23,9 @@ export class LocationUpdate implements Action { } export class TurnNavigationUpdate implements Action { - readonly update: TurnNavigationState + readonly update: Settings - constructor(update: TurnNavigationState) { + constructor(update: Settings) { this.update = update } } diff --git a/src/index.tsx b/src/index.tsx index b866ea41..4beb4e13 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -5,7 +5,7 @@ import * as config from 'config' import MapActionReceiver from '@/stores/MapActionReceiver' import { createMap, getMap, setMap } from '@/map/map' import MapFeatureStore from '@/stores/MapFeatureStore' -import SettingsStore from '@/stores/SettingsStore' +import SettingsStore, { Settings } from '@/stores/SettingsStore' import { SpeechSynthesizer } from '@/SpeechSynthesizer' import { setTranslation } from '@/translation/Translation' import { getApi, setApi } from '@/api/Api' @@ -23,14 +23,12 @@ import { getQueryStore, getRouteStore, getSettingsStore, - getTurnNavigationStore, setStores, } from '@/stores/Stores' import MapOptionsStore from '@/stores/MapOptionsStore' import LocationStore from '@/stores/LocationStore' import PathDetailsStore from '@/stores/PathDetailsStore' import Dispatcher from '@/stores/Dispatcher' -import TurnNavigationStore, { TurnNavigationState } from '@/stores/TurnNavigationStore' import NavBar from '@/NavBar' import App from '@/App' import { TurnNavigationUpdate } from '@/actions/Actions' @@ -56,7 +54,6 @@ setStores({ infoStore: new ApiInfoStore(), errorStore: new ErrorStore(), mapOptionsStore: new MapOptionsStore(), - turnNavigationStore: new TurnNavigationStore(), locationStore: new LocationStore(speechSynthesizer), pathDetailsStore: new PathDetailsStore(), mapFeatureStore: new MapFeatureStore(), @@ -71,7 +68,6 @@ Dispatcher.register(getRouteStore()) Dispatcher.register(getApiInfoStore()) Dispatcher.register(getErrorStore()) Dispatcher.register(getMapOptionsStore()) -Dispatcher.register(getTurnNavigationStore()) Dispatcher.register(getLocationStore()) Dispatcher.register(getPathDetailsStore()) Dispatcher.register(getMapFeatureStore()) @@ -81,9 +77,7 @@ const smallScreenMediaQuery = window.matchMedia('(max-width: 44rem)') const mapActionReceiver = new MapActionReceiver(getMap(), routeStore, () => smallScreenMediaQuery.matches) Dispatcher.register(mapActionReceiver) -Dispatcher.dispatch( - new TurnNavigationUpdate({ fakeGPS: fake !== null, soundEnabled: fake === null } as TurnNavigationState) -) +Dispatcher.dispatch(new TurnNavigationUpdate({ fakeGPS: fake !== null, soundEnabled: fake === null } as Settings)) getApi().infoWithDispatch() // get infos about the api as soon as possible diff --git a/src/layers/PathDetailPopup.tsx b/src/layers/PathDetailPopup.tsx index 37e9a824..c0c17c0b 100644 --- a/src/layers/PathDetailPopup.tsx +++ b/src/layers/PathDetailPopup.tsx @@ -34,7 +34,7 @@ export default function PathDetailPopup({ map, pathDetails }: PathDetailPopupPro overlay?.setPosition(position) }, [pathDetails.pathDetailsPoint]) - const showDistanceInMiles = useContext(ShowDistanceInMilesContext) + const { showDistanceInMiles } = useContext(ShowDistanceInMilesContext) return ( // todo: use createMapMarker from heightgraph? diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 0cb5669f..7875d6a4 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -16,15 +16,13 @@ import { tr } from '@/translation/Translation' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import { ApiImpl } from '@/api/Api' import { getLocationStore } from '@/stores/Stores' -import turnNavigation from '@/turnNavigation/TurnNavigation' -import { TurnNavigationState } from '@/stores/TurnNavigationStore' +import { Settings } from '@/stores/SettingsStore' export interface RoutingResultsProps { paths: Path[] selectedPath: Path currentRequest: CurrentRequest profile: string - turnNaviState: TurnNavigationState } export default function RoutingResults(props: RoutingResultsProps) { @@ -35,17 +33,7 @@ export default function RoutingResults(props: RoutingResultsProps) { return
    {isShortScreen ? createSingletonListContent(props) : createListContent(props)}
} -function RoutingResult({ - path, - isSelected, - profile, - turnNaviState, -}: { - path: Path - isSelected: boolean - profile: string - turnNaviState: TurnNavigationState -}) { +function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: boolean; profile: string }) { const [isExpanded, setExpanded] = useState(false) const resultSummaryClass = isSelected ? styles.resultSummary + ' ' + styles.selectedResultSummary @@ -59,7 +47,7 @@ function RoutingResult({ const showAndHasSteps = ApiImpl.isBikeLike(profile) && containsValue(path.details.road_class, 'steps') const hasBorderCrossed = crossesBorder(path.details.country) - const showDistanceInMiles = useContext(ShowDistanceInMilesContext) + const { showDistanceInMiles, fakeGPS } = useContext(ShowDistanceInMilesContext) let [showRisk, setShowRisk] = useState(false) if (showRisk) @@ -70,8 +58,8 @@ function RoutingResult({ setShowRisk(false)}>{tr('back')} { - Dispatcher.dispatch(new TurnNavigationUpdate({ acceptedRisk: true } as TurnNavigationState)) - return turnNaviState.fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal() + Dispatcher.dispatch(new TurnNavigationUpdate({ acceptedRisk: true } as Settings)) + return fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal() }} > {tr('accept_risks_after_warning')} @@ -250,32 +238,19 @@ function getLength(paths: Path[], subRequests: SubRequest[]) { function createSingletonListContent(props: RoutingResultsProps) { if (props.paths.length > 0) - return ( - - ) + return if (hasPendingRequests(props.currentRequest.subRequests)) return return '' } -function createListContent({ paths, currentRequest, selectedPath, profile, turnNaviState }: RoutingResultsProps) { +function createListContent({ paths, currentRequest, selectedPath, profile }: RoutingResultsProps) { const length = getLength(paths, currentRequest.subRequests) const result = [] for (let i = 0; i < length; i++) { if (i < paths.length) result.push( - + ) else result.push() } diff --git a/src/sidebar/instructions/Instructions.tsx b/src/sidebar/instructions/Instructions.tsx index dcac75b4..28e54c8b 100644 --- a/src/sidebar/instructions/Instructions.tsx +++ b/src/sidebar/instructions/Instructions.tsx @@ -34,7 +34,7 @@ export default function (props: { instructions: Instruction[] }) { } const Line = function ({ instruction, index }: { instruction: Instruction; index: number }) { - const showDistanceInMiles = useContext(ShowDistanceInMilesContext) + const { showDistanceInMiles } = useContext(ShowDistanceInMilesContext) return (
  • {getTurnSign(instruction.sign, index)} diff --git a/src/stores/SettingsStore.ts b/src/stores/SettingsStore.ts index 10c74293..21f99f87 100644 --- a/src/stores/SettingsStore.ts +++ b/src/stores/SettingsStore.ts @@ -1,15 +1,21 @@ import Store from '@/stores/Store' import { Action } from '@/stores/Dispatcher' -import { ToggleDistanceUnits } from '@/actions/Actions' +import { ToggleDistanceUnits, TurnNavigationUpdate } from '@/actions/Actions' export interface Settings { showDistanceInMiles: boolean + fakeGPS: boolean + acceptedRisk: boolean + soundEnabled: boolean } export default class SettingsStore extends Store { constructor() { super({ showDistanceInMiles: false, + fakeGPS: false, + acceptedRisk: false, + soundEnabled: false, }) } @@ -19,6 +25,8 @@ export default class SettingsStore extends Store { ...state, showDistanceInMiles: !state.showDistanceInMiles, } + } else if (action instanceof TurnNavigationUpdate) { + return { ...state, ...action.update } } return state } diff --git a/src/stores/Stores.ts b/src/stores/Stores.ts index 9bfbd767..7f412f79 100644 --- a/src/stores/Stores.ts +++ b/src/stores/Stores.ts @@ -5,7 +5,6 @@ import ErrorStore from '@/stores/ErrorStore' import MapOptionsStore from '@/stores/MapOptionsStore' import LocationStore from '@/stores/LocationStore' import PathDetailsStore from '@/stores/PathDetailsStore' -import TurnNavigationStore from '@/stores/TurnNavigationStore' import MapFeatureStore from '@/stores/MapFeatureStore' import SettingsStore from '@/stores/SettingsStore' @@ -15,7 +14,6 @@ let routeStore: RouteStore let infoStore: ApiInfoStore let errorStore: ErrorStore let mapOptionsStore: MapOptionsStore -let turnNavigationStore: TurnNavigationStore let locationStore: LocationStore let pathDetailsStore: PathDetailsStore let mapFeatureStore: MapFeatureStore @@ -27,7 +25,6 @@ interface StoresInput { infoStore: ApiInfoStore errorStore: ErrorStore mapOptionsStore: MapOptionsStore - turnNavigationStore: TurnNavigationStore locationStore: LocationStore pathDetailsStore: PathDetailsStore mapFeatureStore: MapFeatureStore @@ -40,7 +37,6 @@ export const setStores = function (stores: StoresInput) { infoStore = stores.infoStore errorStore = stores.errorStore mapOptionsStore = stores.mapOptionsStore - turnNavigationStore = stores.turnNavigationStore locationStore = stores.locationStore pathDetailsStore = stores.pathDetailsStore mapFeatureStore = stores.mapFeatureStore @@ -52,7 +48,6 @@ export const getRouteStore = () => routeStore export const getApiInfoStore = () => infoStore export const getErrorStore = () => errorStore export const getMapOptionsStore = () => mapOptionsStore -export const getTurnNavigationStore = () => turnNavigationStore export const getLocationStore = () => locationStore export const getPathDetailsStore = () => pathDetailsStore export const getMapFeatureStore = () => mapFeatureStore diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts deleted file mode 100644 index d05e86a6..00000000 --- a/src/stores/TurnNavigationStore.ts +++ /dev/null @@ -1,26 +0,0 @@ -import Store from '@/stores/Store' -import { Action } from '@/stores/Dispatcher' -import { TurnNavigationUpdate } from '@/actions/Actions' - -export interface TurnNavigationState { - fakeGPS: boolean - acceptedRisk: boolean - soundEnabled: boolean -} - -export default class TurnNavigationStore extends Store { - constructor() { - super({ - fakeGPS: false, - acceptedRisk: false, - soundEnabled: true, - }) - } - - reduce(state: TurnNavigationState, action: Action): TurnNavigationState { - if (action instanceof TurnNavigationUpdate) { - return { ...state, ...action.update } - } - return state - } -} diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index cfd7d6c8..7f916395 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useReducer, useState } from 'react' +import React, { useContext, useEffect, useReducer, useState } from 'react' import { Instruction, Path } from '@/api/graphhopper' import { metersToText, milliSecondsToText } from '@/Converters' import { getTurnSign } from '@/sidebar/instructions/Instructions' @@ -8,15 +8,14 @@ import endNavigation from '@/turnNavigation/end_turn_navigation.png' import { getLocationStore } from '@/stores/Stores' import { LocationStoreState } from '@/stores/LocationStore' import { tr } from '@/translation/Translation' -import { TurnNavigationState } from '@/stores/TurnNavigationStore' +import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' type TurnNavigationProps = { path: Path location: LocationStoreState - turnNaviState: TurnNavigationState } -export default function ({ path, location, turnNaviState }: TurnNavigationProps) { +export default function ({ path, location }: TurnNavigationProps) { let currentLocation = location.coordinate const { instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance } = getCurrentInstruction( @@ -51,13 +50,14 @@ export default function ({ path, location, turnNaviState }: TurnNavigationProps) let [showTime, setShowTime] = useState(true) let [showDebug, setShowDebug] = useState(false) const [state, dispatch] = useReducer(reducer, { index: -1, distanceToNext: -1, text: '' }) + const { soundEnabled } = useContext(ShowDistanceInMilesContext) // speak text out loud after render only if index changed and distance is close next instruction useEffect(() => { // console.log('useEffect', state, {index: instructionIndex, distanceToNext: distanceToNext}, nextInstruction.text) let text = nextInstruction.street_name - if (turnNaviState.soundEnabled) { + if (soundEnabled) { // making lastAnnounceDistance dependent on location.speed is tricky because then it can change while driving, so pick the constant average speed // TODO use instruction average speed of current+next instruction instead of whole path let averageSpeed = (path.distance / (path.time / 1000)) * 3.6 From 4a6cfe03c9c183ac213fb3d7b075258e27470c92 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 19 Oct 2022 10:05:48 +0200 Subject: [PATCH 108/322] ups, browser heading is in degree --- src/actions/Actions.ts | 1 + src/stores/LocationStore.ts | 15 +++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 1352d6ce..daecd322 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -187,6 +187,7 @@ export class ZoomMapToPoint implements Action { readonly coordinate: Coordinate readonly zoom: number readonly pitch: number + // in radians readonly bearing: number constructor(coordinate: Coordinate, zoom: number, pitch: number, bearing: number) { diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index fb53c24e..eb097a20 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -7,6 +7,7 @@ import { SpeechSynthesizer } from '@/SpeechSynthesizer' import { ApiImpl } from '@/api/Api' import { calcOrientation, toNorthBased } from '@/turnNavigation/GeoMethods' import * as config from 'config' +import {toRadians} from "ol/math"; export interface LocationStoreState { turnNavigation: boolean @@ -78,7 +79,7 @@ export default class LocationStore extends Store { } let currentIndex: number = 0 - LocationStore.locationUpdate({ + this.locationUpdate({ coords: { latitude: latlon[currentIndex][0], longitude: latlon[currentIndex][1], @@ -91,7 +92,7 @@ export default class LocationStore extends Store { currentIndex++ currentIndex %= latlon.length // console.log(currentIndex) - LocationStore.locationUpdate({ + this.locationUpdate({ coords: { latitude: latlon[currentIndex][0], longitude: latlon[currentIndex][1], @@ -102,15 +103,13 @@ export default class LocationStore extends Store { }, 3000) } - private static locationUpdate(pos: any) { - // TODO NOW: 'this is undefined' if called from watchPosition: if (!this.started) return - + private locationUpdate(pos: any) { let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } Dispatcher.dispatch(new LocationUpdate({ coordinate: c, turnNavigation: true, speed: pos.coords.speed })) let bearing: number = pos.coords.heading - if (Number.isNaN(bearing)) console.log('skip dispatching SetViewportToPoint because bearing is ' + bearing) - else Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, bearing)) + if (!bearing || Number.isNaN(bearing)) console.log('skip dispatching SetViewportToPoint because bearing is ' + bearing) + else Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, toRadians(bearing))) } public initReal() { @@ -131,7 +130,7 @@ export default class LocationStore extends Store { enableHighAccuracy: true, } this.watchId = navigator.geolocation.watchPosition( - LocationStore.locationUpdate, + this.locationUpdate, err => { if (this.started) Dispatcher.dispatch(new ErrorAction('location watch error: ' + err.message)) }, From afe7a1d0a44acbfbd5f5ccb670119044657eb3e0 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 19 Oct 2022 10:34:38 +0200 Subject: [PATCH 109/322] use degrees internally and convert for openlayers --- src/actions/Actions.ts | 2 +- src/stores/LocationStore.ts | 6 +++--- src/stores/MapActionReceiver.ts | 4 +++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index daecd322..de2b5098 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -187,7 +187,7 @@ export class ZoomMapToPoint implements Action { readonly coordinate: Coordinate readonly zoom: number readonly pitch: number - // in radians + // in degrees readonly bearing: number constructor(coordinate: Coordinate, zoom: number, pitch: number, bearing: number) { diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index eb097a20..98d63c9f 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -7,7 +7,7 @@ import { SpeechSynthesizer } from '@/SpeechSynthesizer' import { ApiImpl } from '@/api/Api' import { calcOrientation, toNorthBased } from '@/turnNavigation/GeoMethods' import * as config from 'config' -import {toRadians} from "ol/math"; +import {toDegrees, toRadians} from "ol/math"; export interface LocationStoreState { turnNavigation: boolean @@ -73,7 +73,7 @@ export default class LocationStore extends Store { const prevLat = coords[idx - 1][1] const prevLon = coords[idx - 1][0] let o = calcOrientation(lat, lon, prevLat, prevLon) - heading = Math.PI - toNorthBased(o) + heading = toDegrees(toNorthBased(o)) } latlon[idx] = [lat, lon, heading, 4] } @@ -109,7 +109,7 @@ export default class LocationStore extends Store { let bearing: number = pos.coords.heading if (!bearing || Number.isNaN(bearing)) console.log('skip dispatching SetViewportToPoint because bearing is ' + bearing) - else Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, toRadians(bearing))) + else Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, bearing)) } public initReal() { diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 81f98931..5466cc05 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -13,6 +13,7 @@ import { import RouteStore from '@/stores/RouteStore' import { Bbox } from '@/api/graphhopper' import { between } from 'ol/format/filter' +import {toDegrees, toRadians} from "ol/math"; export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -42,7 +43,8 @@ export default class MapActionReceiver implements ActionReceiver { this.map.getView().animate({ zoom: action.zoom, center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), - rotation: action.bearing, + // convert heading in degrees into map orientation + rotation: Math.PI - toRadians(action.bearing), duration: 400, }) } else if (action instanceof RouteRequestSuccess) { From 3d78f712c80696d955c93321c1647714672ac541 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 19 Oct 2022 11:04:08 +0200 Subject: [PATCH 110/322] try sth different --- src/stores/LocationStore.ts | 2 +- src/stores/MapActionReceiver.ts | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 98d63c9f..ba729622 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -72,7 +72,7 @@ export default class LocationStore extends Store { if (idx > 0) { const prevLat = coords[idx - 1][1] const prevLon = coords[idx - 1][0] - let o = calcOrientation(lat, lon, prevLat, prevLon) + let o = calcOrientation(prevLat, prevLon, lat, lon) heading = toDegrees(toNorthBased(o)) } latlon[idx] = [lat, lon, heading, 4] diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 5466cc05..1f9146c6 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -12,8 +12,7 @@ import { } from '@/actions/Actions' import RouteStore from '@/stores/RouteStore' import { Bbox } from '@/api/graphhopper' -import { between } from 'ol/format/filter' -import {toDegrees, toRadians} from "ol/math"; +import { toRadians } from "ol/math"; export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -43,8 +42,8 @@ export default class MapActionReceiver implements ActionReceiver { this.map.getView().animate({ zoom: action.zoom, center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), - // convert heading in degrees into map orientation - rotation: Math.PI - toRadians(action.bearing), + // heading is in degrees and shows direction into which device is going -> convert with '-' into map orientation + rotation: -toRadians(action.bearing), duration: 400, }) } else if (action instanceof RouteRequestSuccess) { From 2f7a6bb1c4207dc9e836e51d4c1dd593a1fe08d0 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 19 Oct 2022 11:36:13 +0200 Subject: [PATCH 111/322] alert to see what is going on --- src/stores/MapActionReceiver.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 1f9146c6..3f899767 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -39,10 +39,12 @@ export default class MapActionReceiver implements ActionReceiver { 'noopener,noreferrer' ) } else if (action instanceof ZoomMapToPoint) { + alert(action.bearing) this.map.getView().animate({ zoom: action.zoom, center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), - // heading is in degrees and shows direction into which device is going -> convert with '-' into map orientation + // heading is in degrees and shows direction into which device is going + // although in the docs they say this is clockwise it seems to be CCW rotation: -toRadians(action.bearing), duration: 400, }) From 02c33159982ab0b3a91c0d3d7084048522b35261 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 19 Oct 2022 11:41:22 +0200 Subject: [PATCH 112/322] wtf now it is working without a change --- src/stores/MapActionReceiver.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 3f899767..6b34e2f8 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -39,7 +39,6 @@ export default class MapActionReceiver implements ActionReceiver { 'noopener,noreferrer' ) } else if (action instanceof ZoomMapToPoint) { - alert(action.bearing) this.map.getView().animate({ zoom: action.zoom, center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), From 5d3f76c2e5865014463ee36f3b0a7bde8ca29fc5 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 19 Oct 2022 12:18:27 +0200 Subject: [PATCH 113/322] do proper navigation.stop --- src/actions/Actions.ts | 3 +++ src/sidebar/RoutingResults.tsx | 9 +++++++-- src/stores/LocationStore.ts | 14 ++++++-------- src/turnNavigation/TurnNavigation.tsx | 7 ++++++- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index de2b5098..9c6aad11 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -14,6 +14,9 @@ export class InfoReceived implements Action { } } +export class NavigationStop implements Action { +} + export class LocationUpdate implements Action { readonly location: LocationStoreState diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 7875d6a4..fd8fac05 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -3,7 +3,7 @@ import { CurrentRequest, RequestState, SubRequest } from '@/stores/QueryStore' import styles from './RoutingResult.module.css' import React, { useContext, useEffect, useState } from 'react' import Dispatcher from '@/stores/Dispatcher' -import { SetSelectedPath, TurnNavigationUpdate } from '@/actions/Actions' +import {NavigationStop, SetSelectedPath, TurnNavigationUpdate, ZoomMapToPoint} from '@/actions/Actions' import { metersToText, milliSecondsToText } from '@/Converters' import PlainButton from '@/PlainButton' import Details from '@/sidebar/list.svg' @@ -55,7 +55,12 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected:
    {tr('warning')}
    - setShowRisk(false)}>{tr('back')} + { + setShowRisk(false) + Dispatcher.dispatch(new NavigationStop()); + }}> + {tr('back')} + { Dispatcher.dispatch(new TurnNavigationUpdate({ acceptedRisk: true } as Settings)) diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index ba729622..83418f73 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -1,6 +1,6 @@ import { Coordinate } from '@/stores/QueryStore' import Store from '@/stores/Store' -import { ErrorAction, LocationUpdate, ZoomMapToPoint } from '@/actions/Actions' +import {ErrorAction, LocationUpdate, NavigationStop, ZoomMapToPoint} from '@/actions/Actions' import Dispatcher, { Action } from '@/stores/Dispatcher' import NoSleep from 'nosleep.js' import { SpeechSynthesizer } from '@/SpeechSynthesizer' @@ -36,7 +36,11 @@ export default class LocationStore extends Store { } reduce(state: LocationStoreState, action: Action): LocationStoreState { - if (action instanceof LocationUpdate) { + if(action instanceof NavigationStop) { + this.stop() + // directly writing the state does not work: this.state.turnNavigation = false + return { coordinate: { lat: 0, lng: 0 }, turnNavigation: false, speed: 0 } + } else if (action instanceof LocationUpdate) { // console.log('LocationUpdate action {}', action.location) return action.location } @@ -155,12 +159,6 @@ export default class LocationStore extends Store { if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) - // exit "navigation view" => use no pitch and no bearing (rotation) - Dispatcher.dispatch(new ZoomMapToPoint(this.state.coordinate, 15, 0, 0)) - - // directly writing the state does not work: this.state.turnNavigation = false - Dispatcher.dispatch(new LocationUpdate({ coordinate: { lat: 0, lng: 0 }, turnNavigation: false, speed: 0 })) - if (this.noSleep) this.noSleep.disable() } } diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 7f916395..ac15c699 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -9,6 +9,8 @@ import { getLocationStore } from '@/stores/Stores' import { LocationStoreState } from '@/stores/LocationStore' import { tr } from '@/translation/Translation' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' +import Dispatcher from "@/stores/Dispatcher"; +import {NavigationStop, ZoomMapToPoint} from "@/actions/Actions"; type TurnNavigationProps = { path: Path @@ -138,7 +140,10 @@ export default function ({ path, location }: TurnNavigationProps) {
    ) : null}
    -
    getLocationStore().stop()}> +
    { + Dispatcher.dispatch(new NavigationStop()); + Dispatcher.dispatch(new ZoomMapToPoint(location.coordinate, 15, 0, 0)) + }}>
    From 4f9f2cd01f857444582204ff4e38805795d7aea9 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 19 Oct 2022 12:19:05 +0200 Subject: [PATCH 114/322] format --- src/actions/Actions.ts | 3 +-- src/sidebar/RoutingResults.tsx | 12 +++++++----- src/stores/LocationStore.ts | 9 +++++---- src/stores/MapActionReceiver.ts | 2 +- src/turnNavigation/TurnNavigation.tsx | 15 +++++++++------ 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 9c6aad11..5b4774cc 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -14,8 +14,7 @@ export class InfoReceived implements Action { } } -export class NavigationStop implements Action { -} +export class NavigationStop implements Action {} export class LocationUpdate implements Action { readonly location: LocationStoreState diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index fd8fac05..68a28cb1 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -3,7 +3,7 @@ import { CurrentRequest, RequestState, SubRequest } from '@/stores/QueryStore' import styles from './RoutingResult.module.css' import React, { useContext, useEffect, useState } from 'react' import Dispatcher from '@/stores/Dispatcher' -import {NavigationStop, SetSelectedPath, TurnNavigationUpdate, ZoomMapToPoint} from '@/actions/Actions' +import { NavigationStop, SetSelectedPath, TurnNavigationUpdate, ZoomMapToPoint } from '@/actions/Actions' import { metersToText, milliSecondsToText } from '@/Converters' import PlainButton from '@/PlainButton' import Details from '@/sidebar/list.svg' @@ -55,10 +55,12 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected:
    {tr('warning')}
    - { - setShowRisk(false) - Dispatcher.dispatch(new NavigationStop()); - }}> + { + setShowRisk(false) + Dispatcher.dispatch(new NavigationStop()) + }} + > {tr('back')} { } reduce(state: LocationStoreState, action: Action): LocationStoreState { - if(action instanceof NavigationStop) { + if (action instanceof NavigationStop) { this.stop() // directly writing the state does not work: this.state.turnNavigation = false return { coordinate: { lat: 0, lng: 0 }, turnNavigation: false, speed: 0 } @@ -112,7 +112,8 @@ export default class LocationStore extends Store { Dispatcher.dispatch(new LocationUpdate({ coordinate: c, turnNavigation: true, speed: pos.coords.speed })) let bearing: number = pos.coords.heading - if (!bearing || Number.isNaN(bearing)) console.log('skip dispatching SetViewportToPoint because bearing is ' + bearing) + if (!bearing || Number.isNaN(bearing)) + console.log('skip dispatching SetViewportToPoint because bearing is ' + bearing) else Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, bearing)) } diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 6b34e2f8..e3567b05 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -12,7 +12,7 @@ import { } from '@/actions/Actions' import RouteStore from '@/stores/RouteStore' import { Bbox } from '@/api/graphhopper' -import { toRadians } from "ol/math"; +import { toRadians } from 'ol/math' export default class MapActionReceiver implements ActionReceiver { readonly map: Map diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index ac15c699..3424cb18 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -9,8 +9,8 @@ import { getLocationStore } from '@/stores/Stores' import { LocationStoreState } from '@/stores/LocationStore' import { tr } from '@/translation/Translation' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' -import Dispatcher from "@/stores/Dispatcher"; -import {NavigationStop, ZoomMapToPoint} from "@/actions/Actions"; +import Dispatcher from '@/stores/Dispatcher' +import { NavigationStop, ZoomMapToPoint } from '@/actions/Actions' type TurnNavigationProps = { path: Path @@ -140,10 +140,13 @@ export default function ({ path, location }: TurnNavigationProps) {
    ) : null}
    -
    { - Dispatcher.dispatch(new NavigationStop()); - Dispatcher.dispatch(new ZoomMapToPoint(location.coordinate, 15, 0, 0)) - }}> +
    { + Dispatcher.dispatch(new NavigationStop()) + Dispatcher.dispatch(new ZoomMapToPoint(location.coordinate, 15, 0, 0)) + }} + >
    From 17d346b2cf5182f02bd4bab1807855540bed7487 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 19 Oct 2022 12:34:01 +0200 Subject: [PATCH 115/322] minor css fix --- src/sidebar/RoutingResult.module.css | 8 +++----- src/sidebar/RoutingResults.tsx | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/sidebar/RoutingResult.module.css b/src/sidebar/RoutingResult.module.css index ba2bc06f..cbb7deff 100644 --- a/src/sidebar/RoutingResult.module.css +++ b/src/sidebar/RoutingResult.module.css @@ -1,7 +1,4 @@ .resultRow { - display: flex; - flex-direction: column; - border-bottom: 1px lightgray solid; } @@ -19,8 +16,9 @@ display: flex; flex-direction: row; justify-content: space-between; - padding: 0 1rem 0 15px; + /* now same border and padding like for selectedResultSummary */ border-left: white solid 0.25rem; + padding: 0 1rem 0 15px; } .selectedResultSummary { @@ -65,7 +63,7 @@ font-size: 12px; float: left; padding-top: 0.15em; - padding-left: 0.5em; + padding-left: 0.4em; } .detailsButton svg, diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 68a28cb1..8f513c1d 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -102,7 +102,7 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected:
  • {isSelected && !showRisk && ( setShowRisk(true)} > From 84e6471542abab22ca0fa1b4d007b82cd98ba2d3 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 19 Oct 2022 12:57:54 +0200 Subject: [PATCH 116/322] reroute: against react, but for now it seems to work ;) --- src/App.tsx | 4 ++-- src/stores/LocationStore.ts | 4 ++-- src/turnNavigation/GeoMethods.ts | 9 +++++---- src/turnNavigation/TurnNavigation.tsx | 13 +++++++++---- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index f2c57d26..b6e1e18d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -170,7 +170,7 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, info, locatio return ( <>
    - +
    - +
    ) diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index b0925457..6dcdfafd 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -70,8 +70,8 @@ export default class LocationStore extends Store { for (let idx = 0; idx < coords.length; idx++) { // very ugly: in JS the random object cannot be initialed with a seed - const lat = coords[idx][1] // + 0.0001 * Math.random() // approx +-5m ? - const lon = coords[idx][0] // + 0.0001 * Math.random() + const lat = coords[idx][1] + 0.001 * Math.random() // approx +-5m ? + const lon = coords[idx][0] + 0.0001 * Math.random() let heading = 0 if (idx > 0) { const prevLat = coords[idx - 1][1] diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 35b05306..0ccdc89b 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -49,11 +49,12 @@ export function getCurrentInstruction( instructionIndex: number timeToNext: number distanceToNext: number + distanceToRoute: number remainingTime: number remainingDistance: number } { let instructionIndex = -1 - let smallestDist = Number.MAX_VALUE + let distanceToRoute = Number.MAX_VALUE let distanceToNext = 10.0 for (let instrIdx = 0; instrIdx < instructions.length; instrIdx++) { @@ -72,8 +73,8 @@ export function getCurrentInstruction( } } - if (dist < smallestDist) { - smallestDist = dist + if (dist < distanceToRoute) { + distanceToRoute = dist // use next instruction or finish instructionIndex = instrIdx + 1 < instructions.length ? instrIdx + 1 : instrIdx const last: number[] = points[points.length - 1] @@ -101,7 +102,7 @@ export function getCurrentInstruction( } } - return { instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance } + return { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance, } } export function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: number): number { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 3424cb18..fd8acf91 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,6 +1,6 @@ import React, { useContext, useEffect, useReducer, useState } from 'react' import { Instruction, Path } from '@/api/graphhopper' -import { metersToText, milliSecondsToText } from '@/Converters' +import {coordinateToText, metersToText, milliSecondsToText} from '@/Converters' import { getTurnSign } from '@/sidebar/instructions/Instructions' import { getCurrentDetails, getCurrentInstruction } from './GeoMethods' import styles from '@/turnNavigation/TurnNavigation.module.css' @@ -10,17 +10,19 @@ import { LocationStoreState } from '@/stores/LocationStore' import { tr } from '@/translation/Translation' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import Dispatcher from '@/stores/Dispatcher' -import { NavigationStop, ZoomMapToPoint } from '@/actions/Actions' +import {NavigationStop, SetPoint, ZoomMapToPoint} from '@/actions/Actions' +import {QueryPoint, QueryStoreState} from "@/stores/QueryStore"; type TurnNavigationProps = { + queryPoints: QueryPoint[] path: Path location: LocationStoreState } -export default function ({ path, location }: TurnNavigationProps) { +export default function ({ queryPoints, path, location }: TurnNavigationProps) { let currentLocation = location.coordinate - const { instructionIndex, timeToNext, distanceToNext, remainingTime, remainingDistance } = getCurrentInstruction( + const { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } = getCurrentInstruction( path.instructions, currentLocation ) @@ -29,6 +31,9 @@ export default function ({ path, location }: TurnNavigationProps) { // TODO too far from route - recalculate? if (instructionIndex < 0) return <>Cannot find instruction + if (distanceToRoute > 50) + Dispatcher.dispatch(new SetPoint({...queryPoints[0], coordinate: location.coordinate} as QueryPoint,false)) + let [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, currentLocation, [ path.details.average_speed, path.details.max_speed, From 2890ecebfa426fcb0b02960bd00e58fa5e167ed0 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 19 Oct 2022 14:44:39 +0200 Subject: [PATCH 117/322] try enableHighAccuracy: true --- src/sidebar/search/AddressInput.tsx | 2 +- src/stores/LocationStore.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sidebar/search/AddressInput.tsx b/src/sidebar/search/AddressInput.tsx index 7748a611..cfb0a1d5 100644 --- a/src/sidebar/search/AddressInput.tsx +++ b/src/sidebar/search/AddressInput.tsx @@ -210,7 +210,7 @@ function onCurrentLocationSelected(onSelect: (queryText: string, coordinate: Coo onSelect('', undefined) }, // DO NOT use e.g. maximumAge: 5_000 -> getCurrentPosition will then never return on mobile firefox!? - { timeout: 300_000 } + { timeout: 300_000, enableHighAccuracy: true } ) } diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 6dcdfafd..d634fe10 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -125,7 +125,7 @@ export default class LocationStore extends Store { console.log('location not supported. In firefox I had to set geo.enabled=true in about:config') } else { console.log('location init ', this.watchId) - // this.speechSynthesizer.synthesize(tr('welcome')) + this.speechSynthesizer.synthesize('welcome') // force calling clearWatch can help to find GPS fix more reliable in android firefox if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) From 91a1a3de8c8ea2d0f682c85cf0dbf9f524ed9c36 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 19 Oct 2022 14:58:03 +0200 Subject: [PATCH 118/322] format --- src/stores/LocationStore.ts | 1 - src/turnNavigation/GeoMethods.ts | 2 +- src/turnNavigation/TurnNavigation.tsx | 18 +++++++++--------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index d634fe10..727571ab 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -125,7 +125,6 @@ export default class LocationStore extends Store { console.log('location not supported. In firefox I had to set geo.enabled=true in about:config') } else { console.log('location init ', this.watchId) - this.speechSynthesizer.synthesize('welcome') // force calling clearWatch can help to find GPS fix more reliable in android firefox if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 0ccdc89b..49605863 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -102,7 +102,7 @@ export function getCurrentInstruction( } } - return { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance, } + return { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } } export function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: number): number { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index fd8acf91..958979a0 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,6 +1,6 @@ import React, { useContext, useEffect, useReducer, useState } from 'react' import { Instruction, Path } from '@/api/graphhopper' -import {coordinateToText, metersToText, milliSecondsToText} from '@/Converters' +import { coordinateToText, metersToText, milliSecondsToText } from '@/Converters' import { getTurnSign } from '@/sidebar/instructions/Instructions' import { getCurrentDetails, getCurrentInstruction } from './GeoMethods' import styles from '@/turnNavigation/TurnNavigation.module.css' @@ -10,8 +10,8 @@ import { LocationStoreState } from '@/stores/LocationStore' import { tr } from '@/translation/Translation' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import Dispatcher from '@/stores/Dispatcher' -import {NavigationStop, SetPoint, ZoomMapToPoint} from '@/actions/Actions' -import {QueryPoint, QueryStoreState} from "@/stores/QueryStore"; +import { NavigationStop, SetPoint, ZoomMapToPoint } from '@/actions/Actions' +import { QueryPoint, QueryStoreState } from '@/stores/QueryStore' type TurnNavigationProps = { queryPoints: QueryPoint[] @@ -22,17 +22,17 @@ type TurnNavigationProps = { export default function ({ queryPoints, path, location }: TurnNavigationProps) { let currentLocation = location.coordinate - const { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } = getCurrentInstruction( - path.instructions, - currentLocation - ) + const { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } = + getCurrentInstruction(path.instructions, currentLocation) // TODO NOW we have to move this below the useEffect methods etc as react doesn't like conditional creation of these // TODO too far from route - recalculate? if (instructionIndex < 0) return <>Cannot find instruction - if (distanceToRoute > 50) - Dispatcher.dispatch(new SetPoint({...queryPoints[0], coordinate: location.coordinate} as QueryPoint,false)) + if (distanceToRoute > 50) { + Dispatcher.dispatch(new SetPoint({ ...queryPoints[0], coordinate: location.coordinate } as QueryPoint, false)) + this.speechSynthesizer.synthesize('reroute') + } let [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, currentLocation, [ path.details.average_speed, From d9669f367e806abc8b4b6d656709247e8a307388 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 19 Oct 2022 14:59:00 +0200 Subject: [PATCH 119/322] fix this --- src/turnNavigation/TurnNavigation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 958979a0..c8b7b74e 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -31,7 +31,7 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) { if (distanceToRoute > 50) { Dispatcher.dispatch(new SetPoint({ ...queryPoints[0], coordinate: location.coordinate } as QueryPoint, false)) - this.speechSynthesizer.synthesize('reroute') + getLocationStore().getSpeechSynthesizer().synthesize('reroute') } let [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, currentLocation, [ From 5ca34e50c82d401b11a9c1b27df640b315d0b414 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 27 Oct 2022 16:34:34 +0200 Subject: [PATCH 120/322] skip warning if already accepted --- src/actions/Actions.ts | 2 +- src/sidebar/RoutingResults.tsx | 18 ++++++++++++------ src/stores/LocationStore.ts | 4 ++-- src/turnNavigation/TurnNavigation.tsx | 8 ++++---- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 04c6e31e..ed842de0 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -14,7 +14,7 @@ export class InfoReceived implements Action { } } -export class NavigationStop implements Action {} +export class TurnNavigationStop implements Action {} export class LocationUpdate implements Action { readonly location: LocationStoreState diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 9fe2fc3d..74895404 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -3,7 +3,7 @@ import { CurrentRequest, RequestState, SubRequest } from '@/stores/QueryStore' import styles from './RoutingResult.module.css' import { useContext, useEffect, useState } from 'react' import Dispatcher from '@/stores/Dispatcher' -import { NavigationStop, SetSelectedPath, TurnNavigationUpdate, ZoomMapToPoint } from '@/actions/Actions' +import { TurnNavigationStop, SetSelectedPath, TurnNavigationUpdate } from '@/actions/Actions' import { metersToText, milliSecondsToText } from '@/Converters' import PlainButton from '@/PlainButton' import Details from '@/sidebar/list.svg' @@ -48,9 +48,9 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: const hasBorderCrossed = crossesBorder(path.details.country) const showHints = hasFords || hasTolls || hasFerries || showAndHasBadTracks || showAndHasSteps || hasBorderCrossed - const { showDistanceInMiles, fakeGPS } = useContext(ShowDistanceInMilesContext) + const { showDistanceInMiles, fakeGPS, acceptedRisk } = useContext(ShowDistanceInMilesContext) let [showRisk, setShowRisk] = useState(false) - if (showRisk) + if (!acceptedRisk && showRisk) return (
    {tr('warning')}
    @@ -58,7 +58,7 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: { setShowRisk(false) - Dispatcher.dispatch(new NavigationStop()) + Dispatcher.dispatch(new TurnNavigationStop()) }} > {tr('back')} @@ -66,7 +66,7 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: { Dispatcher.dispatch(new TurnNavigationUpdate({ acceptedRisk: true } as Settings)) - return fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal() + fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal() }} > {tr('accept_risks_after_warning')} @@ -101,7 +101,13 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: )}
    {isSelected && !showRisk && ( - setShowRisk(true)}> + { + if (!acceptedRisk) setShowRisk(true) + else fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal() + }} + >
    {tr('Navi')}
    diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index 727571ab..e3591105 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -1,6 +1,6 @@ import { Coordinate } from '@/stores/QueryStore' import Store from '@/stores/Store' -import { ErrorAction, LocationUpdate, NavigationStop, ZoomMapToPoint } from '@/actions/Actions' +import { ErrorAction, LocationUpdate, TurnNavigationStop, ZoomMapToPoint } from '@/actions/Actions' import Dispatcher, { Action } from '@/stores/Dispatcher' import NoSleep from 'nosleep.js' import { SpeechSynthesizer } from '@/SpeechSynthesizer' @@ -36,7 +36,7 @@ export default class LocationStore extends Store { } reduce(state: LocationStoreState, action: Action): LocationStoreState { - if (action instanceof NavigationStop) { + if (action instanceof TurnNavigationStop) { this.stop() // directly writing the state does not work: this.state.turnNavigation = false return { coordinate: { lat: 0, lng: 0 }, turnNavigation: false, speed: 0 } diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index c8b7b74e..586ba9e0 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,6 +1,6 @@ import React, { useContext, useEffect, useReducer, useState } from 'react' import { Instruction, Path } from '@/api/graphhopper' -import { coordinateToText, metersToText, milliSecondsToText } from '@/Converters' +import { metersToText, milliSecondsToText } from '@/Converters' import { getTurnSign } from '@/sidebar/instructions/Instructions' import { getCurrentDetails, getCurrentInstruction } from './GeoMethods' import styles from '@/turnNavigation/TurnNavigation.module.css' @@ -10,8 +10,8 @@ import { LocationStoreState } from '@/stores/LocationStore' import { tr } from '@/translation/Translation' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import Dispatcher from '@/stores/Dispatcher' -import { NavigationStop, SetPoint, ZoomMapToPoint } from '@/actions/Actions' -import { QueryPoint, QueryStoreState } from '@/stores/QueryStore' +import { TurnNavigationStop, SetPoint, ZoomMapToPoint } from '@/actions/Actions' +import { QueryPoint } from '@/stores/QueryStore' type TurnNavigationProps = { queryPoints: QueryPoint[] @@ -148,7 +148,7 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) {
    { - Dispatcher.dispatch(new NavigationStop()) + Dispatcher.dispatch(new TurnNavigationStop()) Dispatcher.dispatch(new ZoomMapToPoint(location.coordinate, 15, 0, 0)) }} > From 963e7326ab16ace45f94688c9fbbaf494bbf9282 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 27 Oct 2022 16:43:42 +0200 Subject: [PATCH 121/322] simplify --- src/turnNavigation/TurnNavigation.tsx | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 586ba9e0..57149782 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -46,17 +46,9 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) { const nextInstruction: Instruction = path.instructions[instructionIndex] - // not sure how to access old state with useState alone - function reducer( - state: { distanceToNext: number; index: number; text: string }, - action: { distanceToNext: number; index: number; text: string } - ) { - return action - } - let [showTime, setShowTime] = useState(true) let [showDebug, setShowDebug] = useState(false) - const [state, dispatch] = useReducer(reducer, { index: -1, distanceToNext: -1, text: '' }) + const [state, dispatch] = useState({ index: -1, distanceToNext: -1, text: '' }) const { soundEnabled } = useContext(ShowDistanceInMilesContext) // speak text out loud after render only if index changed and distance is close next instruction @@ -132,7 +124,7 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) { )}
    {metersToText(remainingDistance, false)}
    -
    setShowDebug(!showDebug)}> +
    setShowDebug(!showDebug)}>
    {currentSpeed} km/h
    {maxSpeed != null ? (
    {Math.round(maxSpeed)}
    @@ -155,7 +147,7 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) {
    -
    {state.text}
    +
    {state.text}
    From 8f94c8ba78f7da2bd8847676ce71617ed4f26aac Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 27 Oct 2022 16:47:11 +0200 Subject: [PATCH 122/322] mini refactoring --- src/turnNavigation/TurnNavigation.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 57149782..12c76ee0 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -48,7 +48,7 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) { let [showTime, setShowTime] = useState(true) let [showDebug, setShowDebug] = useState(false) - const [state, dispatch] = useState({ index: -1, distanceToNext: -1, text: '' }) + const [state, setState] = useState({ instructionIndex: -1, distanceToNext: -1, text: '' }) const { soundEnabled } = useContext(ShowDistanceInMilesContext) // speak text out loud after render only if index changed and distance is close next instruction @@ -64,7 +64,7 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) { if ( distanceToNext <= lastAnnounceDistance && - (state.distanceToNext > lastAnnounceDistance || instructionIndex != state.index) + (state.distanceToNext > lastAnnounceDistance || instructionIndex != state.instructionIndex) ) { getLocationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) } @@ -74,7 +74,7 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) { averageSpeed > 15 && // two announcements only if faster speed distanceToNext > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) distanceToNext <= firstAnnounceDistance && - (state.distanceToNext > firstAnnounceDistance || instructionIndex != state.index) + (state.distanceToNext > firstAnnounceDistance || instructionIndex != state.instructionIndex) ) { let inString = distanceToNext > 800 @@ -87,7 +87,7 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) { } } - dispatch({ index: instructionIndex, distanceToNext: distanceToNext, text: text }) + setState({ instructionIndex: instructionIndex, distanceToNext: distanceToNext, text: text }) }, [instructionIndex, distanceToNext]) const arrivalDate = new Date() From 750e4f727a6bd8d57c34c10616e59a0a0a335245 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 27 Oct 2022 17:06:43 +0200 Subject: [PATCH 123/322] cancel previously spoken words to avoid queuing for rerouting --- src/SpeechSynthesizer.ts | 1 + src/turnNavigation/TurnNavigation.tsx | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/SpeechSynthesizer.ts b/src/SpeechSynthesizer.ts index 54ab85a5..6823ee09 100644 --- a/src/SpeechSynthesizer.ts +++ b/src/SpeechSynthesizer.ts @@ -17,6 +17,7 @@ export class SpeechSynthesizer { if (offline) { let utterance = new SpeechSynthesisUtterance(text) utterance.lang = this.locale + if(speechSynthesis.pending) speechSynthesis.cancel() speechSynthesis.speak(utterance) } else { this.synthesizeOnline(text) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 12c76ee0..9088bec1 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useEffect, useReducer, useState } from 'react' +import React, { useContext, useEffect, useState } from 'react' import { Instruction, Path } from '@/api/graphhopper' import { metersToText, milliSecondsToText } from '@/Converters' import { getTurnSign } from '@/sidebar/instructions/Instructions' @@ -31,7 +31,8 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) { if (distanceToRoute > 50) { Dispatcher.dispatch(new SetPoint({ ...queryPoints[0], coordinate: location.coordinate } as QueryPoint, false)) - getLocationStore().getSpeechSynthesizer().synthesize('reroute') + getLocationStore().getSpeechSynthesizer().synthesize(tr('reroute')) + return <>Rerouting } let [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, currentLocation, [ From f7bfe447c44138f6d3fb65f87b2b3a3f88aa796d Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 27 Oct 2022 17:50:40 +0200 Subject: [PATCH 124/322] move navigation center to the bottom --- src/SpeechSynthesizer.ts | 2 +- src/actions/Actions.ts | 4 +++- src/map/ContextMenuContent.tsx | 2 +- src/stores/LocationStore.ts | 2 +- src/stores/MapActionReceiver.ts | 10 ++++++++-- src/turnNavigation/TurnNavigation.tsx | 2 +- 6 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/SpeechSynthesizer.ts b/src/SpeechSynthesizer.ts index 6823ee09..419d7da9 100644 --- a/src/SpeechSynthesizer.ts +++ b/src/SpeechSynthesizer.ts @@ -17,7 +17,7 @@ export class SpeechSynthesizer { if (offline) { let utterance = new SpeechSynthesisUtterance(text) utterance.lang = this.locale - if(speechSynthesis.pending) speechSynthesis.cancel() + if (speechSynthesis.pending) speechSynthesis.cancel() speechSynthesis.speak(utterance) } else { this.synthesizeOnline(text) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index ed842de0..c222d050 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -191,12 +191,14 @@ export class ZoomMapToPoint implements Action { readonly pitch: number // in degrees readonly bearing: number + readonly navigationOffset: boolean - constructor(coordinate: Coordinate, zoom: number, pitch: number, bearing: number) { + constructor(coordinate: Coordinate, zoom: number, pitch: number, bearing: number, navigationOffset: boolean) { this.coordinate = coordinate this.zoom = zoom this.pitch = pitch this.bearing = bearing + this.navigationOffset = navigationOffset } } diff --git a/src/map/ContextMenuContent.tsx b/src/map/ContextMenuContent.tsx index ab635b2d..104d5174 100644 --- a/src/map/ContextMenuContent.tsx +++ b/src/map/ContextMenuContent.tsx @@ -112,7 +112,7 @@ export function ContextMenuContent({ className={styles.entry} onClick={() => { onSelect() - Dispatcher.dispatch(new ZoomMapToPoint(coordinate, 8, 0, 0)) + Dispatcher.dispatch(new ZoomMapToPoint(coordinate, 8, 0, 0, false)) }} > {tr('center_map')} diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts index e3591105..93c5c1f7 100644 --- a/src/stores/LocationStore.ts +++ b/src/stores/LocationStore.ts @@ -114,7 +114,7 @@ export default class LocationStore extends Store { if (!bearing || Number.isNaN(bearing)) console.log('skip dispatching SetViewportToPoint because bearing is ' + bearing) - else Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, bearing)) + else Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, bearing, true)) } public initReal() { diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 32b72fd1..d43990e1 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -32,11 +32,17 @@ export default class MapActionReceiver implements ActionReceiver { // the map has not been rendered for the first time yet fitBounds(this.map, action.bbox, isSmallScreen, [window.innerWidth, window.innerHeight]) } else if (action instanceof ZoomMapToPoint) { + // if navigating move to the lower half + if (action.navigationOffset) { + const size = this.map.getSize() // [width, height] + this.map.getView().padding = [size ? size[1] / 2 : 0, 0, 0, 0] + } + this.map.getView().animate({ zoom: action.zoom, center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), - // heading is in degrees and shows direction into which device is going - // although in the docs they say this is clockwise it seems to be CCW + // The heading is in degrees and shows direction into which device is going. + // And although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. rotation: -toRadians(action.bearing), duration: 400, }) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 9088bec1..fbb432d3 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -142,7 +142,7 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) { className={styles.thirdCol} onClick={() => { Dispatcher.dispatch(new TurnNavigationStop()) - Dispatcher.dispatch(new ZoomMapToPoint(location.coordinate, 15, 0, 0)) + Dispatcher.dispatch(new ZoomMapToPoint(location.coordinate, 15, 0, 0, false)) }} > From d70c8bb0cd133269c40cc8d2fc75e9d0ad39725c Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 27 Oct 2022 23:17:18 +0200 Subject: [PATCH 125/322] useEffect is the proper way and should avoid unnecessary updates --- src/turnNavigation/GeoMethods.ts | 2 +- src/turnNavigation/TurnNavigation.tsx | 103 ++++++++++++++------------ 2 files changed, 58 insertions(+), 47 deletions(-) diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 49605863..31beb15d 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -2,7 +2,7 @@ import { Instruction, Path } from '@/api/graphhopper' import { Coordinate } from '@/stores/QueryStore' import { or } from 'ol/format/filter' -export function getCurrentDetails(path: Path, location: Coordinate, details: [any, any, any][][]): number[] { +export function getCurrentDetails(path: Path, location: Coordinate, details: [any, any, any][][]): any[] { let smallestDist = Number.MAX_VALUE const points = path.points.coordinates let foundIndex = -1 diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index fbb432d3..76eaa09e 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,7 +1,7 @@ import React, { useContext, useEffect, useState } from 'react' import { Instruction, Path } from '@/api/graphhopper' import { metersToText, milliSecondsToText } from '@/Converters' -import { getTurnSign } from '@/sidebar/instructions/Instructions' +import instructions, { getTurnSign } from '@/sidebar/instructions/Instructions' import { getCurrentDetails, getCurrentInstruction } from './GeoMethods' import styles from '@/turnNavigation/TurnNavigation.module.css' import endNavigation from '@/turnNavigation/end_turn_navigation.png' @@ -22,39 +22,38 @@ type TurnNavigationProps = { export default function ({ queryPoints, path, location }: TurnNavigationProps) { let currentLocation = location.coordinate - const { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } = - getCurrentInstruction(path.instructions, currentLocation) - - // TODO NOW we have to move this below the useEffect methods etc as react doesn't like conditional creation of these - // TODO too far from route - recalculate? - if (instructionIndex < 0) return <>Cannot find instruction - - if (distanceToRoute > 50) { - Dispatcher.dispatch(new SetPoint({ ...queryPoints[0], coordinate: location.coordinate } as QueryPoint, false)) - getLocationStore().getSpeechSynthesizer().synthesize(tr('reroute')) - return <>Rerouting - } - - let [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, currentLocation, [ - path.details.average_speed, - path.details.max_speed, - path.details.surface, - path.details.road_class, - ]) - - estimatedAvgSpeed = Math.round(estimatedAvgSpeed) - // console.log('remaining distance: ' + remainingDistance + ', time: ' + remainingTime + ', avg: ' + estimatedAvgSpeed + ", max: " + maxSpeed) - - const nextInstruction: Instruction = path.instructions[instructionIndex] - let [showTime, setShowTime] = useState(true) let [showDebug, setShowDebug] = useState(false) - const [state, setState] = useState({ instructionIndex: -1, distanceToNext: -1, text: '' }) + const [instructionState, setInstructionState] = useState({ + index: -1, + distanceToNext: -1, + remainingTime: -1, + remainingDistance: -1, + text: '', + }) + + const [pathDetails, setPathDetails] = useState({ maxSpeed: -1, estimatedAvgSpeed: -1, surface: '', roadClass: '' }) const { soundEnabled } = useContext(ShowDistanceInMilesContext) - // speak text out loud after render only if index changed and distance is close next instruction + // render only if index changed and distance is close next instruction useEffect(() => { - // console.log('useEffect', state, {index: instructionIndex, distanceToNext: distanceToNext}, nextInstruction.text) + const { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } = + getCurrentInstruction(path.instructions, currentLocation) + + if (instructionIndex < 0) return + + // TODO NOW how can we avoid calling this inside useEffect!? + // TODO NOW if this dispatch is called we get an undefined instruction and this is necessary below: !path.instructions[instructionState.index] + // and for a short time the "cannot find instruction" screen is displayed (flickering) + if (distanceToRoute > 50) { + Dispatcher.dispatch( + new SetPoint({ ...queryPoints[0], coordinate: location.coordinate } as QueryPoint, false) + ) + getLocationStore().getSpeechSynthesizer().synthesize(tr('reroute')) + return + } + + const nextInstruction: Instruction = path.instructions[instructionIndex] let text = nextInstruction.street_name if (soundEnabled) { @@ -65,7 +64,7 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) { if ( distanceToNext <= lastAnnounceDistance && - (state.distanceToNext > lastAnnounceDistance || instructionIndex != state.instructionIndex) + (instructionState.distanceToNext > lastAnnounceDistance || instructionIndex != instructionState.index) ) { getLocationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) } @@ -75,33 +74,43 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) { averageSpeed > 15 && // two announcements only if faster speed distanceToNext > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) distanceToNext <= firstAnnounceDistance && - (state.distanceToNext > firstAnnounceDistance || instructionIndex != state.instructionIndex) + (instructionState.distanceToNext > firstAnnounceDistance || instructionIndex != instructionState.index) ) { let inString = distanceToNext > 800 ? tr('in_km_singular') : tr('in_m', ['' + Math.round(distanceToNext / 100) * 100]) - // console.log(inString + ' ' + nextInstruction.text) getLocationStore() .getSpeechSynthesizer() .synthesize(inString + ' ' + nextInstruction.text) } } - setState({ instructionIndex: instructionIndex, distanceToNext: distanceToNext, text: text }) - }, [instructionIndex, distanceToNext]) + setInstructionState({ index: instructionIndex, distanceToNext, remainingTime, remainingDistance, text }) + + let [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, currentLocation, [ + path.details.average_speed, + path.details.max_speed, + path.details.surface, + path.details.road_class, + ]) + setPathDetails({ estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }) + }, [currentLocation, path]) const arrivalDate = new Date() const currentSpeed = Math.round(location.speed * 3.6) - arrivalDate.setMilliseconds(arrivalDate.getSeconds() + remainingTime) + arrivalDate.setMilliseconds(arrivalDate.getSeconds() + instructionState.remainingTime) const min = arrivalDate.getMinutes() - return ( + + return instructionState.index < 0 || !path.instructions[instructionState.index] ? ( + <>Cannot find instruction + ) : ( <>
    -
    {getTurnSign(nextInstruction.sign, instructionIndex)}
    -
    {metersToText(distanceToNext, false)}
    +
    {getTurnSign(path.instructions[instructionState.index].sign, instructionState.index)}
    +
    {metersToText(instructionState.distanceToNext, false)}
    @@ -116,25 +125,27 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) {
    ) : (
    - {milliSecondsToText(remainingTime)} + {milliSecondsToText(instructionState.remainingTime)}
    )} -
    {metersToText(remainingDistance, false)}
    +
    + {metersToText(instructionState.remainingDistance, false)} +
    setShowDebug(!showDebug)}>
    {currentSpeed} km/h
    - {maxSpeed != null ? ( -
    {Math.round(maxSpeed)}
    + {pathDetails.maxSpeed != null ? ( +
    {Math.round(pathDetails.maxSpeed)}
    ) : null} {showDebug ? (
    -
    {estimatedAvgSpeed}
    -
    {surface}
    -
    {roadClass}
    +
    {pathDetails.estimatedAvgSpeed}
    +
    {pathDetails.surface}
    +
    {pathDetails.roadClass}
    ) : null}
    @@ -148,7 +159,7 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) {
    -
    {state.text}
    +
    {instructionState.text}
    From 503fe1a76b6188db36547a91d42cabfa2a1a502a Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 15:04:36 +0200 Subject: [PATCH 126/322] much better state concept that also works for rerouting --- src/App.tsx | 61 +++-- src/ShowDistanceInMilesContext.ts | 5 +- src/actions/Actions.ts | 34 ++- src/api/Api.ts | 2 +- src/api/graphhopper.d.ts | 1 + src/index.tsx | 12 +- src/layers/UsePathsLayer.tsx | 20 +- src/sidebar/RoutingResults.tsx | 27 +-- src/stores/LocationStore.ts | 164 -------------- src/stores/MapActionReceiver.ts | 4 +- src/stores/RouteStore.ts | 10 +- src/stores/SettingsStore.ts | 10 +- src/stores/Stores.ts | 10 +- src/stores/TurnNavigationStore.ts | 310 ++++++++++++++++++++++++++ src/turnNavigation/TurnNavigation.tsx | 129 ++--------- 15 files changed, 439 insertions(+), 360 deletions(-) delete mode 100644 src/stores/LocationStore.ts create mode 100644 src/stores/TurnNavigationStore.ts diff --git a/src/App.tsx b/src/App.tsx index 5563b11f..5bba161f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,7 +4,7 @@ import styles from './App.module.css' import { getApiInfoStore, getErrorStore, - getLocationStore, + getTurnNavigationStore, getMapFeatureStore, getMapOptionsStore, getPathDetailsStore, @@ -25,7 +25,7 @@ import { MapOptionsStoreState } from '@/stores/MapOptionsStore' import { ErrorStoreState } from '@/stores/ErrorStore' import Search from '@/sidebar/search/Search' import ErrorMessage from '@/sidebar/ErrorMessage' -import { LocationStoreState } from './stores/LocationStore' +import {TNSettingsState, TurnNavigationStoreState} from './stores/TurnNavigationStore' import useBackgroundLayer from '@/layers/UseBackgroundLayer' import useQueryPointsLayer from '@/layers/UseQueryPointsLayer' import usePathsLayer from '@/layers/UsePathsLayer' @@ -41,14 +41,14 @@ import useUrbanDensityLayer from '@/layers/UseUrbanDensityLayer' import useMapBorderLayer from '@/layers/UseMapBorderLayer' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import RoutingProfiles from '@/sidebar/search/routingProfiles/RoutingProfiles' -import { TurnNavigationUpdate } from '@/actions/Actions' +import { TurnNavigationSettingsUpdate } from '@/actions/Actions' import Dispatcher from '@/stores/Dispatcher' import VolumeUpIcon from '@/turnNavigation/volume_up.svg' import VolumeOffIcon from '@/turnNavigation/volume_off.svg' import PlainButton from '@/PlainButton' import TurnNavigation from '@/turnNavigation/TurnNavigation' import useCurrentLocationLayer from '@/layers/CurrentLocationLayer' -import { Settings } from '@/stores/SettingsStore' +import turnNavigation from "@/turnNavigation/TurnNavigation"; export const POPUP_CONTAINER_ID = 'popup-container' export const SIDEBAR_CONTENT_ID = 'sidebar-content' @@ -58,7 +58,7 @@ export default function App() { const [query, setQuery] = useState(getQueryStore().state) const [info, setInfo] = useState(getApiInfoStore().state) const [route, setRoute] = useState(getRouteStore().state) - const [location, setLocation] = useState(getLocationStore().state) + const [turnNavigation, setTurnNavigation] = useState(getTurnNavigationStore().state) const [error, setError] = useState(getErrorStore().state) const [mapOptions, setMapOptions] = useState(getMapOptionsStore().state) const [pathDetails, setPathDetails] = useState(getPathDetailsStore().state) @@ -73,7 +73,7 @@ export default function App() { const onRouteChanged = () => setRoute(getRouteStore().state) const onErrorChanged = () => setError(getErrorStore().state) const onMapOptionsChanged = () => setMapOptions(getMapOptionsStore().state) - const onLocationChanged = () => setLocation(getLocationStore().state) + const onTurnNavigationChanged = () => setTurnNavigation(getTurnNavigationStore().state) const onPathDetailsChanged = () => setPathDetails(getPathDetailsStore().state) const onMapFeaturesChanged = () => setMapFeatures(getMapFeatureStore().state) @@ -83,7 +83,7 @@ export default function App() { getRouteStore().register(onRouteChanged) getErrorStore().register(onErrorChanged) getMapOptionsStore().register(onMapOptionsChanged) - getLocationStore().register(onLocationChanged) + getTurnNavigationStore().register(onTurnNavigationChanged) getPathDetailsStore().register(onPathDetailsChanged) getMapFeatureStore().register(onMapFeaturesChanged) @@ -92,7 +92,7 @@ export default function App() { onRouteChanged() onErrorChanged() onMapOptionsChanged() - onLocationChanged() + onTurnNavigationChanged() onPathDetailsChanged() onMapFeaturesChanged() @@ -103,7 +103,7 @@ export default function App() { getRouteStore().deregister(onRouteChanged) getErrorStore().deregister(onErrorChanged) getMapOptionsStore().deregister(onMapOptionsChanged) - getLocationStore().deregister(onLocationChanged) + getTurnNavigationStore().deregister(onTurnNavigationChanged) getPathDetailsStore().deregister(onPathDetailsChanged) getMapFeatureStore().deregister(onMapFeaturesChanged) } @@ -114,10 +114,10 @@ export default function App() { useMapBorderLayer(map, info.bbox) useRoutingGraphLayer(map, mapOptions.routingGraphEnabled) useUrbanDensityLayer(map, mapOptions.urbanDensityEnabled) - usePathsLayer(map, route.routingResult.paths, route.selectedPath) + usePathsLayer(map, route, turnNavigation) useQueryPointsLayer(map, query.queryPoints) usePathDetailsLayer(map, pathDetails) - useCurrentLocationLayer(map, location.coordinate) + useCurrentLocationLayer(map, turnNavigation.coordinate) const isSmallScreen = useMediaQuery({ query: '(max-width: 44rem)' }) return ( @@ -134,8 +134,7 @@ export default function App() { mapOptions={mapOptions} error={error} info={info} - location={location} - settings={settings} + turnNavigation={turnNavigation} /> ) : ( )}
    @@ -157,32 +155,31 @@ export default function App() { interface LayoutProps { query: QueryStoreState route: RouteStoreState - location: LocationStoreState + turnNavigation: TurnNavigationStoreState map: Map mapOptions: MapOptionsStoreState error: ErrorStoreState info: ApiInfo - settings: Settings } -function LargeScreenLayout({ query, route, map, error, mapOptions, info, location, settings }: LayoutProps) { - if (location.turnNavigation) +function LargeScreenLayout({ query, route, map, error, mapOptions, info, turnNavigation }: LayoutProps) { + if (turnNavigation.enabled) return ( <>
    - +
    Dispatcher.dispatch( - new TurnNavigationUpdate({ - soundEnabled: !settings.soundEnabled, - } as Settings) + new TurnNavigationSettingsUpdate({ + soundEnabled: !turnNavigation.settings.soundEnabled, + } as TNSettingsState) ) } > - {settings.soundEnabled ? : } + {turnNavigation.settings.soundEnabled ? : }
    @@ -214,6 +211,7 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, info, locatio selectedPath={route.selectedPath} currentRequest={query.currentRequest} profile={query.routingProfile.name} + turnNavigation={turnNavigation} />
    @@ -235,8 +233,8 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, info, locatio ) } -function SmallScreenLayout({ query, route, map, error, mapOptions, info, settings, location }: LayoutProps) { - if (location.turnNavigation) +function SmallScreenLayout({ query, route, map, error, mapOptions, info, turnNavigation }: LayoutProps) { + if (turnNavigation.enabled) return ( <>
    @@ -246,17 +244,17 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, setting Dispatcher.dispatch( - new TurnNavigationUpdate({ - soundEnabled: !settings.soundEnabled, - } as Settings) + new TurnNavigationSettingsUpdate({ + soundEnabled: !turnNavigation.settings.soundEnabled, + } as TNSettingsState) ) } > - {settings.soundEnabled ? : } + {turnNavigation.settings.soundEnabled ? : }
    - +
    ) @@ -281,6 +279,7 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, setting selectedPath={route.selectedPath} currentRequest={query.currentRequest} profile={query.routingProfile.name} + turnNavigation={turnNavigation} />
    diff --git a/src/ShowDistanceInMilesContext.ts b/src/ShowDistanceInMilesContext.ts index 95a4f442..d90d5a03 100644 --- a/src/ShowDistanceInMilesContext.ts +++ b/src/ShowDistanceInMilesContext.ts @@ -1,8 +1,5 @@ import React from 'react' import { Settings } from '@/stores/SettingsStore' export const ShowDistanceInMilesContext = React.createContext({ - showDistanceInMiles: false, - fakeGPS: false, - acceptedRisk: false, - soundEnabled: false, + showDistanceInMiles: false }) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index c222d050..3b50be1c 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -3,7 +3,7 @@ import { Coordinate, CustomModel, QueryPoint } from '@/stores/QueryStore' import { ApiInfo, Bbox, Path, RoutingArgs, RoutingProfile, RoutingResult } from '@/api/graphhopper' import { StyleOption } from '@/stores/MapOptionsStore' import { PathDetailsPoint } from '@/stores/PathDetailsStore' -import { LocationStoreState } from '@/stores/LocationStore' +import {TNSettingsState, TurnNavigationStoreState} from '@/stores/TurnNavigationStore' import { Settings } from '@/stores/SettingsStore' export class InfoReceived implements Action { @@ -17,18 +17,30 @@ export class InfoReceived implements Action { export class TurnNavigationStop implements Action {} export class LocationUpdate implements Action { - readonly location: LocationStoreState + readonly coordinate: Coordinate + readonly speed: number + readonly heading: number - constructor(location: LocationStoreState) { - this.location = location + constructor(coordinate: Coordinate, speed: number, heading: number) { + this.coordinate = coordinate; + this.speed = speed; + this.heading = heading; } } -export class TurnNavigationUpdate implements Action { - readonly update: Settings +export class TurnNavigationSettingsUpdate implements Action { + readonly settings: TNSettingsState + + constructor(settings: TNSettingsState) { + this.settings = settings + } +} - constructor(update: Settings) { - this.update = update +export class TurnNavigationRerouting implements Action { + readonly path: Path + + constructor(path: Path) { + this.path = path; } } @@ -190,14 +202,14 @@ export class ZoomMapToPoint implements Action { readonly zoom: number readonly pitch: number // in degrees - readonly bearing: number + readonly heading: number readonly navigationOffset: boolean - constructor(coordinate: Coordinate, zoom: number, pitch: number, bearing: number, navigationOffset: boolean) { + constructor(coordinate: Coordinate, zoom: number, pitch: number, heading: number, navigationOffset: boolean) { this.coordinate = coordinate this.zoom = zoom this.pitch = pitch - this.bearing = bearing + this.heading = heading this.navigationOffset = navigationOffset } } diff --git a/src/api/Api.ts b/src/api/Api.ts index 118ae3d6..a914beed 100644 --- a/src/api/Api.ts +++ b/src/api/Api.ts @@ -14,7 +14,7 @@ import { RoutingResult, } from '@/api/graphhopper' import { LineString } from 'geojson' -import { getTranslation, tr, Translation } from '@/translation/Translation' +import { getTranslation, tr } from '@/translation/Translation' import * as config from 'config' interface ApiProfile { diff --git a/src/api/graphhopper.d.ts b/src/api/graphhopper.d.ts index 6e391f9c..1f596df9 100644 --- a/src/api/graphhopper.d.ts +++ b/src/api/graphhopper.d.ts @@ -6,6 +6,7 @@ export type Bbox = [number, number, number, number] export interface RoutingArgs { readonly points: [number, number][] + readonly heading?: number readonly profile: string readonly maxAlternativeRoutes: number // todo: probably this should go somewhere else, see: https://github.com/graphhopper/graphhopper-maps/pull/193 diff --git a/src/index.tsx b/src/index.tsx index 731b13cc..f47d1eea 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -16,7 +16,7 @@ import ErrorStore from '@/stores/ErrorStore' import { getApiInfoStore, getErrorStore, - getLocationStore, + getTurnNavigationStore, getMapFeatureStore, getMapOptionsStore, getPathDetailsStore, @@ -26,12 +26,12 @@ import { setStores, } from '@/stores/Stores' import MapOptionsStore from '@/stores/MapOptionsStore' -import LocationStore from '@/stores/LocationStore' +import TurnNavigationStore, {TNSettingsState} from '@/stores/TurnNavigationStore' import PathDetailsStore from '@/stores/PathDetailsStore' import Dispatcher from '@/stores/Dispatcher' import NavBar from '@/NavBar' import App from '@/App' -import { TurnNavigationUpdate } from '@/actions/Actions' +import { TurnNavigationSettingsUpdate } from '@/actions/Actions' let speechSynthesizer = new SpeechSynthesizer(navigator.language) console.log(`Source code: https://github.com/graphhopper/graphhopper-maps/tree/${GIT_SHA}`) @@ -56,7 +56,7 @@ setStores({ infoStore: new ApiInfoStore(), errorStore: new ErrorStore(), mapOptionsStore: new MapOptionsStore(), - locationStore: new LocationStore(speechSynthesizer), + turnNavigationStore: new TurnNavigationStore(getApi(), speechSynthesizer), pathDetailsStore: new PathDetailsStore(), mapFeatureStore: new MapFeatureStore(), }) @@ -70,7 +70,7 @@ Dispatcher.register(getRouteStore()) Dispatcher.register(getApiInfoStore()) Dispatcher.register(getErrorStore()) Dispatcher.register(getMapOptionsStore()) -Dispatcher.register(getLocationStore()) +Dispatcher.register(getTurnNavigationStore()) Dispatcher.register(getPathDetailsStore()) Dispatcher.register(getMapFeatureStore()) @@ -79,7 +79,7 @@ const smallScreenMediaQuery = window.matchMedia('(max-width: 44rem)') const mapActionReceiver = new MapActionReceiver(getMap(), routeStore, () => smallScreenMediaQuery.matches) Dispatcher.register(mapActionReceiver) -Dispatcher.dispatch(new TurnNavigationUpdate({ fakeGPS: fake !== null, soundEnabled: fake === null } as Settings)) +Dispatcher.dispatch(new TurnNavigationSettingsUpdate({ fakeGPS: fake !== '', soundEnabled: fake === '' } as TNSettingsState)) getApi().infoWithDispatch() // get infos about the api as soon as possible diff --git a/src/layers/UsePathsLayer.tsx b/src/layers/UsePathsLayer.tsx index 3c1aaca1..45319e79 100644 --- a/src/layers/UsePathsLayer.tsx +++ b/src/layers/UsePathsLayer.tsx @@ -12,22 +12,28 @@ import { click } from 'ol/events/condition' import Dispatcher from '@/stores/Dispatcher' import { SetSelectedPath } from '@/actions/Actions' import { SelectEvent } from 'ol/interaction/Select' +import {TurnNavigationStoreState} from "@/stores/TurnNavigationStore"; +import {RouteStoreState} from "@/stores/RouteStore"; const pathsLayerKey = 'pathsLayer' const selectedPathLayerKey = 'selectedPathLayer' -export default function usePathsLayer(map: Map, paths: Path[], selectedPath: Path) { +export default function usePathsLayer(map: Map, route: RouteStoreState, turnNavigation: TurnNavigationStoreState) { useEffect(() => { removeCurrentPathLayers(map) - addUnselectedPathsLayer( - map, - paths.filter(p => p != selectedPath) - ) - addSelectedPathsLayer(map, selectedPath) + if(turnNavigation.enabled) { + addSelectedPathsLayer(map, turnNavigation.activePath) + } else { + addUnselectedPathsLayer( + map, + route.routingResult.paths.filter(p => p != route.selectedPath) + ) + addSelectedPathsLayer(map, route.selectedPath) + } return () => { removeCurrentPathLayers(map) } - }, [map, paths, selectedPath]) + }, [map, route.routingResult.paths, route.selectedPath, turnNavigation.enabled, turnNavigation.activePath]) } function removeCurrentPathLayers(map: Map) { diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 74895404..8cdaf8c3 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -3,7 +3,7 @@ import { CurrentRequest, RequestState, SubRequest } from '@/stores/QueryStore' import styles from './RoutingResult.module.css' import { useContext, useEffect, useState } from 'react' import Dispatcher from '@/stores/Dispatcher' -import { TurnNavigationStop, SetSelectedPath, TurnNavigationUpdate } from '@/actions/Actions' +import { TurnNavigationStop, SetSelectedPath, TurnNavigationSettingsUpdate } from '@/actions/Actions' import { metersToText, milliSecondsToText } from '@/Converters' import PlainButton from '@/PlainButton' import Details from '@/sidebar/list.svg' @@ -15,14 +15,15 @@ import { useMediaQuery } from 'react-responsive' import { tr } from '@/translation/Translation' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import { ApiImpl } from '@/api/Api' -import { getLocationStore } from '@/stores/Stores' -import { Settings } from '@/stores/SettingsStore' +import { getTurnNavigationStore } from '@/stores/Stores' +import {TNSettingsState, TurnNavigationStoreState} from "@/stores/TurnNavigationStore"; export interface RoutingResultsProps { paths: Path[] selectedPath: Path currentRequest: CurrentRequest profile: string + turnNavigation: TurnNavigationStoreState } export default function RoutingResults(props: RoutingResultsProps) { @@ -33,7 +34,7 @@ export default function RoutingResults(props: RoutingResultsProps) { return
      {isShortScreen ? createSingletonListContent(props) : createListContent(props)}
    } -function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: boolean; profile: string }) { +function RoutingResult({ path, isSelected, profile, turnNavigation }: { path: Path; isSelected: boolean; profile: string; turnNavigation: TurnNavigationStoreState }) { const [isExpanded, setExpanded] = useState(false) const resultSummaryClass = isSelected ? styles.resultSummary + ' ' + styles.selectedResultSummary @@ -48,9 +49,9 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: const hasBorderCrossed = crossesBorder(path.details.country) const showHints = hasFords || hasTolls || hasFerries || showAndHasBadTracks || showAndHasSteps || hasBorderCrossed - const { showDistanceInMiles, fakeGPS, acceptedRisk } = useContext(ShowDistanceInMilesContext) + const { showDistanceInMiles } = useContext(ShowDistanceInMilesContext) let [showRisk, setShowRisk] = useState(false) - if (!acceptedRisk && showRisk) + if (!turnNavigation.settings.acceptedRisk && showRisk) return (
    {tr('warning')}
    @@ -65,8 +66,8 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: { - Dispatcher.dispatch(new TurnNavigationUpdate({ acceptedRisk: true } as Settings)) - fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal() + Dispatcher.dispatch(new TurnNavigationSettingsUpdate({ acceptedRisk: true } as TNSettingsState)) + turnNavigation.settings.fakeGPS ? getTurnNavigationStore().initFake() : getTurnNavigationStore().initReal() }} > {tr('accept_risks_after_warning')} @@ -104,8 +105,8 @@ function RoutingResult({ path, isSelected, profile }: { path: Path; isSelected: { - if (!acceptedRisk) setShowRisk(true) - else fakeGPS ? getLocationStore().initFake() : getLocationStore().initReal() + if (!turnNavigation.settings.acceptedRisk) setShowRisk(true) + else turnNavigation.settings.fakeGPS ? getTurnNavigationStore().initFake() : getTurnNavigationStore().initReal() }} > @@ -257,19 +258,19 @@ function getLength(paths: Path[], subRequests: SubRequest[]) { function createSingletonListContent(props: RoutingResultsProps) { if (props.paths.length > 0) - return + return if (hasPendingRequests(props.currentRequest.subRequests)) return return '' } -function createListContent({ paths, currentRequest, selectedPath, profile }: RoutingResultsProps) { +function createListContent({ paths, currentRequest, selectedPath, profile, turnNavigation }: RoutingResultsProps) { const length = getLength(paths, currentRequest.subRequests) const result = [] for (let i = 0; i < length; i++) { if (i < paths.length) result.push( - + ) else result.push() } diff --git a/src/stores/LocationStore.ts b/src/stores/LocationStore.ts deleted file mode 100644 index 93c5c1f7..00000000 --- a/src/stores/LocationStore.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { Coordinate } from '@/stores/QueryStore' -import Store from '@/stores/Store' -import { ErrorAction, LocationUpdate, TurnNavigationStop, ZoomMapToPoint } from '@/actions/Actions' -import Dispatcher, { Action } from '@/stores/Dispatcher' -import NoSleep from 'nosleep.js' -import { SpeechSynthesizer } from '@/SpeechSynthesizer' -import { ApiImpl } from '@/api/Api' -import { calcOrientation, toNorthBased } from '@/turnNavigation/GeoMethods' -import * as config from 'config' -import { toDegrees, toRadians } from 'ol/math' - -export interface LocationStoreState { - turnNavigation: boolean - coordinate: Coordinate - speed: number -} - -export default class LocationStore extends Store { - private watchId: any = undefined - private interval: any - private noSleep: any - private readonly speechSynthesizer: SpeechSynthesizer - private started: boolean = false - - constructor(speechSynthesizer: SpeechSynthesizer) { - super({ - turnNavigation: false, - coordinate: { lat: 0, lng: 0 }, - speed: 0, - }) - this.speechSynthesizer = speechSynthesizer - } - - public getSpeechSynthesizer(): SpeechSynthesizer { - return this.speechSynthesizer - } - - reduce(state: LocationStoreState, action: Action): LocationStoreState { - if (action instanceof TurnNavigationStop) { - this.stop() - // directly writing the state does not work: this.state.turnNavigation = false - return { coordinate: { lat: 0, lng: 0 }, turnNavigation: false, speed: 0 } - } else if (action instanceof LocationUpdate) { - // console.log('LocationUpdate action {}', action.location) - return action.location - } - return state - } - - public async initFake() { - console.log('started fake GPS injection') - this.started = true - - // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car&layer=MapTiler&fake=true - let api = new ApiImpl(config.api, config.keys.graphhopper) - let response = await api.route({ - points: [ - [14.245254, 51.439291], - [14.234999, 51.43322], - ], - profile: 'car', - maxAlternativeRoutes: 0, - zoom: false, - customModel: null, - }) - - // TODO: skip too close points and interpolate if too big distance - let coords: number[][] = response.paths[0].points.coordinates - let latlon: number[][] = new Array(coords.length) - - for (let idx = 0; idx < coords.length; idx++) { - // very ugly: in JS the random object cannot be initialed with a seed - const lat = coords[idx][1] + 0.001 * Math.random() // approx +-5m ? - const lon = coords[idx][0] + 0.0001 * Math.random() - let heading = 0 - if (idx > 0) { - const prevLat = coords[idx - 1][1] - const prevLon = coords[idx - 1][0] - let o = calcOrientation(prevLat, prevLon, lat, lon) - heading = toDegrees(toNorthBased(o)) - } - latlon[idx] = [lat, lon, heading, 4] - } - - let currentIndex: number = 0 - this.locationUpdate({ - coords: { - latitude: latlon[currentIndex][0], - longitude: latlon[currentIndex][1], - heading: latlon[currentIndex][2], - speed: latlon[currentIndex][3], - }, - }) - - this.interval = setInterval(() => { - currentIndex++ - currentIndex %= latlon.length - // console.log(currentIndex) - this.locationUpdate({ - coords: { - latitude: latlon[currentIndex][0], - longitude: latlon[currentIndex][1], - heading: latlon[currentIndex][2], - speed: latlon[currentIndex][3], - }, - }) - }, 3000) - } - - private locationUpdate(pos: any) { - let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } - Dispatcher.dispatch(new LocationUpdate({ coordinate: c, turnNavigation: true, speed: pos.coords.speed })) - let bearing: number = pos.coords.heading - - if (!bearing || Number.isNaN(bearing)) - console.log('skip dispatching SetViewportToPoint because bearing is ' + bearing) - else Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, bearing, true)) - } - - public initReal() { - this.started = true - if (!this.noSleep) this.noSleep = new NoSleep() - this.noSleep.enable() - if (!navigator.geolocation) { - console.log('location not supported. In firefox I had to set geo.enabled=true in about:config') - } else { - console.log('location init ', this.watchId) - // force calling clearWatch can help to find GPS fix more reliable in android firefox - if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) - - let options = { - timeout: 300_000, - // maximumAge is not a problem here like with getCurrentPosition but let's use identical settings - enableHighAccuracy: true, - } - this.watchId = navigator.geolocation.watchPosition( - this.locationUpdate, - err => { - if (this.started) Dispatcher.dispatch(new ErrorAction('location watch error: ' + err.message)) - }, - options - ) - try { - let el = document.documentElement - let requestFullscreenFct = el.requestFullscreen - requestFullscreenFct.call(el) - } catch (e) { - console.log('error requesting full screen ' + JSON.stringify(e)) - } - } - } - - public stop() { - // console.log('LocationStore.stop', this.watchId, this.interval) - if (document.fullscreenElement) document.exitFullscreen() - - this.started = false - if (this.interval) clearInterval(this.interval) - - if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) - - if (this.noSleep) this.noSleep.disable() - } -} diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index d43990e1..32a29cfa 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -6,7 +6,7 @@ import { PathDetailsRangeSelected, RouteRequestSuccess, SetInitialBBox, - SetSelectedPath, + SetSelectedPath, TurnNavigationStop, ZoomMapToPoint, } from '@/actions/Actions' import RouteStore from '@/stores/RouteStore' @@ -43,7 +43,7 @@ export default class MapActionReceiver implements ActionReceiver { center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), // The heading is in degrees and shows direction into which device is going. // And although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. - rotation: -toRadians(action.bearing), + rotation: -toRadians(action.heading), duration: 400, }) } else if (action instanceof RouteRequestSuccess) { diff --git a/src/stores/RouteStore.ts b/src/stores/RouteStore.ts index cb06d0b1..ba93180a 100644 --- a/src/stores/RouteStore.ts +++ b/src/stores/RouteStore.ts @@ -1,6 +1,14 @@ import Store from '@/stores/Store' import { Action } from '@/stores/Dispatcher' -import { ClearPoints, ClearRoute, RemovePoint, RouteRequestSuccess, SetPoint, SetSelectedPath } from '@/actions/Actions' +import { + ClearPoints, + ClearRoute, + RemovePoint, + RouteRequestSuccess, + SetPoint, + SetSelectedPath, TurnNavigationSettingsUpdate, + TurnNavigationStop +} from '@/actions/Actions' import QueryStore, { RequestState } from '@/stores/QueryStore' import { Path, RoutingArgs, RoutingResult } from '@/api/graphhopper' diff --git a/src/stores/SettingsStore.ts b/src/stores/SettingsStore.ts index 21f99f87..d311efaa 100644 --- a/src/stores/SettingsStore.ts +++ b/src/stores/SettingsStore.ts @@ -1,21 +1,15 @@ import Store from '@/stores/Store' import { Action } from '@/stores/Dispatcher' -import { ToggleDistanceUnits, TurnNavigationUpdate } from '@/actions/Actions' +import { ToggleDistanceUnits, TurnNavigationSettingsUpdate } from '@/actions/Actions' export interface Settings { showDistanceInMiles: boolean - fakeGPS: boolean - acceptedRisk: boolean - soundEnabled: boolean } export default class SettingsStore extends Store { constructor() { super({ showDistanceInMiles: false, - fakeGPS: false, - acceptedRisk: false, - soundEnabled: false, }) } @@ -25,8 +19,6 @@ export default class SettingsStore extends Store { ...state, showDistanceInMiles: !state.showDistanceInMiles, } - } else if (action instanceof TurnNavigationUpdate) { - return { ...state, ...action.update } } return state } diff --git a/src/stores/Stores.ts b/src/stores/Stores.ts index 7f412f79..5dd8a782 100644 --- a/src/stores/Stores.ts +++ b/src/stores/Stores.ts @@ -3,7 +3,7 @@ import RouteStore from '@/stores/RouteStore' import ApiInfoStore from '@/stores/ApiInfoStore' import ErrorStore from '@/stores/ErrorStore' import MapOptionsStore from '@/stores/MapOptionsStore' -import LocationStore from '@/stores/LocationStore' +import TurnNavigationStore from '@/stores/TurnNavigationStore' import PathDetailsStore from '@/stores/PathDetailsStore' import MapFeatureStore from '@/stores/MapFeatureStore' import SettingsStore from '@/stores/SettingsStore' @@ -14,7 +14,7 @@ let routeStore: RouteStore let infoStore: ApiInfoStore let errorStore: ErrorStore let mapOptionsStore: MapOptionsStore -let locationStore: LocationStore +let turnNavigationStore: TurnNavigationStore let pathDetailsStore: PathDetailsStore let mapFeatureStore: MapFeatureStore @@ -25,7 +25,7 @@ interface StoresInput { infoStore: ApiInfoStore errorStore: ErrorStore mapOptionsStore: MapOptionsStore - locationStore: LocationStore + turnNavigationStore: TurnNavigationStore pathDetailsStore: PathDetailsStore mapFeatureStore: MapFeatureStore } @@ -37,7 +37,7 @@ export const setStores = function (stores: StoresInput) { infoStore = stores.infoStore errorStore = stores.errorStore mapOptionsStore = stores.mapOptionsStore - locationStore = stores.locationStore + turnNavigationStore = stores.turnNavigationStore pathDetailsStore = stores.pathDetailsStore mapFeatureStore = stores.mapFeatureStore } @@ -48,6 +48,6 @@ export const getRouteStore = () => routeStore export const getApiInfoStore = () => infoStore export const getErrorStore = () => errorStore export const getMapOptionsStore = () => mapOptionsStore -export const getLocationStore = () => locationStore +export const getTurnNavigationStore = () => turnNavigationStore export const getPathDetailsStore = () => pathDetailsStore export const getMapFeatureStore = () => mapFeatureStore diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts new file mode 100644 index 00000000..04d345fd --- /dev/null +++ b/src/stores/TurnNavigationStore.ts @@ -0,0 +1,310 @@ +import {Coordinate} from '@/stores/QueryStore' +import Store from '@/stores/Store' +import { + ErrorAction, + LocationUpdate, + SetSelectedPath, + TurnNavigationRerouting, + TurnNavigationSettingsUpdate, + TurnNavigationStop, + ZoomMapToPoint +} from '@/actions/Actions' +import Dispatcher, {Action} from '@/stores/Dispatcher' +import NoSleep from 'nosleep.js' +import {SpeechSynthesizer} from '@/SpeechSynthesizer' +import Api, {ApiImpl} from '@/api/Api' +import {calcOrientation, getCurrentDetails, getCurrentInstruction, toNorthBased} from '@/turnNavigation/GeoMethods' +import * as config from 'config' +import {toDegrees} from 'ol/math' +import {Instruction, Path, RoutingArgs} from "@/api/graphhopper"; +import {getTurnNavigationStore} from "@/stores/Stores"; +import {tr} from "@/translation/Translation"; + +export interface TurnNavigationStoreState { + enabled: boolean + coordinate: Coordinate + speed: number + heading: number + activePath: Path + settings: TNSettingsState + instruction: TNInstructionState + pathDetails: TNPathDetailsState +} + +export interface TNInstructionState { + index: number + distanceToNext: number + remainingTime: number + remainingDistance: number + text: string +} + +export interface TNPathDetailsState { + maxSpeed: number + estimatedAvgSpeed: number + surface: string + roadClass: string +} + +export interface TNSettingsState { + fakeGPS: boolean + acceptedRisk: boolean + soundEnabled: boolean +} + +export default class TurnNavigationStore extends Store { + private readonly api: Api + private watchId: any = undefined + private interval: any + private noSleep: any + private readonly speechSynthesizer: SpeechSynthesizer + private started: boolean = false + + constructor(api: Api, speechSynthesizer: SpeechSynthesizer) { + super({ + enabled: false, + coordinate: {lat: 0, lng: 0}, + speed: 0, + heading: 0, + activePath: {} as Path, + settings: {} as TNSettingsState, + instruction: {} as TNInstructionState, + pathDetails: {} as TNPathDetailsState, + }) + this.api = api + this.speechSynthesizer = speechSynthesizer + } + + public getSpeechSynthesizer(): SpeechSynthesizer { + return this.speechSynthesizer + } + + reduce(state: TurnNavigationStoreState, action: Action): TurnNavigationStoreState { + if (action instanceof TurnNavigationStop) { + this.stop() + return {...state, enabled: false, speed: 0, heading: 0} + } else if (action instanceof TurnNavigationSettingsUpdate) { + return {...state, settings: action.settings} + } else if (action instanceof TurnNavigationRerouting) { + return { + ...state, + activePath: action.path, + } + } else if (action instanceof SetSelectedPath) { + // TODO NOW should we recalculate with headings, no alternative and only the first 2 points? + // trigger ReroutingAction!? + return { + ...state, + activePath: action.path, + } + } else if (action instanceof LocationUpdate) { + + const coordinate = action.coordinate + const path = state.activePath + const {instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance} = + getCurrentInstruction(path.instructions, coordinate) + + if (distanceToRoute > 50) { + // TODO NOW use heading in route request + // TODO NOW use correct profile and customModel + const fromPoint: [number, number] = [coordinate.lng, coordinate.lat] + const toPoint: [number, number] = [path.snapped_waypoints.coordinates[1][0], path.snapped_waypoints.coordinates[1][1]] + const args: RoutingArgs = { + points: [fromPoint, toPoint], + maxAlternativeRoutes: 0, + heading: action.heading, + zoom: false, + profile: 'car', + customModel: null + } + this.api.route(args).then(result => { + if (result.paths.length > 0) { + console.log("rerouting: {}", result.paths[0]) + getTurnNavigationStore().getSpeechSynthesizer().synthesize(tr('reroute')) + Dispatcher.dispatch(new TurnNavigationRerouting(result.paths[0])) + } else { + console.log("rerouting found no path: {}", result) + } + }).catch(error => console.warn('error for reroute request: ', error)) + return { + ...state, + heading: action.heading, + speed: action.speed, + coordinate: coordinate, + } + } + + if (instructionIndex < 0) throw new Error("Instruction should be valid if distanceToRoute is small") + + const instructionState = state.instruction + const nextInstruction: Instruction = path.instructions[instructionIndex] + + let text = nextInstruction.street_name + if (state.settings.soundEnabled) { + // making lastAnnounceDistance dependent on location.speed is tricky because then it can change while driving, so pick the constant average speed + // TODO use instruction average speed of current+next instruction instead of whole path + let averageSpeed = (path.distance / (path.time / 1000)) * 3.6 + let lastAnnounceDistance = 10 + 2 * Math.round(averageSpeed / 5) * 5 + + if ( + distanceToNext <= lastAnnounceDistance && + (instructionState.distanceToNext > lastAnnounceDistance || instructionIndex != instructionState.index) + ) { + getTurnNavigationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) + } + + let firstAnnounceDistance = 1150 + if ( + averageSpeed > 15 && // two announcements only if faster speed + distanceToNext > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) + distanceToNext <= firstAnnounceDistance && + (instructionState.distanceToNext > firstAnnounceDistance || instructionIndex != instructionState.index) + ) { + let inString = + distanceToNext > 800 + ? tr('in_km_singular') + : tr('in_m', ['' + Math.round(distanceToNext / 100) * 100]) + getTurnNavigationStore() + .getSpeechSynthesizer() + .synthesize(inString + ' ' + nextInstruction.text) + } + } + + let [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, coordinate, [ + path.details.average_speed, + path.details.max_speed, + path.details.surface, + path.details.road_class, + ]) + + return { + ...state, + enabled: true, + heading: action.heading, + speed: action.speed, + coordinate: coordinate, + instruction: {index: instructionIndex, distanceToNext, remainingTime, remainingDistance, text}, + pathDetails: {estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass} + } + } + return state + } + + public async initFake() { + console.log('started fake GPS injection') + this.started = true + + // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car&layer=MapTiler&fake=true + let api = new ApiImpl(config.api, config.keys.graphhopper) + let response = await api.route({ + points: [ + [14.245254, 51.439291], + [14.234999, 51.43322], + ], + heading: 0, + profile: 'car', + maxAlternativeRoutes: 0, + zoom: false, + customModel: null, + }) + + // TODO: skip too close points and interpolate if too big distance + let coords: number[][] = response.paths[0].points.coordinates + let latlon: number[][] = new Array(coords.length) + + for (let idx = 0; idx < coords.length; idx++) { + // very ugly: in JS the random object cannot be initialed with a seed + const lat = coords[idx][1] + 0.001 * Math.random() // approx +-5m ? + const lon = coords[idx][0] + 0.0001 * Math.random() + let heading = 0 + if (idx > 0) { + const prevLat = coords[idx - 1][1] + const prevLon = coords[idx - 1][0] + let o = calcOrientation(prevLat, prevLon, lat, lon) + heading = toDegrees(toNorthBased(o)) + } + latlon[idx] = [lat, lon, heading, 4] + } + + let currentIndex: number = 0 + this.locationUpdate({ + coords: { + latitude: latlon[currentIndex][0], + longitude: latlon[currentIndex][1], + heading: latlon[currentIndex][2], + speed: latlon[currentIndex][3], + }, + }) + + this.interval = setInterval(() => { + currentIndex++ + currentIndex %= latlon.length + // console.log(currentIndex) + this.locationUpdate({ + coords: { + latitude: latlon[currentIndex][0], + longitude: latlon[currentIndex][1], + heading: latlon[currentIndex][2], + speed: latlon[currentIndex][3], + }, + }) + }, 3000) + } + + private locationUpdate(pos: any) { + let c = {lat: pos.coords.latitude, lng: pos.coords.longitude} + let heading: number = pos.coords.heading + if (!heading || Number.isNaN(heading)) { + console.log('skip dispatching SetViewportToPoint because heading is ' + heading) + return + } + + Dispatcher.dispatch(new LocationUpdate(c, pos.coords.speed, pos.coords.heading)) + Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, heading, true)) + } + + public initReal() { + this.started = true + if (!this.noSleep) this.noSleep = new NoSleep() + this.noSleep.enable() + if (!navigator.geolocation) { + console.log('location not supported. In firefox I had to set geo.enabled=true in about:config') + } else { + console.log('location init ', this.watchId) + // force calling clearWatch can help to find GPS fix more reliable in android firefox + if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) + + let options = { + timeout: 300_000, + // maximumAge is not a problem here like with getCurrentPosition but let's use identical settings + enableHighAccuracy: true, + } + this.watchId = navigator.geolocation.watchPosition( + this.locationUpdate, + err => { + if (this.started) Dispatcher.dispatch(new ErrorAction('location watch error: ' + err.message)) + }, + options + ) + try { + let el = document.documentElement + let requestFullscreenFct = el.requestFullscreen + requestFullscreenFct.call(el) + } catch (e) { + console.log('error requesting full screen ' + JSON.stringify(e)) + } + } + } + + public stop() { + // console.log('LocationStore.stop', this.watchId, this.interval) + if (document.fullscreenElement) document.exitFullscreen() + + this.started = false + if (this.interval) clearInterval(this.interval) + + if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) + + if (this.noSleep) this.noSleep.disable() + } +} diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 76eaa09e..61b4f4ca 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,116 +1,33 @@ -import React, { useContext, useEffect, useState } from 'react' -import { Instruction, Path } from '@/api/graphhopper' +import React, { useState } from 'react' +import { Path } from '@/api/graphhopper' import { metersToText, milliSecondsToText } from '@/Converters' -import instructions, { getTurnSign } from '@/sidebar/instructions/Instructions' -import { getCurrentDetails, getCurrentInstruction } from './GeoMethods' +import { getTurnSign } from '@/sidebar/instructions/Instructions' import styles from '@/turnNavigation/TurnNavigation.module.css' import endNavigation from '@/turnNavigation/end_turn_navigation.png' -import { getLocationStore } from '@/stores/Stores' -import { LocationStoreState } from '@/stores/LocationStore' -import { tr } from '@/translation/Translation' -import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' +import { TurnNavigationStoreState} from '@/stores/TurnNavigationStore' import Dispatcher from '@/stores/Dispatcher' -import { TurnNavigationStop, SetPoint, ZoomMapToPoint } from '@/actions/Actions' -import { QueryPoint } from '@/stores/QueryStore' +import { TurnNavigationStop, ZoomMapToPoint } from '@/actions/Actions' -type TurnNavigationProps = { - queryPoints: QueryPoint[] - path: Path - location: LocationStoreState -} - -export default function ({ queryPoints, path, location }: TurnNavigationProps) { - let currentLocation = location.coordinate +export default function ({turnNavigation}: {turnNavigation: TurnNavigationStoreState}) { + const path = turnNavigation.activePath + const instruction = turnNavigation.instruction + const pd = turnNavigation.pathDetails let [showTime, setShowTime] = useState(true) let [showDebug, setShowDebug] = useState(false) - const [instructionState, setInstructionState] = useState({ - index: -1, - distanceToNext: -1, - remainingTime: -1, - remainingDistance: -1, - text: '', - }) - - const [pathDetails, setPathDetails] = useState({ maxSpeed: -1, estimatedAvgSpeed: -1, surface: '', roadClass: '' }) - const { soundEnabled } = useContext(ShowDistanceInMilesContext) - - // render only if index changed and distance is close next instruction - useEffect(() => { - const { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } = - getCurrentInstruction(path.instructions, currentLocation) - - if (instructionIndex < 0) return - - // TODO NOW how can we avoid calling this inside useEffect!? - // TODO NOW if this dispatch is called we get an undefined instruction and this is necessary below: !path.instructions[instructionState.index] - // and for a short time the "cannot find instruction" screen is displayed (flickering) - if (distanceToRoute > 50) { - Dispatcher.dispatch( - new SetPoint({ ...queryPoints[0], coordinate: location.coordinate } as QueryPoint, false) - ) - getLocationStore().getSpeechSynthesizer().synthesize(tr('reroute')) - return - } - - const nextInstruction: Instruction = path.instructions[instructionIndex] - - let text = nextInstruction.street_name - if (soundEnabled) { - // making lastAnnounceDistance dependent on location.speed is tricky because then it can change while driving, so pick the constant average speed - // TODO use instruction average speed of current+next instruction instead of whole path - let averageSpeed = (path.distance / (path.time / 1000)) * 3.6 - let lastAnnounceDistance = 10 + 2 * Math.round(averageSpeed / 5) * 5 - - if ( - distanceToNext <= lastAnnounceDistance && - (instructionState.distanceToNext > lastAnnounceDistance || instructionIndex != instructionState.index) - ) { - getLocationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) - } - - let firstAnnounceDistance = 1150 - if ( - averageSpeed > 15 && // two announcements only if faster speed - distanceToNext > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) - distanceToNext <= firstAnnounceDistance && - (instructionState.distanceToNext > firstAnnounceDistance || instructionIndex != instructionState.index) - ) { - let inString = - distanceToNext > 800 - ? tr('in_km_singular') - : tr('in_m', ['' + Math.round(distanceToNext / 100) * 100]) - getLocationStore() - .getSpeechSynthesizer() - .synthesize(inString + ' ' + nextInstruction.text) - } - } - - setInstructionState({ index: instructionIndex, distanceToNext, remainingTime, remainingDistance, text }) - - let [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, currentLocation, [ - path.details.average_speed, - path.details.max_speed, - path.details.surface, - path.details.road_class, - ]) - setPathDetails({ estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }) - }, [currentLocation, path]) const arrivalDate = new Date() - const currentSpeed = Math.round(location.speed * 3.6) - arrivalDate.setMilliseconds(arrivalDate.getSeconds() + instructionState.remainingTime) + const currentSpeed = Math.round(turnNavigation.speed * 3.6) + arrivalDate.setMilliseconds(arrivalDate.getSeconds() + instruction.remainingTime) const min = arrivalDate.getMinutes() - return instructionState.index < 0 || !path.instructions[instructionState.index] ? ( - <>Cannot find instruction - ) : ( + return ( <>
    -
    {getTurnSign(path.instructions[instructionState.index].sign, instructionState.index)}
    -
    {metersToText(instructionState.distanceToNext, false)}
    +
    {getTurnSign(path.instructions[instruction.index].sign, instruction.index)}
    +
    {metersToText(instruction.distanceToNext, false)}
    @@ -125,7 +42,7 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) {
    ) : (
    - {milliSecondsToText(instructionState.remainingTime)} + {milliSecondsToText(instruction.remainingTime)} @@ -133,19 +50,19 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) {
    )}
    - {metersToText(instructionState.remainingDistance, false)} + {metersToText(instruction.remainingDistance, false)}
    setShowDebug(!showDebug)}>
    {currentSpeed} km/h
    - {pathDetails.maxSpeed != null ? ( -
    {Math.round(pathDetails.maxSpeed)}
    + {pd.maxSpeed != null ? ( +
    {Math.round(pd.maxSpeed)}
    ) : null} {showDebug ? (
    -
    {pathDetails.estimatedAvgSpeed}
    -
    {pathDetails.surface}
    -
    {pathDetails.roadClass}
    +
    {pd.estimatedAvgSpeed}
    +
    {pd.surface}
    +
    {pd.roadClass}
    ) : null}
    @@ -153,13 +70,13 @@ export default function ({ queryPoints, path, location }: TurnNavigationProps) { className={styles.thirdCol} onClick={() => { Dispatcher.dispatch(new TurnNavigationStop()) - Dispatcher.dispatch(new ZoomMapToPoint(location.coordinate, 15, 0, 0, false)) + Dispatcher.dispatch(new ZoomMapToPoint(turnNavigation.coordinate, 15, 0, 0, false)) }} >
    -
    {instructionState.text}
    +
    {instruction.text}
    From a3a518c804123eb378fa2a078948a99a3154bc04 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 15:30:52 +0200 Subject: [PATCH 127/322] use correct profile for rerouting request --- src/actions/Actions.ts | 3 +-- src/stores/TurnNavigationStore.ts | 31 +++++++++++++++++++++++-------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 3b50be1c..9b42a9e0 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -3,8 +3,7 @@ import { Coordinate, CustomModel, QueryPoint } from '@/stores/QueryStore' import { ApiInfo, Bbox, Path, RoutingArgs, RoutingProfile, RoutingResult } from '@/api/graphhopper' import { StyleOption } from '@/stores/MapOptionsStore' import { PathDetailsPoint } from '@/stores/PathDetailsStore' -import {TNSettingsState, TurnNavigationStoreState} from '@/stores/TurnNavigationStore' -import { Settings } from '@/stores/SettingsStore' +import { TNSettingsState } from '@/stores/TurnNavigationStore' export class InfoReceived implements Action { readonly result: ApiInfo diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 04d345fd..3db815af 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -1,9 +1,9 @@ -import {Coordinate} from '@/stores/QueryStore' +import {Coordinate, QueryStoreState} from '@/stores/QueryStore' import Store from '@/stores/Store' import { ErrorAction, - LocationUpdate, - SetSelectedPath, + LocationUpdate, SetRoutingParametersAtOnce, + SetSelectedPath, SetVehicleProfile, TurnNavigationRerouting, TurnNavigationSettingsUpdate, TurnNavigationStop, @@ -16,7 +16,7 @@ import Api, {ApiImpl} from '@/api/Api' import {calcOrientation, getCurrentDetails, getCurrentInstruction, toNorthBased} from '@/turnNavigation/GeoMethods' import * as config from 'config' import {toDegrees} from 'ol/math' -import {Instruction, Path, RoutingArgs} from "@/api/graphhopper"; +import {Instruction, Path, RoutingArgs, RoutingProfile} from "@/api/graphhopper"; import {getTurnNavigationStore} from "@/stores/Stores"; import {tr} from "@/translation/Translation"; @@ -26,6 +26,7 @@ export interface TurnNavigationStoreState { speed: number heading: number activePath: Path + activeProfile: string settings: TNSettingsState instruction: TNInstructionState pathDetails: TNPathDetailsState @@ -67,6 +68,7 @@ export default class TurnNavigationStore extends Store speed: 0, heading: 0, activePath: {} as Path, + activeProfile: '', settings: {} as TNSettingsState, instruction: {} as TNInstructionState, pathDetails: {} as TNPathDetailsState, @@ -90,8 +92,20 @@ export default class TurnNavigationStore extends Store ...state, activePath: action.path, } + } else if (action instanceof SetRoutingParametersAtOnce) { + console.log("SetRoutingParametersAtOnce, profile: " + action.routingProfile.name) + return { + ...state, + activeProfile: action.routingProfile.name, + } + } else if (action instanceof SetVehicleProfile) { + console.log("SetVehicleProfile, profile: " + action.profile.name) + return { + ...state, + activeProfile: action.profile.name, + } } else if (action instanceof SetSelectedPath) { - // TODO NOW should we recalculate with headings, no alternative and only the first 2 points? + // TODO recalculate with headings, no alternative and only the first 2 points? // trigger ReroutingAction!? return { ...state, @@ -105,8 +119,9 @@ export default class TurnNavigationStore extends Store getCurrentInstruction(path.instructions, coordinate) if (distanceToRoute > 50) { - // TODO NOW use heading in route request - // TODO NOW use correct profile and customModel + console.log("set profile for TN " + state.activeProfile) + // TODO use heading in route request + // TODO use correct customModel const fromPoint: [number, number] = [coordinate.lng, coordinate.lat] const toPoint: [number, number] = [path.snapped_waypoints.coordinates[1][0], path.snapped_waypoints.coordinates[1][1]] const args: RoutingArgs = { @@ -114,7 +129,7 @@ export default class TurnNavigationStore extends Store maxAlternativeRoutes: 0, heading: action.heading, zoom: false, - profile: 'car', + profile: state.activeProfile, customModel: null } this.api.route(args).then(result => { From 20d608275374105657646080aaa56ecbd0ef3433 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 15:56:53 +0200 Subject: [PATCH 128/322] ZoomMapToPoint should allow undefined heading (as this comes like this from the device sometimes) --- src/actions/Actions.ts | 4 +-- src/map/ContextMenuContent.tsx | 2 +- src/stores/MapActionReceiver.ts | 19 +++++++------- src/stores/TurnNavigationStore.ts | 37 ++++++++++++--------------- src/turnNavigation/TurnNavigation.tsx | 2 +- 5 files changed, 30 insertions(+), 34 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 9b42a9e0..b7d652a8 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -201,10 +201,10 @@ export class ZoomMapToPoint implements Action { readonly zoom: number readonly pitch: number // in degrees - readonly heading: number + readonly heading?: number readonly navigationOffset: boolean - constructor(coordinate: Coordinate, zoom: number, pitch: number, heading: number, navigationOffset: boolean) { + constructor(coordinate: Coordinate, zoom: number, pitch: number, navigationOffset: boolean, heading?: number) { this.coordinate = coordinate this.zoom = zoom this.pitch = pitch diff --git a/src/map/ContextMenuContent.tsx b/src/map/ContextMenuContent.tsx index 104d5174..ea33de49 100644 --- a/src/map/ContextMenuContent.tsx +++ b/src/map/ContextMenuContent.tsx @@ -112,7 +112,7 @@ export function ContextMenuContent({ className={styles.entry} onClick={() => { onSelect() - Dispatcher.dispatch(new ZoomMapToPoint(coordinate, 8, 0, 0, false)) + Dispatcher.dispatch(new ZoomMapToPoint(coordinate, 8, 0, false)) }} > {tr('center_map')} diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 32a29cfa..cde2ca54 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -1,17 +1,17 @@ -import { Action, ActionReceiver } from '@/stores/Dispatcher' -import { Map } from 'ol' -import { fromLonLat } from 'ol/proj' +import {Action, ActionReceiver} from '@/stores/Dispatcher' +import {Map} from 'ol' +import {fromLonLat} from 'ol/proj' import { InfoReceived, PathDetailsRangeSelected, RouteRequestSuccess, SetInitialBBox, - SetSelectedPath, TurnNavigationStop, + SetSelectedPath, ZoomMapToPoint, } from '@/actions/Actions' import RouteStore from '@/stores/RouteStore' -import { Bbox } from '@/api/graphhopper' -import { toRadians } from 'ol/math' +import {Bbox} from '@/api/graphhopper' +import {toRadians} from 'ol/math' export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -38,12 +38,13 @@ export default class MapActionReceiver implements ActionReceiver { this.map.getView().padding = [size ? size[1] / 2 : 0, 0, 0, 0] } + // The heading is in degrees and shows direction into which device is going. + // And although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. + const rotation = (!action.heading || Number.isNaN(action.heading)) ? this.map.getView().getRotation() : -toRadians(action.heading) this.map.getView().animate({ zoom: action.zoom, center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), - // The heading is in degrees and shows direction into which device is going. - // And although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. - rotation: -toRadians(action.heading), + rotation: rotation, duration: 400, }) } else if (action instanceof RouteRequestSuccess) { diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 3db815af..6f175ab3 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -119,7 +119,6 @@ export default class TurnNavigationStore extends Store getCurrentInstruction(path.instructions, coordinate) if (distanceToRoute > 50) { - console.log("set profile for TN " + state.activeProfile) // TODO use heading in route request // TODO use correct customModel const fromPoint: [number, number] = [coordinate.lng, coordinate.lat] @@ -268,14 +267,8 @@ export default class TurnNavigationStore extends Store private locationUpdate(pos: any) { let c = {lat: pos.coords.latitude, lng: pos.coords.longitude} - let heading: number = pos.coords.heading - if (!heading || Number.isNaN(heading)) { - console.log('skip dispatching SetViewportToPoint because heading is ' + heading) - return - } - - Dispatcher.dispatch(new LocationUpdate(c, pos.coords.speed, pos.coords.heading)) - Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, heading, true)) + Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, true, pos.coords.heading)) + Dispatcher.dispatch(new LocationUpdate(c, pos.coords.speed, pos.coords.heading? pos.coords.heading : 0 )) } public initReal() { @@ -289,18 +282,6 @@ export default class TurnNavigationStore extends Store // force calling clearWatch can help to find GPS fix more reliable in android firefox if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) - let options = { - timeout: 300_000, - // maximumAge is not a problem here like with getCurrentPosition but let's use identical settings - enableHighAccuracy: true, - } - this.watchId = navigator.geolocation.watchPosition( - this.locationUpdate, - err => { - if (this.started) Dispatcher.dispatch(new ErrorAction('location watch error: ' + err.message)) - }, - options - ) try { let el = document.documentElement let requestFullscreenFct = el.requestFullscreen @@ -308,6 +289,20 @@ export default class TurnNavigationStore extends Store } catch (e) { console.log('error requesting full screen ' + JSON.stringify(e)) } + + this.watchId = navigator.geolocation.watchPosition( + this.locationUpdate, + err => { + // TODO exit fullscreen does not work + // Dispatcher.dispatch(new TurnNavigationStop()) + if (this.started) Dispatcher.dispatch(new ErrorAction('location watch error: ' + err.message)) + }, + { + timeout: 300_000, + // maximumAge is not a problem here like with getCurrentPosition but let's use identical settings + enableHighAccuracy: true, + } + ) } } diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 61b4f4ca..a34685b9 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -70,7 +70,7 @@ export default function ({turnNavigation}: {turnNavigation: TurnNavigationStoreS className={styles.thirdCol} onClick={() => { Dispatcher.dispatch(new TurnNavigationStop()) - Dispatcher.dispatch(new ZoomMapToPoint(turnNavigation.coordinate, 15, 0, 0, false)) + Dispatcher.dispatch(new ZoomMapToPoint(turnNavigation.coordinate, 15, 0, false, 0)) }} > From d56a158cbfc9ba4c0928abe4ada330fbb310d27d Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 15:57:16 +0200 Subject: [PATCH 129/322] format --- src/App.tsx | 16 ++++-- src/ShowDistanceInMilesContext.ts | 2 +- src/actions/Actions.ts | 8 +-- src/index.tsx | 6 +- src/layers/UsePathsLayer.tsx | 6 +- src/sidebar/RoutingResults.tsx | 44 +++++++++++--- src/stores/MapActionReceiver.ts | 15 +++-- src/stores/RouteStore.ts | 5 +- src/stores/TurnNavigationStore.ts | 83 +++++++++++++++------------ src/turnNavigation/TurnNavigation.tsx | 4 +- 10 files changed, 121 insertions(+), 68 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 5bba161f..32a8d1c9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -25,7 +25,7 @@ import { MapOptionsStoreState } from '@/stores/MapOptionsStore' import { ErrorStoreState } from '@/stores/ErrorStore' import Search from '@/sidebar/search/Search' import ErrorMessage from '@/sidebar/ErrorMessage' -import {TNSettingsState, TurnNavigationStoreState} from './stores/TurnNavigationStore' +import { TNSettingsState, TurnNavigationStoreState } from './stores/TurnNavigationStore' import useBackgroundLayer from '@/layers/UseBackgroundLayer' import useQueryPointsLayer from '@/layers/UseQueryPointsLayer' import usePathsLayer from '@/layers/UsePathsLayer' @@ -48,7 +48,7 @@ import VolumeOffIcon from '@/turnNavigation/volume_off.svg' import PlainButton from '@/PlainButton' import TurnNavigation from '@/turnNavigation/TurnNavigation' import useCurrentLocationLayer from '@/layers/CurrentLocationLayer' -import turnNavigation from "@/turnNavigation/TurnNavigation"; +import turnNavigation from '@/turnNavigation/TurnNavigation' export const POPUP_CONTAINER_ID = 'popup-container' export const SIDEBAR_CONTENT_ID = 'sidebar-content' @@ -179,7 +179,11 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, info, turnNav ) } > - {turnNavigation.settings.soundEnabled ? : } + {turnNavigation.settings.soundEnabled ? ( + + ) : ( + + )}
    @@ -250,7 +254,11 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, turnNav ) } > - {turnNavigation.settings.soundEnabled ? : } + {turnNavigation.settings.soundEnabled ? ( + + ) : ( + + )}
    diff --git a/src/ShowDistanceInMilesContext.ts b/src/ShowDistanceInMilesContext.ts index d90d5a03..c92133a2 100644 --- a/src/ShowDistanceInMilesContext.ts +++ b/src/ShowDistanceInMilesContext.ts @@ -1,5 +1,5 @@ import React from 'react' import { Settings } from '@/stores/SettingsStore' export const ShowDistanceInMilesContext = React.createContext({ - showDistanceInMiles: false + showDistanceInMiles: false, }) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index b7d652a8..9f3e7fa3 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -21,9 +21,9 @@ export class LocationUpdate implements Action { readonly heading: number constructor(coordinate: Coordinate, speed: number, heading: number) { - this.coordinate = coordinate; - this.speed = speed; - this.heading = heading; + this.coordinate = coordinate + this.speed = speed + this.heading = heading } } @@ -39,7 +39,7 @@ export class TurnNavigationRerouting implements Action { readonly path: Path constructor(path: Path) { - this.path = path; + this.path = path } } diff --git a/src/index.tsx b/src/index.tsx index f47d1eea..adc602f3 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -26,7 +26,7 @@ import { setStores, } from '@/stores/Stores' import MapOptionsStore from '@/stores/MapOptionsStore' -import TurnNavigationStore, {TNSettingsState} from '@/stores/TurnNavigationStore' +import TurnNavigationStore, { TNSettingsState } from '@/stores/TurnNavigationStore' import PathDetailsStore from '@/stores/PathDetailsStore' import Dispatcher from '@/stores/Dispatcher' import NavBar from '@/NavBar' @@ -79,7 +79,9 @@ const smallScreenMediaQuery = window.matchMedia('(max-width: 44rem)') const mapActionReceiver = new MapActionReceiver(getMap(), routeStore, () => smallScreenMediaQuery.matches) Dispatcher.register(mapActionReceiver) -Dispatcher.dispatch(new TurnNavigationSettingsUpdate({ fakeGPS: fake !== '', soundEnabled: fake === '' } as TNSettingsState)) +Dispatcher.dispatch( + new TurnNavigationSettingsUpdate({ fakeGPS: fake !== '', soundEnabled: fake === '' } as TNSettingsState) +) getApi().infoWithDispatch() // get infos about the api as soon as possible diff --git a/src/layers/UsePathsLayer.tsx b/src/layers/UsePathsLayer.tsx index 45319e79..65950318 100644 --- a/src/layers/UsePathsLayer.tsx +++ b/src/layers/UsePathsLayer.tsx @@ -12,8 +12,8 @@ import { click } from 'ol/events/condition' import Dispatcher from '@/stores/Dispatcher' import { SetSelectedPath } from '@/actions/Actions' import { SelectEvent } from 'ol/interaction/Select' -import {TurnNavigationStoreState} from "@/stores/TurnNavigationStore"; -import {RouteStoreState} from "@/stores/RouteStore"; +import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' +import { RouteStoreState } from '@/stores/RouteStore' const pathsLayerKey = 'pathsLayer' const selectedPathLayerKey = 'selectedPathLayer' @@ -21,7 +21,7 @@ const selectedPathLayerKey = 'selectedPathLayer' export default function usePathsLayer(map: Map, route: RouteStoreState, turnNavigation: TurnNavigationStoreState) { useEffect(() => { removeCurrentPathLayers(map) - if(turnNavigation.enabled) { + if (turnNavigation.enabled) { addSelectedPathsLayer(map, turnNavigation.activePath) } else { addUnselectedPathsLayer( diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 8cdaf8c3..ef0243c9 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -16,7 +16,7 @@ import { tr } from '@/translation/Translation' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import { ApiImpl } from '@/api/Api' import { getTurnNavigationStore } from '@/stores/Stores' -import {TNSettingsState, TurnNavigationStoreState} from "@/stores/TurnNavigationStore"; +import { TNSettingsState, TurnNavigationStoreState } from '@/stores/TurnNavigationStore' export interface RoutingResultsProps { paths: Path[] @@ -34,7 +34,17 @@ export default function RoutingResults(props: RoutingResultsProps) { return
      {isShortScreen ? createSingletonListContent(props) : createListContent(props)}
    } -function RoutingResult({ path, isSelected, profile, turnNavigation }: { path: Path; isSelected: boolean; profile: string; turnNavigation: TurnNavigationStoreState }) { +function RoutingResult({ + path, + isSelected, + profile, + turnNavigation, +}: { + path: Path + isSelected: boolean + profile: string + turnNavigation: TurnNavigationStoreState +}) { const [isExpanded, setExpanded] = useState(false) const resultSummaryClass = isSelected ? styles.resultSummary + ' ' + styles.selectedResultSummary @@ -66,8 +76,12 @@ function RoutingResult({ path, isSelected, profile, turnNavigation }: { path: Pa { - Dispatcher.dispatch(new TurnNavigationSettingsUpdate({ acceptedRisk: true } as TNSettingsState)) - turnNavigation.settings.fakeGPS ? getTurnNavigationStore().initFake() : getTurnNavigationStore().initReal() + Dispatcher.dispatch( + new TurnNavigationSettingsUpdate({ acceptedRisk: true } as TNSettingsState) + ) + turnNavigation.settings.fakeGPS + ? getTurnNavigationStore().initFake() + : getTurnNavigationStore().initReal() }} > {tr('accept_risks_after_warning')} @@ -106,7 +120,10 @@ function RoutingResult({ path, isSelected, profile, turnNavigation }: { path: Pa className={styles.exportButton} onClick={() => { if (!turnNavigation.settings.acceptedRisk) setShowRisk(true) - else turnNavigation.settings.fakeGPS ? getTurnNavigationStore().initFake() : getTurnNavigationStore().initReal() + else + turnNavigation.settings.fakeGPS + ? getTurnNavigationStore().initFake() + : getTurnNavigationStore().initReal() }} > @@ -258,7 +275,14 @@ function getLength(paths: Path[], subRequests: SubRequest[]) { function createSingletonListContent(props: RoutingResultsProps) { if (props.paths.length > 0) - return + return ( + + ) if (hasPendingRequests(props.currentRequest.subRequests)) return return '' } @@ -270,7 +294,13 @@ function createListContent({ paths, currentRequest, selectedPath, profile, turnN for (let i = 0; i < length; i++) { if (i < paths.length) result.push( - + ) else result.push() } diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index cde2ca54..444d759e 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -1,6 +1,6 @@ -import {Action, ActionReceiver} from '@/stores/Dispatcher' -import {Map} from 'ol' -import {fromLonLat} from 'ol/proj' +import { Action, ActionReceiver } from '@/stores/Dispatcher' +import { Map } from 'ol' +import { fromLonLat } from 'ol/proj' import { InfoReceived, PathDetailsRangeSelected, @@ -10,8 +10,8 @@ import { ZoomMapToPoint, } from '@/actions/Actions' import RouteStore from '@/stores/RouteStore' -import {Bbox} from '@/api/graphhopper' -import {toRadians} from 'ol/math' +import { Bbox } from '@/api/graphhopper' +import { toRadians } from 'ol/math' export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -40,7 +40,10 @@ export default class MapActionReceiver implements ActionReceiver { // The heading is in degrees and shows direction into which device is going. // And although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. - const rotation = (!action.heading || Number.isNaN(action.heading)) ? this.map.getView().getRotation() : -toRadians(action.heading) + const rotation = + !action.heading || Number.isNaN(action.heading) + ? this.map.getView().getRotation() + : -toRadians(action.heading) this.map.getView().animate({ zoom: action.zoom, center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), diff --git a/src/stores/RouteStore.ts b/src/stores/RouteStore.ts index ba93180a..8240549e 100644 --- a/src/stores/RouteStore.ts +++ b/src/stores/RouteStore.ts @@ -6,8 +6,9 @@ import { RemovePoint, RouteRequestSuccess, SetPoint, - SetSelectedPath, TurnNavigationSettingsUpdate, - TurnNavigationStop + SetSelectedPath, + TurnNavigationSettingsUpdate, + TurnNavigationStop, } from '@/actions/Actions' import QueryStore, { RequestState } from '@/stores/QueryStore' import { Path, RoutingArgs, RoutingResult } from '@/api/graphhopper' diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 6f175ab3..5d3ebb98 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -1,24 +1,26 @@ -import {Coordinate, QueryStoreState} from '@/stores/QueryStore' +import { Coordinate, QueryStoreState } from '@/stores/QueryStore' import Store from '@/stores/Store' import { ErrorAction, - LocationUpdate, SetRoutingParametersAtOnce, - SetSelectedPath, SetVehicleProfile, + LocationUpdate, + SetRoutingParametersAtOnce, + SetSelectedPath, + SetVehicleProfile, TurnNavigationRerouting, TurnNavigationSettingsUpdate, TurnNavigationStop, - ZoomMapToPoint + ZoomMapToPoint, } from '@/actions/Actions' -import Dispatcher, {Action} from '@/stores/Dispatcher' +import Dispatcher, { Action } from '@/stores/Dispatcher' import NoSleep from 'nosleep.js' -import {SpeechSynthesizer} from '@/SpeechSynthesizer' -import Api, {ApiImpl} from '@/api/Api' -import {calcOrientation, getCurrentDetails, getCurrentInstruction, toNorthBased} from '@/turnNavigation/GeoMethods' +import { SpeechSynthesizer } from '@/SpeechSynthesizer' +import Api, { ApiImpl } from '@/api/Api' +import { calcOrientation, getCurrentDetails, getCurrentInstruction, toNorthBased } from '@/turnNavigation/GeoMethods' import * as config from 'config' -import {toDegrees} from 'ol/math' -import {Instruction, Path, RoutingArgs, RoutingProfile} from "@/api/graphhopper"; -import {getTurnNavigationStore} from "@/stores/Stores"; -import {tr} from "@/translation/Translation"; +import { toDegrees } from 'ol/math' +import { Instruction, Path, RoutingArgs, RoutingProfile } from '@/api/graphhopper' +import { getTurnNavigationStore } from '@/stores/Stores' +import { tr } from '@/translation/Translation' export interface TurnNavigationStoreState { enabled: boolean @@ -64,7 +66,7 @@ export default class TurnNavigationStore extends Store constructor(api: Api, speechSynthesizer: SpeechSynthesizer) { super({ enabled: false, - coordinate: {lat: 0, lng: 0}, + coordinate: { lat: 0, lng: 0 }, speed: 0, heading: 0, activePath: {} as Path, @@ -84,22 +86,22 @@ export default class TurnNavigationStore extends Store reduce(state: TurnNavigationStoreState, action: Action): TurnNavigationStoreState { if (action instanceof TurnNavigationStop) { this.stop() - return {...state, enabled: false, speed: 0, heading: 0} + return { ...state, enabled: false, speed: 0, heading: 0 } } else if (action instanceof TurnNavigationSettingsUpdate) { - return {...state, settings: action.settings} + return { ...state, settings: action.settings } } else if (action instanceof TurnNavigationRerouting) { return { ...state, activePath: action.path, } } else if (action instanceof SetRoutingParametersAtOnce) { - console.log("SetRoutingParametersAtOnce, profile: " + action.routingProfile.name) + console.log('SetRoutingParametersAtOnce, profile: ' + action.routingProfile.name) return { ...state, activeProfile: action.routingProfile.name, } } else if (action instanceof SetVehicleProfile) { - console.log("SetVehicleProfile, profile: " + action.profile.name) + console.log('SetVehicleProfile, profile: ' + action.profile.name) return { ...state, activeProfile: action.profile.name, @@ -112,34 +114,39 @@ export default class TurnNavigationStore extends Store activePath: action.path, } } else if (action instanceof LocationUpdate) { - const coordinate = action.coordinate const path = state.activePath - const {instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance} = + const { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } = getCurrentInstruction(path.instructions, coordinate) if (distanceToRoute > 50) { // TODO use heading in route request // TODO use correct customModel const fromPoint: [number, number] = [coordinate.lng, coordinate.lat] - const toPoint: [number, number] = [path.snapped_waypoints.coordinates[1][0], path.snapped_waypoints.coordinates[1][1]] + const toPoint: [number, number] = [ + path.snapped_waypoints.coordinates[1][0], + path.snapped_waypoints.coordinates[1][1], + ] const args: RoutingArgs = { points: [fromPoint, toPoint], maxAlternativeRoutes: 0, heading: action.heading, zoom: false, profile: state.activeProfile, - customModel: null + customModel: null, } - this.api.route(args).then(result => { - if (result.paths.length > 0) { - console.log("rerouting: {}", result.paths[0]) - getTurnNavigationStore().getSpeechSynthesizer().synthesize(tr('reroute')) - Dispatcher.dispatch(new TurnNavigationRerouting(result.paths[0])) - } else { - console.log("rerouting found no path: {}", result) - } - }).catch(error => console.warn('error for reroute request: ', error)) + this.api + .route(args) + .then(result => { + if (result.paths.length > 0) { + console.log('rerouting: {}', result.paths[0]) + getTurnNavigationStore().getSpeechSynthesizer().synthesize(tr('reroute')) + Dispatcher.dispatch(new TurnNavigationRerouting(result.paths[0])) + } else { + console.log('rerouting found no path: {}', result) + } + }) + .catch(error => console.warn('error for reroute request: ', error)) return { ...state, heading: action.heading, @@ -148,7 +155,7 @@ export default class TurnNavigationStore extends Store } } - if (instructionIndex < 0) throw new Error("Instruction should be valid if distanceToRoute is small") + if (instructionIndex < 0) throw new Error('Instruction should be valid if distanceToRoute is small') const instructionState = state.instruction const nextInstruction: Instruction = path.instructions[instructionIndex] @@ -162,7 +169,8 @@ export default class TurnNavigationStore extends Store if ( distanceToNext <= lastAnnounceDistance && - (instructionState.distanceToNext > lastAnnounceDistance || instructionIndex != instructionState.index) + (instructionState.distanceToNext > lastAnnounceDistance || + instructionIndex != instructionState.index) ) { getTurnNavigationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) } @@ -172,7 +180,8 @@ export default class TurnNavigationStore extends Store averageSpeed > 15 && // two announcements only if faster speed distanceToNext > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) distanceToNext <= firstAnnounceDistance && - (instructionState.distanceToNext > firstAnnounceDistance || instructionIndex != instructionState.index) + (instructionState.distanceToNext > firstAnnounceDistance || + instructionIndex != instructionState.index) ) { let inString = distanceToNext > 800 @@ -197,8 +206,8 @@ export default class TurnNavigationStore extends Store heading: action.heading, speed: action.speed, coordinate: coordinate, - instruction: {index: instructionIndex, distanceToNext, remainingTime, remainingDistance, text}, - pathDetails: {estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass} + instruction: { index: instructionIndex, distanceToNext, remainingTime, remainingDistance, text }, + pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, } } return state @@ -266,9 +275,9 @@ export default class TurnNavigationStore extends Store } private locationUpdate(pos: any) { - let c = {lat: pos.coords.latitude, lng: pos.coords.longitude} + let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, true, pos.coords.heading)) - Dispatcher.dispatch(new LocationUpdate(c, pos.coords.speed, pos.coords.heading? pos.coords.heading : 0 )) + Dispatcher.dispatch(new LocationUpdate(c, pos.coords.speed, pos.coords.heading ? pos.coords.heading : 0)) } public initReal() { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index a34685b9..cf69f3aa 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -4,11 +4,11 @@ import { metersToText, milliSecondsToText } from '@/Converters' import { getTurnSign } from '@/sidebar/instructions/Instructions' import styles from '@/turnNavigation/TurnNavigation.module.css' import endNavigation from '@/turnNavigation/end_turn_navigation.png' -import { TurnNavigationStoreState} from '@/stores/TurnNavigationStore' +import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import Dispatcher from '@/stores/Dispatcher' import { TurnNavigationStop, ZoomMapToPoint } from '@/actions/Actions' -export default function ({turnNavigation}: {turnNavigation: TurnNavigationStoreState}) { +export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { const path = turnNavigation.activePath const instruction = turnNavigation.instruction const pd = turnNavigation.pathDetails From 784d86504409951d34d3ae9943c3d74df7ae60f8 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 17:19:56 +0200 Subject: [PATCH 130/322] include heading --- src/api/Api.ts | 6 ++++++ src/api/graphhopper.d.ts | 2 ++ src/stores/TurnNavigationStore.ts | 3 --- src/turnNavigation/TurnNavigation.tsx | 1 - 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/api/Api.ts b/src/api/Api.ts index a914beed..3c063749 100644 --- a/src/api/Api.ts +++ b/src/api/Api.ts @@ -169,8 +169,14 @@ export class ApiImpl implements Api { } if (args.customModel) { + request['ch.disable'] = true request.custom_model = args.customModel + } + + if (args.heading) { request['ch.disable'] = true + request.headings = [args.heading] + request.heading_penalty = 120 } if (args.points.length <= 2 && args.maxAlternativeRoutes > 1) { diff --git a/src/api/graphhopper.d.ts b/src/api/graphhopper.d.ts index 1f596df9..1d273f4d 100644 --- a/src/api/graphhopper.d.ts +++ b/src/api/graphhopper.d.ts @@ -23,6 +23,8 @@ export interface RoutingRequest { instructions: boolean elevation: boolean optimize: string + headings?: number[] + heading_penalty?: number 'alternative_route.max_paths'?: number 'alternative_route.max_weight_factor'?: number 'ch.disable'?: boolean diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 5d3ebb98..2c282f83 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -107,8 +107,6 @@ export default class TurnNavigationStore extends Store activeProfile: action.profile.name, } } else if (action instanceof SetSelectedPath) { - // TODO recalculate with headings, no alternative and only the first 2 points? - // trigger ReroutingAction!? return { ...state, activePath: action.path, @@ -120,7 +118,6 @@ export default class TurnNavigationStore extends Store getCurrentInstruction(path.instructions, coordinate) if (distanceToRoute > 50) { - // TODO use heading in route request // TODO use correct customModel const fromPoint: [number, number] = [coordinate.lng, coordinate.lat] const toPoint: [number, number] = [ diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index cf69f3aa..75cb21c8 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,5 +1,4 @@ import React, { useState } from 'react' -import { Path } from '@/api/graphhopper' import { metersToText, milliSecondsToText } from '@/Converters' import { getTurnSign } from '@/sidebar/instructions/Instructions' import styles from '@/turnNavigation/TurnNavigation.module.css' From 5e0750683cf00b8195e9a7603f51ac365ac79ce3 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 17:29:40 +0200 Subject: [PATCH 131/322] fix fake param --- src/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.tsx b/src/index.tsx index adc602f3..8df8074f 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -80,7 +80,7 @@ const mapActionReceiver = new MapActionReceiver(getMap(), routeStore, () => smal Dispatcher.register(mapActionReceiver) Dispatcher.dispatch( - new TurnNavigationSettingsUpdate({ fakeGPS: fake !== '', soundEnabled: fake === '' } as TNSettingsState) + new TurnNavigationSettingsUpdate({ fakeGPS: fake != null, soundEnabled: fake == null } as TNSettingsState) ) getApi().infoWithDispatch() // get infos about the api as soon as possible From 3db839184ef12674bf7fa36409f808d46989eb26 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 17:38:19 +0200 Subject: [PATCH 132/322] proper TNSettingsState merge --- src/stores/TurnNavigationStore.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 2c282f83..65f0f851 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -71,7 +71,7 @@ export default class TurnNavigationStore extends Store heading: 0, activePath: {} as Path, activeProfile: '', - settings: {} as TNSettingsState, + settings: { acceptedRisk: false, fakeGPS: false, soundEnabled: false } as TNSettingsState, instruction: {} as TNInstructionState, pathDetails: {} as TNPathDetailsState, }) @@ -88,7 +88,7 @@ export default class TurnNavigationStore extends Store this.stop() return { ...state, enabled: false, speed: 0, heading: 0 } } else if (action instanceof TurnNavigationSettingsUpdate) { - return { ...state, settings: action.settings } + return { ...state, settings: {...state.settings, ...action.settings} } } else if (action instanceof TurnNavigationRerouting) { return { ...state, From f789da2d75a349bbdfaad4e2a1c3db5bed11657b Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 21:38:55 +0200 Subject: [PATCH 133/322] use navi icon on map; keep instruction index and active path synced --- src/layers/CurrentLocationLayer.tsx | 32 ++++++++++------------------- src/stores/TurnNavigationStore.ts | 29 +++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index e12a2634..65686080 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -5,7 +5,7 @@ import { Point } from 'ol/geom' import { fromLonLat } from 'ol/proj' import VectorLayer from 'ol/layer/Vector' import VectorSource from 'ol/source/Vector' -import { Circle, Fill, Stroke, Style } from 'ol/style' +import { Style, Icon } from 'ol/style' export default function useCurrentLocationLayer(map: Map, location: Coordinate) { useEffect(() => { @@ -36,34 +36,24 @@ function changeLocation(layer: VectorLayer, location: Coordinate) function addCurrentLocation(map: Map, location: Coordinate) { const currentLocationLayer = new VectorLayer({ source: new VectorSource({ - features: [ - new Feature({ - geometry: new Point(fromLonLat([location.lng, location.lat])), - }), - ], + features: [new Feature({ + geometry: new Point(fromLonLat([location.lng, location.lat])) + })] }), }) currentLocationLayer.set('gh:current_location', true) currentLocationLayer.setZIndex(3) - const fill = new Fill({ - color: 'rgba(255,255,255,0.4)', - }) - const stroke = new Stroke({ - color: '#0054ff', - width: 2, - }) - + // TODO avoid copy of navigation.svg + const svgData = '' + + '' currentLocationLayer.setStyle( feature => new Style({ - image: new Circle({ - fill: fill, - stroke: stroke, - radius: 10, - }), - fill: fill, - stroke: stroke, + image: new Icon({ + anchor: [0, 0], + src: 'data:image/svg+xml;utf8,' + svgData, + }) }) ) map.addLayer(currentLocationLayer) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 65f0f851..201f7dad 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -90,9 +90,29 @@ export default class TurnNavigationStore extends Store } else if (action instanceof TurnNavigationSettingsUpdate) { return { ...state, settings: {...state.settings, ...action.settings} } } else if (action instanceof TurnNavigationRerouting) { + const path = action.path + if(!state.enabled) + return { + ...state, + activePath: path, + } + + // ensure that path and instruction are synced + const { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } = + getCurrentInstruction(path.instructions, state.coordinate) + const text = path.instructions[instructionIndex].street_name + const [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, state.coordinate, [ + path.details.average_speed, + path.details.max_speed, + path.details.surface, + path.details.road_class, + ]) + return { ...state, activePath: action.path, + instruction: { index: instructionIndex, distanceToNext, remainingTime, remainingDistance, text }, + pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, } } else if (action instanceof SetRoutingParametersAtOnce) { console.log('SetRoutingParametersAtOnce, profile: ' + action.routingProfile.name) @@ -107,6 +127,9 @@ export default class TurnNavigationStore extends Store activeProfile: action.profile.name, } } else if (action instanceof SetSelectedPath) { + // no need to update instruction as changing the path should happen only outside of the navigation + if(state.enabled) throw new Error("Changing path while turn navigation should not happen") + return { ...state, activePath: action.path, @@ -157,7 +180,7 @@ export default class TurnNavigationStore extends Store const instructionState = state.instruction const nextInstruction: Instruction = path.instructions[instructionIndex] - let text = nextInstruction.street_name + const text = nextInstruction.street_name if (state.settings.soundEnabled) { // making lastAnnounceDistance dependent on location.speed is tricky because then it can change while driving, so pick the constant average speed // TODO use instruction average speed of current+next instruction instead of whole path @@ -172,7 +195,7 @@ export default class TurnNavigationStore extends Store getTurnNavigationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) } - let firstAnnounceDistance = 1150 + const firstAnnounceDistance = 1150 if ( averageSpeed > 15 && // two announcements only if faster speed distanceToNext > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) @@ -190,7 +213,7 @@ export default class TurnNavigationStore extends Store } } - let [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, coordinate, [ + const [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, coordinate, [ path.details.average_speed, path.details.max_speed, path.details.surface, From 20f633903d12fcdb4d7ada37123c724b94f6a32a Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 21:53:13 +0200 Subject: [PATCH 134/322] minor simplify --- src/index.tsx | 6 +----- src/stores/TurnNavigationStore.ts | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/index.tsx b/src/index.tsx index 8df8074f..1c692157 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -56,7 +56,7 @@ setStores({ infoStore: new ApiInfoStore(), errorStore: new ErrorStore(), mapOptionsStore: new MapOptionsStore(), - turnNavigationStore: new TurnNavigationStore(getApi(), speechSynthesizer), + turnNavigationStore: new TurnNavigationStore(getApi(), speechSynthesizer, fake != null), pathDetailsStore: new PathDetailsStore(), mapFeatureStore: new MapFeatureStore(), }) @@ -79,10 +79,6 @@ const smallScreenMediaQuery = window.matchMedia('(max-width: 44rem)') const mapActionReceiver = new MapActionReceiver(getMap(), routeStore, () => smallScreenMediaQuery.matches) Dispatcher.register(mapActionReceiver) -Dispatcher.dispatch( - new TurnNavigationSettingsUpdate({ fakeGPS: fake != null, soundEnabled: fake == null } as TNSettingsState) -) - getApi().infoWithDispatch() // get infos about the api as soon as possible // hook up the navbar to the query store and vice versa diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 201f7dad..dfd120b1 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -63,7 +63,7 @@ export default class TurnNavigationStore extends Store private readonly speechSynthesizer: SpeechSynthesizer private started: boolean = false - constructor(api: Api, speechSynthesizer: SpeechSynthesizer) { + constructor(api: Api, speechSynthesizer: SpeechSynthesizer, fakeGPS: boolean) { super({ enabled: false, coordinate: { lat: 0, lng: 0 }, @@ -71,7 +71,7 @@ export default class TurnNavigationStore extends Store heading: 0, activePath: {} as Path, activeProfile: '', - settings: { acceptedRisk: false, fakeGPS: false, soundEnabled: false } as TNSettingsState, + settings: { acceptedRisk: false, fakeGPS: fakeGPS, soundEnabled: !fakeGPS } as TNSettingsState, instruction: {} as TNInstructionState, pathDetails: {} as TNPathDetailsState, }) From c6659bd361f3bbbd1109c30c08599571c52ff5ff Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 21:55:02 +0200 Subject: [PATCH 135/322] fix test --- src/layers/CurrentLocationLayer.tsx | 13 ++++++++----- src/stores/TurnNavigationStore.ts | 6 +++--- test/routing/Api.test.ts | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index 65686080..9a375f60 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -36,16 +36,19 @@ function changeLocation(layer: VectorLayer, location: Coordinate) function addCurrentLocation(map: Map, location: Coordinate) { const currentLocationLayer = new VectorLayer({ source: new VectorSource({ - features: [new Feature({ - geometry: new Point(fromLonLat([location.lng, location.lat])) - })] + features: [ + new Feature({ + geometry: new Point(fromLonLat([location.lng, location.lat])), + }), + ], }), }) currentLocationLayer.set('gh:current_location', true) currentLocationLayer.setZIndex(3) // TODO avoid copy of navigation.svg - const svgData = '' + + const svgData = + '' + '' currentLocationLayer.setStyle( feature => @@ -53,7 +56,7 @@ function addCurrentLocation(map: Map, location: Coordinate) { image: new Icon({ anchor: [0, 0], src: 'data:image/svg+xml;utf8,' + svgData, - }) + }), }) ) map.addLayer(currentLocationLayer) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index dfd120b1..d5694651 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -88,10 +88,10 @@ export default class TurnNavigationStore extends Store this.stop() return { ...state, enabled: false, speed: 0, heading: 0 } } else if (action instanceof TurnNavigationSettingsUpdate) { - return { ...state, settings: {...state.settings, ...action.settings} } + return { ...state, settings: { ...state.settings, ...action.settings } } } else if (action instanceof TurnNavigationRerouting) { const path = action.path - if(!state.enabled) + if (!state.enabled) return { ...state, activePath: path, @@ -128,7 +128,7 @@ export default class TurnNavigationStore extends Store } } else if (action instanceof SetSelectedPath) { // no need to update instruction as changing the path should happen only outside of the navigation - if(state.enabled) throw new Error("Changing path while turn navigation should not happen") + if (state.enabled) throw new Error('Changing path while turn navigation should not happen') return { ...state, diff --git a/test/routing/Api.test.ts b/test/routing/Api.test.ts index 899ab370..cb58fa52 100644 --- a/test/routing/Api.test.ts +++ b/test/routing/Api.test.ts @@ -230,8 +230,8 @@ describe('route', () => { 'track_type', 'country', ], - custom_model: args.customModel!, 'ch.disable': true, + custom_model: args.customModel!, } const mockedDispatcher = jest.spyOn(Dispatcher, 'dispatch') From accb54e9b877243ca975a2612ab178b3e90ea3e8 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 21:58:45 +0200 Subject: [PATCH 136/322] simplify settings back to master --- src/App.tsx | 2 +- src/ShowDistanceInMilesContext.ts | 5 +---- src/layers/PathDetailPopup.tsx | 2 +- src/sidebar/RoutingResults.tsx | 2 +- src/sidebar/instructions/Instructions.tsx | 2 +- 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 32a8d1c9..b7c9b8f5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -121,7 +121,7 @@ export default function App() { const isSmallScreen = useMediaQuery({ query: '(max-width: 44rem)' }) return ( - +
    diff --git a/src/ShowDistanceInMilesContext.ts b/src/ShowDistanceInMilesContext.ts index c92133a2..3498d311 100644 --- a/src/ShowDistanceInMilesContext.ts +++ b/src/ShowDistanceInMilesContext.ts @@ -1,5 +1,2 @@ import React from 'react' -import { Settings } from '@/stores/SettingsStore' -export const ShowDistanceInMilesContext = React.createContext({ - showDistanceInMiles: false, -}) +export const ShowDistanceInMilesContext = React.createContext(false) diff --git a/src/layers/PathDetailPopup.tsx b/src/layers/PathDetailPopup.tsx index b6f69ede..5368cff5 100644 --- a/src/layers/PathDetailPopup.tsx +++ b/src/layers/PathDetailPopup.tsx @@ -34,7 +34,7 @@ export default function PathDetailPopup({ map, pathDetails }: PathDetailPopupPro overlay?.setPosition(position) }, [pathDetails.pathDetailsPoint]) - const { showDistanceInMiles } = useContext(ShowDistanceInMilesContext) + const showDistanceInMiles = useContext(ShowDistanceInMilesContext) return ( // todo: use createMapMarker from heightgraph? diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index ef0243c9..63560777 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -59,7 +59,7 @@ function RoutingResult({ const hasBorderCrossed = crossesBorder(path.details.country) const showHints = hasFords || hasTolls || hasFerries || showAndHasBadTracks || showAndHasSteps || hasBorderCrossed - const { showDistanceInMiles } = useContext(ShowDistanceInMilesContext) + const showDistanceInMiles = useContext(ShowDistanceInMilesContext) let [showRisk, setShowRisk] = useState(false) if (!turnNavigation.settings.acceptedRisk && showRisk) return ( diff --git a/src/sidebar/instructions/Instructions.tsx b/src/sidebar/instructions/Instructions.tsx index d86fe23d..65934001 100644 --- a/src/sidebar/instructions/Instructions.tsx +++ b/src/sidebar/instructions/Instructions.tsx @@ -34,7 +34,7 @@ export default function (props: { instructions: Instruction[] }) { } const Line = function ({ instruction, index }: { instruction: Instruction; index: number }) { - const { showDistanceInMiles } = useContext(ShowDistanceInMilesContext) + const showDistanceInMiles = useContext(ShowDistanceInMilesContext) return (
  • {getTurnSign(instruction.sign, index)} From 0f6cb2a1dbde0d70193781c56e567d500ace7fbc Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 22:11:51 +0200 Subject: [PATCH 137/322] avoid multiple API requests at the same time --- src/actions/Actions.ts | 3 ++ src/stores/TurnNavigationStore.ts | 69 +++++++++++++++++++------------ 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 9f3e7fa3..47adfb45 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -35,6 +35,9 @@ export class TurnNavigationSettingsUpdate implements Action { } } +export class TurnNavigationReroutingFailed implements Action { +} + export class TurnNavigationRerouting implements Action { readonly path: Path diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index d5694651..5c351597 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -6,7 +6,7 @@ import { SetRoutingParametersAtOnce, SetSelectedPath, SetVehicleProfile, - TurnNavigationRerouting, + TurnNavigationRerouting, TurnNavigationReroutingFailed, TurnNavigationSettingsUpdate, TurnNavigationStop, ZoomMapToPoint, @@ -29,6 +29,7 @@ export interface TurnNavigationStoreState { heading: number activePath: Path activeProfile: string + rerouteInProgress: boolean settings: TNSettingsState instruction: TNInstructionState pathDetails: TNPathDetailsState @@ -70,6 +71,7 @@ export default class TurnNavigationStore extends Store speed: 0, heading: 0, activePath: {} as Path, + rerouteInProgress: false, activeProfile: '', settings: { acceptedRisk: false, fakeGPS: fakeGPS, soundEnabled: !fakeGPS } as TNSettingsState, instruction: {} as TNInstructionState, @@ -88,7 +90,12 @@ export default class TurnNavigationStore extends Store this.stop() return { ...state, enabled: false, speed: 0, heading: 0 } } else if (action instanceof TurnNavigationSettingsUpdate) { - return { ...state, settings: { ...state.settings, ...action.settings } } + return {...state, settings: {...state.settings, ...action.settings}} + } else if(action instanceof TurnNavigationReroutingFailed) { + return { + ...state, + rerouteInProgress: false, + } } else if (action instanceof TurnNavigationRerouting) { const path = action.path if (!state.enabled) @@ -111,6 +118,7 @@ export default class TurnNavigationStore extends Store return { ...state, activePath: action.path, + rerouteInProgress: false, instruction: { index: instructionIndex, distanceToNext, remainingTime, remainingDistance, text }, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, } @@ -142,33 +150,42 @@ export default class TurnNavigationStore extends Store if (distanceToRoute > 50) { // TODO use correct customModel - const fromPoint: [number, number] = [coordinate.lng, coordinate.lat] - const toPoint: [number, number] = [ - path.snapped_waypoints.coordinates[1][0], - path.snapped_waypoints.coordinates[1][1], - ] - const args: RoutingArgs = { - points: [fromPoint, toPoint], - maxAlternativeRoutes: 0, - heading: action.heading, - zoom: false, - profile: state.activeProfile, - customModel: null, + + if(state.activeProfile && !state.rerouteInProgress) { + const fromPoint: [number, number] = [coordinate.lng, coordinate.lat] + const toPoint: [number, number] = [ + path.snapped_waypoints.coordinates[1][0], + path.snapped_waypoints.coordinates[1][1], + ] + const args: RoutingArgs = { + points: [fromPoint, toPoint], + maxAlternativeRoutes: 0, + heading: action.heading, + zoom: false, + profile: state.activeProfile, + customModel: null, + } + this.api + .route(args) + .then(result => { + if (result.paths.length > 0) { + console.log('rerouting: {}', result.paths[0]) + getTurnNavigationStore().getSpeechSynthesizer().synthesize(tr('reroute')) + Dispatcher.dispatch(new TurnNavigationRerouting(result.paths[0])) + } else { + console.log('rerouting found no path: {}', result) + Dispatcher.dispatch(new TurnNavigationReroutingFailed()) + } + }) + .catch(error => { + console.warn('error for reroute request: ', error) + Dispatcher.dispatch(new TurnNavigationReroutingFailed()) + }) } - this.api - .route(args) - .then(result => { - if (result.paths.length > 0) { - console.log('rerouting: {}', result.paths[0]) - getTurnNavigationStore().getSpeechSynthesizer().synthesize(tr('reroute')) - Dispatcher.dispatch(new TurnNavigationRerouting(result.paths[0])) - } else { - console.log('rerouting found no path: {}', result) - } - }) - .catch(error => console.warn('error for reroute request: ', error)) + return { ...state, + rerouteInProgress: true, heading: action.heading, speed: action.speed, coordinate: coordinate, From d171e92673abb886948acad5cde3f7fb3b92e0bc Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 22:14:26 +0200 Subject: [PATCH 138/322] warn if rerouting was skipped --- src/stores/TurnNavigationStore.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 5c351597..57b7cdba 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -181,6 +181,8 @@ export default class TurnNavigationStore extends Store console.warn('error for reroute request: ', error) Dispatcher.dispatch(new TurnNavigationReroutingFailed()) }) + } else { + console.warn("profile=" + state.activeProfile + ", reroute in progress = " + state.rerouteInProgress) } return { From 147034b33efce1beb7a07f5eb3fc46bb8b651a68 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 22:50:54 +0200 Subject: [PATCH 139/322] no need for extra end_turn_navigation.png --- src/sidebar/ErrorMessage.module.css | 13 +++++++++---- src/sidebar/times-solid.svg | 4 +++- src/turnNavigation/TurnNavigation.module.css | 19 +++++++++++++------ src/turnNavigation/TurnNavigation.tsx | 12 +++++++----- src/turnNavigation/end_turn_navigation.png | Bin 9587 -> 0 bytes 5 files changed, 32 insertions(+), 16 deletions(-) delete mode 100644 src/turnNavigation/end_turn_navigation.png diff --git a/src/sidebar/ErrorMessage.module.css b/src/sidebar/ErrorMessage.module.css index a4885d24..50c12425 100644 --- a/src/sidebar/ErrorMessage.module.css +++ b/src/sidebar/ErrorMessage.module.css @@ -17,12 +17,17 @@ } .errorMessageCloseBtn { - width: 0.8rem; - color: white; + height: 12px; + width: 12px; align-self: flex-start; - flex-shrink: 0; +} + +.errorMessageCloseBtn svg:hover { + fill: black; } .errorMessageCloseBtn svg { - width: 100%; + fill: #444444; + width: 12px; + height: 12px; } diff --git a/src/sidebar/times-solid.svg b/src/sidebar/times-solid.svg index 81446224..35ed5779 100644 --- a/src/sidebar/times-solid.svg +++ b/src/sidebar/times-solid.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 55542d49..db6c22a5 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -42,19 +42,26 @@ padding-right: 22px; } -.arrivalDuration { -} - .debug { font-size: smaller; float: right; } -.thirdCol img { - max-height: 20px; +.thirdCol { + width: 20px; + height: 20px; +} + +.thirdCol svg { + width: 20px; + height: 20px; + padding-left: 0; + padding-right: 0; } -.details { +.thirdCol svg path { + fill: black; + stroke: black; } .maxSpeed { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 75cb21c8..e75b1ec7 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -2,10 +2,12 @@ import React, { useState } from 'react' import { metersToText, milliSecondsToText } from '@/Converters' import { getTurnSign } from '@/sidebar/instructions/Instructions' import styles from '@/turnNavigation/TurnNavigation.module.css' -import endNavigation from '@/turnNavigation/end_turn_navigation.png' +import EndNavigation from '@/sidebar/times-solid.svg' import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import Dispatcher from '@/stores/Dispatcher' -import { TurnNavigationStop, ZoomMapToPoint } from '@/actions/Actions' +import {DismissLastError, TurnNavigationStop, ZoomMapToPoint} from '@/actions/Actions' +import Cross from "@/sidebar/times-solid.svg"; +import PlainButton from "@/PlainButton"; export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { const path = turnNavigation.activePath @@ -65,15 +67,15 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
  • ) : null}
    -
    { Dispatcher.dispatch(new TurnNavigationStop()) Dispatcher.dispatch(new ZoomMapToPoint(turnNavigation.coordinate, 15, 0, false, 0)) }} > - -
    + +
    {instruction.text}
    diff --git a/src/turnNavigation/end_turn_navigation.png b/src/turnNavigation/end_turn_navigation.png deleted file mode 100644 index 5098fda1b41c7849392029f715be4805c41c3e39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9587 zcmV-(C5+mMP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+NGOka%8uXh5us}vjljv9N382!7P8i0~Dz?YCTPi zsAiF6?gfyU$0R_r|L4Dt`7iz}HDwc1sk!BB`7gHEeCLO1-+%pncQ)Sd@0YLF+|SRO z?-x8z1s=ouwdT+Bo98|6_n+tI=Q^F|(+?MF`}4y1`Gx+ukguN`e4hWhQE=}Dc6~0? zKNkxAbLaSeAD=ttR?Cl5_RO z8t*#4{%*eB>KT*Y!3BH2*EhIH0ho8dz{nIB6%x^FJk_LHyo)5o7FMmJY=gqG#xb*kozA^n_L?wRT z*#9)5klgxd()F)@=d60pezWT_Gv)l5)YnX$xuHC3C<*SzGGB#%iJ!~;YJ647Ws+md zPCNLTt~pPLkBe@(?v8Q${xIESjL~mjc=Ub}bv;*!Me~zT6MB8Q;|t+mp%VH@ssx_( z=a|n}+`VtR_nXw;vdi&S@3@$9=s$j$fAgk)`Z`Com6 z7B$@k{`&ekAwPi)gfQJ@u1v7o@h&lv`zyD?4RqjriN{ymuB`WYT_|$z#9&+?1U5S| zAv;^VFV3-$l>l{TD`n*e5pXH_#UOnQArl*lfLj|rQ`~*8PyRg*N)m|_awx=x0wq{6 zCi17mN)GiDQcNl3R8mbX^&E0ER9Ma>3vPP}C6-ijDW#THdJQ$!RC6u0)>eD-Er7je9~}`diU0}i6*F61j9!sb%xv>iMe+L7Ez$P85qnjrHMN22<9|&#=gM2Wsomcn#_D0SQfD%_ zk`9-fM{n=2K-&JK6;3T-mekv+Im81_^+|vO>t9TZv&YG>T!9GA=4 zEbB#{Go)VU0wGy=*Ql*k9L2a-wl%KJ2rDbS(;`gPw!&h$+AOn< zJCELV!J0g?;Kz2hS!tYo_AF#z-i&E^-UksdlrR~{<~K&=D{pddWNo)lb`H>XXI_z@ z4O5!(u(_I#&rENZUIME7J=+Omk*cTI7wC{! zQU!Xg6u#pe6KS(8^EZ?;AO7`a8(`5jsPa4(d^$F(TuXNq)?7PxFo3BC|9O9k=G`wc zLH#t(+WoWmF5K5BphRV)KE^oqzBY+-J}eDOdX{DF$N5~yGw^XU^ydWaa}BCsFJDMW z0>jr#E~zxU46 zEwWc}m^2I_>WY}T{h5j7ThECP5U z*E#-`Vw45)41W4f2 z;_dC?lILwhlisfasy%6gg3B_F9gJHMFonbg!iC&K+98-*1T<20QomKUG3-0R zA~P&A;yiJj5uiXSa+jjHw7h`+c^tt5y_6hUvhV;2^>m+jrGRWC1nO-HD5hoiu*Qye2ZWQJQMz~+p_zQ?v)?&RN;IPI7!oG)j zb9zKyBnVpGO?kACfK_je&kz!xVw-L*bnLLEt!pBT* z!NOwHa&Ke&9Vl=I+P9r7IFDd1j^#)ZVF3m=g*RXqm;uUy5sVg53B2N?ozVfI$9UK? zAqY-hAjT<3oLS#o0mmgVfW8<7)|{Y5Ln-)SSKKWj_$qia8Tu?{EEsgh<&%Tdr;_gG z-QPT7RGQ53-@e7@hr}Y+SBh{zP-RZO1Lq@64*)Vll?o`HSL>485@lpyL)A50P9^-q zIffa0!hljnxjR2bSirPc9d&UrE)gZb6)G*gai6)i&D7NH+y&HJ#>bM6l4RtZPHQ0U zPzr-koxBEn>;joLdH-^HkXL%7Tw_5`BJ?T4W!fIhu{y;_EB!UdWo25=bp%{~LL%=|~rn-E)EGbc(zGRp~k9VMlSahF#FRyB7gR~Mi#mC@wc0OapXj8sCrV45Vy zyh}_^t^%?m>4!j?gb-%q7B>1$vf7A(gRcrw4$y7D zA`&!L2#?i9yAo!gE0VwH3Rnd(N|pnEU3HfL%B>P^?qLl{JKojNtZ z{(c}-F?ks? zvP#1s*Nzz7#{;?~Xv+j<$r*)E!D}W7Pyr-MY75(AJ^Djc+V%nL8Uj4s(&y29{qPyqv?103rXp#*?2nI#Pp>u^T8$`!Sh=9GC7*^DUP<;h zCL1sjUarJYEtdD}wRhiS4Dt))Om!mqaI665B!2^7a=DS1%sbq&9;vfhB7A2`k~l6m zN1Jn(PC-TYq|24kMfxU`J7CR-_@GF`kmhy_1h0rbf}~hH2vTVVpx22Nc5Br;sl&WT zm-$4Nx14?|qFb4#d3!tK2R0`e(fcj10^XBg7w~FsBf24we{+0jf-x7qX|S7jAXy z;^bN`J4NI~%?`3brJN41ZDBqu(h7i|1r<*U^Mzf4bbuH#8TijA8f7BN_{1ec4Dpa7 z6$-M=kXE1_&eI*w+oG4K;;mYpt}-agz0wsdc9wxfge_rlT-)x_1uN}lBqd;km}MXU zskf|85>wro&o|zI*oFtyct8hAuK+!nBAY_CSRT?>ED@M5r6$4dXd4ANaR|%sCK*n`>gi;1jL{SL(DgvFC zqzrFGmLA6_Nq5X0xammxh>t9F?KPts4A|C2nS}xR6>S8Bwl0<;BJZR5`azFG;^2?~ z@VeY@4_0)4F^YVTFc4yQAssn8B6HZLMSiPUI-+}6)3g~v7>-6K-QRuLtRiRtFh$QWsWD> z2djA0o`q>q#)zfz@sTpQK3$Z?bkCVES82*#|N4s2OX@n6J2Fc$^|unY2}Pw1VGwLt zkZ=q-3ga-_dqNiuU7x)m$D1zB7+wiBfo}9W?}W2QW6WCibI}!4ghZ9)z&Xi1c|VGr z;!QJ2{}~4z1=7q%p0$4QA6VpYhtLXy3nVCT3t1E{u(p)%La5)vLZF7#*tg~%1p2>w z6bscD3P;N2jy4Y`;1Xb=fJsqb4@HihXJ4q?2Q$-CBeQXDg3jp89PQ>*H zK>Jq9jQrhX(>L-O&rR=L?Sg;5`XM5;pZXykXet_tUC8`N&LCd12g$LG0zvcDp4;Wi z_3xPDsILVxjjiy z$WYlab$Sf7C2ay%AHPyagKEO=wH)Chyosp&HJGNv#ElpESK@xnR>2Py>2GU{qU2V` z`Q?b7ZpVPtHEMkJ!VO}c(#7e3s+bcip5H8zU2TznA+Sa;Fc}qa(b8u)@@xZB5sroS z@9V{U{ZOLt33r0egzNEsxyX)_$SCpgyAoHg;PrNVpUd8tpFfHD&|EYFcfv`yVuqT>O%VfVg$GfxY-$*mxH}+}3y9 zvNhp3ZFH!7doZ$UVoDA3v8v``oFBg}CH=anp!i)Qphli!MhFTh*A05H+8uA{woazx zs>BO|2}O4}%0XEN>B-K4-j$joL6n(m3E5NnF({A&_tmj5DMvQE^KK zDO=%-a0;uTTLZ67Hrz*(g73g9Mo4w#{!zeu9<@)}V+S+i4M0+>$MlE@8eE$c(H24h zIaZ#OLDQD>9cD(T1#!)Fc^D1NoO#dlnKyGoAF=HDWk%B;_#HZSO@f;lq;%q@Uh-Wv z-l*uRCP>e?jo!!rCFFw2glyG}1D3dS&^D8*!KoS` z3reJH2*pO~Y|Y%Gpp?iWI*_E5yU5C;vq0w9SGnLDlvZlL;fyrO-NYhrUrjhJWZ#Sv zUyKi|v4u8kz{~NO^xBB+X)UYk>yqvzOLy9^phUu(j1=?NzK9oBQdd@;A4$OQ`=-#u zU{7^Ay>9*J2wL}Q&EW;c-9aQf)ZxKzI=Bpu0Ir{5Dp)l<0YLmz0X}|pQf>sqsCEx# zuUic{%qbFuSBXbp@swK&7a;3`9%w6YndQ{ZM?%}oMDV)H_hc|MP#+0`3`wbV$28}J z1QFsS5H2gLfgNspt9_Kg>>p(ySkay5qWTviD&Ad8k}JF{dfjT}(MWH}7@b7sq@qFD zQ?@ofw%_UwZzQ%+R{^*`YFJ{nAwysc9AbT-cEH(l-7uQ^I{=1IX;T!P(rQtp{jmk+ zKa~~PbHzNcslYMR=QXc$f90#>FJ=iRl@HJhR2D1Kt}>B=BBn!mY&1AfOjC=J;TJswVh|? zM;c@}(P>)_v)$A#Kp?Aim%dwfgr1w&mca7XI^o%TO9lLR=!>(U$*<IGE z(wv-cJ6MR8wYR-MhPt(^+S^__rdF>{3nJZ21h{0DEns!kGkiV%6FgP)q+e6FL%XJG zC#ryTt_y-v#)vwiT-!!FzvfEIo z(<@T2#6SY!DwodOCu&9Rh#*Z-wwwesnO-)z)!yKR$L$Wko(^84*-k;6Uyk7B@9Xv1;qGRx6nK{3;40y! zFe`oQXWuQK8tZ=gy0rQ8PE~W)=&%+`>ZdDI0NzFMrLD!SrtIyE-==SQtyJ{s2hLHX zlH^W1WKO4ws;Z#03I#MB#gm8EK?1BD?7~9k+ZzGhBiPUVSHp@%i3K1XvDL=MnRn{( zx(}Ud1lMv^R~7*l5D;q01tb6e3hoxGEuAF|$M2*%Xhulo z%2iuN-Ib*iF*5`t#sK?^`gv(aX=<{bV#h&s$gkF^gJsB=&ZwvNmqkvcvUPTKkpod z6ek9`kdwD?&)d}KdQ}ascXMYl=FkZU)&u^s*Xs~>^(W_*Sgu0CLB=Xs{Okh%D+>;g z4u72NXekDtJApCMwaAd4KN)hhP7uSf+uVkc2UdJ5a!mIxTS z0W!jd;x0O;0hca-QoSLH3_>5c2o##Z;!z52kN`N4@b>vnoX;t8-M5jkgHErMd3!f% z?{N9(CrM7;O3fLyw}rz#th);=rl;8IJ?a8&S8W`V)?jK9 z^)TJz!vzV~RnYSYwTP6b4oZAx`M6?Uy4R1%kP+Hdhs7HHHl@|#tn%@9b49~xX})%> zmzVmerE-Dovn$SO)K4ek_HNhRGT5>&+8V_M>4*UtuzYyC86xHyKN~Y)MYS-L;wkf!eL)r2Klba*JA2l-XP8)wyAv=m3tMNkQmo6T;GC14*M^!y z02CNGl`w9PK+2b2o4Nf0Y3olrMcqbd7`h~>kZ}tdTU{rdLS*16dUysn0ur?O*tEy2 zGisCwzy&|tb4cN;?N+YZE-DReX%iZ+HM2pR&|c?m)VKg81y^28z=N#ODLVn#`W$%~ z7p=AZSt{{e*we}?&J|q4FsTka)&TDvOHpe_8l1&O>gmcgd#`;+ZGdZ=^EPIQj2cFW z9ic@>65==bq#Lt)Db=hqkI{v-qA6}VfHbQUzx@Ta5%SVmKZzpLJcQ=|0hrJON-*Q> z>e?bmI+MX-zzR_vdi0~j@edq+_dD)BhdOpOJt?L@v#>f4_hfgu8FB^!m6BLRXH8@p zt|l7y1P}Fw`G{&mvXnZ+2036d0ApChey;8ITkHe{LGjv-EMJ44l1Z@RRNS-)ckU)! zxmKvl3YB2y!mn@V)TZI$RgSk2ti?hRl$ISbHUt9G>ZgsHl1@}?i&H@w>Q1DOnPuO* z=pdQy^4FQU;z`Bw1egozQ4p0D9Db{}>w{bjz>+U^j54|`w^aE&v&s=gmO{fCW? z-yXFI2Gf8%;0`u@8{`%)tfT!7bGrFi;Abb|WwsYB}ZJhS;n{ z?V6XR)01G&kyQ2uNE{S&)d2)7NtkNSdJ6gOi%2pMFQ(0#n2e+|7jNW8fDc=tD9&sh zD+<(;f3gYMtb7Ea(qaWv%#=63_6IT7rQDX@_3FgwkV@h{XN?x!sberQYaW-@oN{Ne zQ`0XXx00unn>_u8u+s${AIhlxo_FafFQ zq!e&!qXA&$c72}N5-IiZYX96#n0YniWpdzSV=mW!+PU!R<4xyu{J5zU0UrDaDPpz^ z_lyyRGDT_FO5i8Rp-s#kvT%y4Au70;j5z6uA1mR+Y-$XYF9@jvJld4*I_1*{yY~C> zgb3EOYMZSfV)D3oFvUpwx1k9ZIBn!F3TA6;j$p{E=n8JIzvkCY&HY&!j{ zlR&Ja_I`HL->)20@+Gk_sy9)syACYI{ew}IrKxK5ujh-PrrQIlg@xR>_>DQV+MtA% zBZ{b+YhfZPvdizw(Fm80`og+s`(%!V=Fu0oevuIl?q?0rwYklaCAw!j|M_TN6jsrK#Jy~(>C-*X%1G8;b zL-)w(bva#1plf?xeOgG8`{h62?Kkd%jK*fPESL-OWgviJZ9YrQtT{XPjX!SqqI90O zt0>ENS19~CU-RP`V|0VPe-UuLRWG7fr)q=x4hOCC1Z&gLI!sN;cZ&da&Ia$W(`U?%59)|bu_ywf4rVAAXUq#a{54)bEQUI9DM`JuXbyehRDNYi~p)Az1As*s`S4ow3n z1EtReoAT1nzxK{4+cam=8TK@@j^H+J#B~)?fu6Nr=af-NtqV1Oe|!|-uFPTa!>4J-bUg2KKZJ+I_-&; z&mRiFkM4Z^Nx@flu<&_)MHqwWIwIdpfz zpd-*P->EQ2{Xk~^b(HGunSvtwI*(720v2%Z??hgsVrrk3z&yWiwYTa%e~wf4mH#(6v{!82Bb>yx(;lHBRpv zf?S>1vEhD+Sg^CJ12toLyl?C4t2ArgaS*(x4u0xrJ+k3-hGln_Rtq}7uwPwnnFIz% z?FS8BhYY|5{P;3|>RY!+(ZkL7-clEt)$-e}LGDByZ_D?v&q7yTVQ;Y0&5hW;4{@M% zfc>S8gz$E2>s`LH-oJa&sR;LVENJ|o!oClnXoGH1@8*92JbKcCrLn!90004mX+uL$ zNkc;*aB^>EX>4Tx0C=2zkv&MmKpe$iTct&+4t5Z6$WWauSQT;9DionYs1;guFuC*# znlvOSE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWDYS_3;J6>}?mh0_0scmXsb<$W zplX(pP9}tGZdC}rB8)zS5Jy~MramW%DR_>rd-(Wz7vovp=l&eMO5S9EPavLUx?vG- z5KnJfI_G`j2rEen@j3CBK^G)`h@*x%k;EdFAVPqQ8p^1^LX1|86ccIMPk8u;9KT2| znOtQsax9<<6_Voz|AXJ%nuW;;Hz}L|x?gPjV+0890?oQ@e;?a+^8^Sy16NwxUu^(0 zpQP8@TJ#9$-v%zO+nT%wTthv3l_Hp_EWT>mu z4RCM>j20<--Q(S%&ffk#)9UXBwor1yATwWX00006VoOIv0RI600RN!9r;`8x010qN zS#tmYE+YT{E+YYWr9XB6000McNlirueSad^gZEa<4bO1wg zWnpw>WFU8GbZ8()Nlj2!fese{00c8hL_t(Y$DNixY!hb~#($rk^Ihc75Nx+q2Gog8 zt;C;9RAkLUhbqi4wd{0+sS~6q2}G(Qfshg@3j<_gAj%)dPQZ8aoG$12`A^ zl32v{#czlBjx@4U+LJ!%hVOfx_j%qw--l8v1Y8Av20AAuCJ2Q>$}~+xgg_vmQmGUo zLR(uKx~^jwhSD@mDW%lq%a=KJ>=+`#?c28jK5Jn81cX!r{5ST$IPgO%m9o#BJI5dC zG+)GG#G+AtfBu|UEXH52UZLqaRxZa^Cr^@DU8VQ@dA>e%ifXlb0(b;mXy9FK1Hyd# zE&!7~Jv|o}A3Z95`)3*fDj}V30t$C`moIf4Q1rMi_3R2~1eV&`s8*|8z$Eb90lW@? zPGAm@18WiZ{Fm=9;=W4bruSEFdYbsJ1C&xJ+;p0fX)<`_3P224ID`=gItc^<3OE7G zHzA4k_xBTv#mMDy3=9mQX&NtIzU1lCr@VOag2vh8p|c4fGBGg$-QC@2ng-C-B#H!Z zd~|e_Y&J_U7zCiNuaEop?|bUwO#Dz>FE6vay!=strfCF&K}3Xi@7_@^m)YCf z!?ta&d?QB@D5Y3iTSG*sR;yI2RkpXc5fRqb*7hy3EX$8VM3|bIqPMsAlP$V_{kjh* zA|#VZY}@9;hY$M-G)-e+VS!90!_LkQiA3VRBzYc)%+AhIsZ`kA-Svq|r4pPzeVX?6 zcE40j)BHbWItv_s{P;0jTU#U&2{M@s@87@Q?*mWXjT<+PYNALu9QL}n<(_-@?)g@W z2zYHhK0fY^ie$4J8W%jQ7)Ge5wGK0UpS2m`Y?N!X`1Boc|?Szr6pX~#c>?c=`^)kjrH|) zT-T*uuk-NXL(k&FE?lE==^spJWN2uJjg1YTz+2gDmQtz2n>TN;ZJR=&fNk42j>GEe zs+ahK*YA%2p~e&An)hs(oSeik3`B&pXU}3721+TFOeX&^DMf_2xj9VJMAvoI+1cq? de$9Kf{0*;|36hRg#;5=Q002ovPDHLkV1i*_RMP+e From bc8ffb09042be9248912b4c3cb7f9f8ab80861e6 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 22:59:54 +0200 Subject: [PATCH 140/322] current location -> better displacement --- src/layers/CurrentLocationLayer.tsx | 2 +- src/stores/MapActionReceiver.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index 9a375f60..c19ece98 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -54,7 +54,7 @@ function addCurrentLocation(map: Map, location: Coordinate) { feature => new Style({ image: new Icon({ - anchor: [0, 0], + displacement: [0, 24], src: 'data:image/svg+xml;utf8,' + svgData, }), }) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 444d759e..eeca446b 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -32,7 +32,7 @@ export default class MapActionReceiver implements ActionReceiver { // the map has not been rendered for the first time yet fitBounds(this.map, action.bbox, isSmallScreen, [window.innerWidth, window.innerHeight]) } else if (action instanceof ZoomMapToPoint) { - // if navigating move to the lower half + // if navigating then move icon (in center) to the lower half if (action.navigationOffset) { const size = this.map.getSize() // [width, height] this.map.getView().padding = [size ? size[1] / 2 : 0, 0, 0, 0] From 93f160821c9a0e8f1620a95bf4c97c35a7c0d2f3 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 23:01:46 +0200 Subject: [PATCH 141/322] format --- src/actions/Actions.ts | 3 +-- src/stores/TurnNavigationStore.ts | 13 ++++++++----- src/turnNavigation/TurnNavigation.tsx | 7 +++---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 47adfb45..59fc5b93 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -35,8 +35,7 @@ export class TurnNavigationSettingsUpdate implements Action { } } -export class TurnNavigationReroutingFailed implements Action { -} +export class TurnNavigationReroutingFailed implements Action {} export class TurnNavigationRerouting implements Action { readonly path: Path diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 57b7cdba..5ddaa4e8 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -6,7 +6,8 @@ import { SetRoutingParametersAtOnce, SetSelectedPath, SetVehicleProfile, - TurnNavigationRerouting, TurnNavigationReroutingFailed, + TurnNavigationRerouting, + TurnNavigationReroutingFailed, TurnNavigationSettingsUpdate, TurnNavigationStop, ZoomMapToPoint, @@ -90,8 +91,8 @@ export default class TurnNavigationStore extends Store this.stop() return { ...state, enabled: false, speed: 0, heading: 0 } } else if (action instanceof TurnNavigationSettingsUpdate) { - return {...state, settings: {...state.settings, ...action.settings}} - } else if(action instanceof TurnNavigationReroutingFailed) { + return { ...state, settings: { ...state.settings, ...action.settings } } + } else if (action instanceof TurnNavigationReroutingFailed) { return { ...state, rerouteInProgress: false, @@ -151,7 +152,7 @@ export default class TurnNavigationStore extends Store if (distanceToRoute > 50) { // TODO use correct customModel - if(state.activeProfile && !state.rerouteInProgress) { + if (state.activeProfile && !state.rerouteInProgress) { const fromPoint: [number, number] = [coordinate.lng, coordinate.lat] const toPoint: [number, number] = [ path.snapped_waypoints.coordinates[1][0], @@ -182,7 +183,9 @@ export default class TurnNavigationStore extends Store Dispatcher.dispatch(new TurnNavigationReroutingFailed()) }) } else { - console.warn("profile=" + state.activeProfile + ", reroute in progress = " + state.rerouteInProgress) + console.warn( + 'profile=' + state.activeProfile + ', reroute in progress = ' + state.rerouteInProgress + ) } return { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index e75b1ec7..6a2141cd 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -5,9 +5,8 @@ import styles from '@/turnNavigation/TurnNavigation.module.css' import EndNavigation from '@/sidebar/times-solid.svg' import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import Dispatcher from '@/stores/Dispatcher' -import {DismissLastError, TurnNavigationStop, ZoomMapToPoint} from '@/actions/Actions' -import Cross from "@/sidebar/times-solid.svg"; -import PlainButton from "@/PlainButton"; +import { DismissLastError, TurnNavigationStop, ZoomMapToPoint } from '@/actions/Actions' +import PlainButton from '@/PlainButton' export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { const path = turnNavigation.activePath @@ -42,7 +41,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
    ) : ( -
    +
    {milliSecondsToText(instruction.remainingTime)} From 9ac8b1e2a50c9c41249000c7fd14412445ae43d3 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 23:13:17 +0200 Subject: [PATCH 142/322] skip rerouting if not yet enabled (initial path already wrong -> delay rerouting) --- src/stores/TurnNavigationStore.ts | 23 +++++++++++++++-------- src/turnNavigation/TurnNavigation.tsx | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 5ddaa4e8..82221436 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -93,21 +93,27 @@ export default class TurnNavigationStore extends Store } else if (action instanceof TurnNavigationSettingsUpdate) { return { ...state, settings: { ...state.settings, ...action.settings } } } else if (action instanceof TurnNavigationReroutingFailed) { + console.log("TurnNavigationReroutingFailed") return { ...state, rerouteInProgress: false, } } else if (action instanceof TurnNavigationRerouting) { const path = action.path - if (!state.enabled) - return { - ...state, - activePath: path, - } // ensure that path and instruction are synced const { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } = getCurrentInstruction(path.instructions, state.coordinate) + + // current location is still not close + if(instructionIndex < 0) { + console.log("instruction after rerouting not found") + return { + ...state, + rerouteInProgress: false, + } + } + const text = path.instructions[instructionIndex].street_name const [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, state.coordinate, [ path.details.average_speed, @@ -118,7 +124,7 @@ export default class TurnNavigationStore extends Store return { ...state, - activePath: action.path, + activePath: path, rerouteInProgress: false, instruction: { index: instructionIndex, distanceToNext, remainingTime, remainingDistance, text }, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, @@ -149,7 +155,8 @@ export default class TurnNavigationStore extends Store const { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } = getCurrentInstruction(path.instructions, coordinate) - if (distanceToRoute > 50) { + // reroute only if already in turn navigation mode + if (state.enabled && distanceToRoute > 50) { // TODO use correct customModel if (state.activeProfile && !state.rerouteInProgress) { @@ -171,8 +178,8 @@ export default class TurnNavigationStore extends Store .then(result => { if (result.paths.length > 0) { console.log('rerouting: {}', result.paths[0]) - getTurnNavigationStore().getSpeechSynthesizer().synthesize(tr('reroute')) Dispatcher.dispatch(new TurnNavigationRerouting(result.paths[0])) + getTurnNavigationStore().getSpeechSynthesizer().synthesize(tr('reroute')) } else { console.log('rerouting found no path: {}', result) Dispatcher.dispatch(new TurnNavigationReroutingFailed()) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 6a2141cd..26fb3d70 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -5,7 +5,7 @@ import styles from '@/turnNavigation/TurnNavigation.module.css' import EndNavigation from '@/sidebar/times-solid.svg' import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import Dispatcher from '@/stores/Dispatcher' -import { DismissLastError, TurnNavigationStop, ZoomMapToPoint } from '@/actions/Actions' +import { TurnNavigationStop, ZoomMapToPoint } from '@/actions/Actions' import PlainButton from '@/PlainButton' export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { From 4aad5a98d3b8848cf5d73cce71e316b30701132e Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 23:28:54 +0200 Subject: [PATCH 143/322] style --- src/App.module.css | 2 +- src/stores/TurnNavigationStore.ts | 6 +- src/turnNavigation/TurnNavigation.module.css | 5 +- src/turnNavigation/TurnNavigation.tsx | 100 +++++++++---------- 4 files changed, 57 insertions(+), 56 deletions(-) diff --git a/src/App.module.css b/src/App.module.css index 837e383a..53953323 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -56,7 +56,7 @@ grid-column: 1 / span 1; grid-row: 1 / span 1; z-index: 5; - max-height: 7.5em; + max-height: 8em; margin: 0.5rem; padding: 0.5rem; diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 82221436..dd1f3560 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -93,7 +93,7 @@ export default class TurnNavigationStore extends Store } else if (action instanceof TurnNavigationSettingsUpdate) { return { ...state, settings: { ...state.settings, ...action.settings } } } else if (action instanceof TurnNavigationReroutingFailed) { - console.log("TurnNavigationReroutingFailed") + console.log('TurnNavigationReroutingFailed') return { ...state, rerouteInProgress: false, @@ -106,8 +106,8 @@ export default class TurnNavigationStore extends Store getCurrentInstruction(path.instructions, state.coordinate) // current location is still not close - if(instructionIndex < 0) { - console.log("instruction after rerouting not found") + if (instructionIndex < 0) { + console.log('instruction after rerouting not found') return { ...state, rerouteInProgress: false, diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index db6c22a5..31a05945 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -16,8 +16,11 @@ height: 3.5rem; } +.turnSign div:first-child { + padding-bottom: 0.7em; +} .turnSign { - padding-left: 0.3rem; + padding-left: 0.4rem; min-width: 25%; flex-direction: column; font-weight: bold; diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 26fb3d70..c665cfe0 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -23,61 +23,59 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto return ( <> -
    -
    -
    -
    {getTurnSign(path.instructions[instruction.index].sign, instruction.index)}
    -
    {metersToText(instruction.distanceToNext, false)}
    -
    -
    -
    -
    setShowTime(!showTime)}> - {showTime ? ( -
    - {arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)} - - - - -
    - ) : ( -
    - {milliSecondsToText(instruction.remainingTime)} - - - - -
    - )} -
    - {metersToText(instruction.remainingDistance, false)} +
    +
    +
    {getTurnSign(path.instructions[instruction.index].sign, instruction.index)}
    +
    {metersToText(instruction.distanceToNext, false)}
    +
    +
    +
    +
    setShowTime(!showTime)}> + {showTime ? ( +
    + {arrivalDate.getHours() + ':' + (min > 9 ? min : '0' + min)} + + + +
    + ) : ( +
    + {milliSecondsToText(instruction.remainingTime)} + + + + +
    + )} +
    + {metersToText(instruction.remainingDistance, false)}
    -
    setShowDebug(!showDebug)}> -
    {currentSpeed} km/h
    - {pd.maxSpeed != null ? ( -
    {Math.round(pd.maxSpeed)}
    - ) : null} - {showDebug ? ( -
    -
    {pd.estimatedAvgSpeed}
    -
    {pd.surface}
    -
    {pd.roadClass}
    -
    - ) : null} -
    - { - Dispatcher.dispatch(new TurnNavigationStop()) - Dispatcher.dispatch(new ZoomMapToPoint(turnNavigation.coordinate, 15, 0, false, 0)) - }} - > - -
    -
    {instruction.text}
    +
    setShowDebug(!showDebug)}> +
    {currentSpeed} km/h
    + {pd.maxSpeed != null ? ( +
    {Math.round(pd.maxSpeed)}
    + ) : null} + {showDebug ? ( +
    +
    {pd.estimatedAvgSpeed}
    +
    {pd.surface}
    +
    {pd.roadClass}
    +
    + ) : null} +
    + { + Dispatcher.dispatch(new TurnNavigationStop()) + Dispatcher.dispatch(new ZoomMapToPoint(turnNavigation.coordinate, 15, 0, false, 0)) + }} + > + +
    +
    {instruction.text}
    From c42e470fcedfc8f6aa7ad3915c91cb8545c7a6b2 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Oct 2022 23:42:28 +0200 Subject: [PATCH 144/322] use heading if 0 --- src/stores/MapActionReceiver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index eeca446b..45e37c06 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -41,7 +41,7 @@ export default class MapActionReceiver implements ActionReceiver { // The heading is in degrees and shows direction into which device is going. // And although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. const rotation = - !action.heading || Number.isNaN(action.heading) + action.heading === undefined || Number.isNaN(action.heading) ? this.map.getView().getRotation() : -toRadians(action.heading) this.map.getView().animate({ From 9a68dce597c6eae1be4c5d89003b80c5e050d086 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 29 Oct 2022 00:28:52 +0200 Subject: [PATCH 145/322] fix heading --- src/actions/Actions.ts | 12 +++++++++--- src/index.tsx | 1 - src/map/ContextMenuContent.tsx | 2 +- src/stores/MapActionReceiver.ts | 2 +- src/stores/RouteStore.ts | 11 +---------- src/stores/TurnNavigationStore.ts | 6 ++++-- 6 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 59fc5b93..a6a5cbb8 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -202,11 +202,17 @@ export class ZoomMapToPoint implements Action { readonly coordinate: Coordinate readonly zoom: number readonly pitch: number - // in degrees - readonly heading?: number + // in degrees, if null then map rotation stays + readonly heading: number | null readonly navigationOffset: boolean - constructor(coordinate: Coordinate, zoom: number, pitch: number, navigationOffset: boolean, heading?: number) { + constructor( + coordinate: Coordinate, + zoom: number, + pitch: number, + navigationOffset: boolean, + heading: number | null + ) { this.coordinate = coordinate this.zoom = zoom this.pitch = pitch diff --git a/src/index.tsx b/src/index.tsx index 1c692157..a3980019 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -31,7 +31,6 @@ import PathDetailsStore from '@/stores/PathDetailsStore' import Dispatcher from '@/stores/Dispatcher' import NavBar from '@/NavBar' import App from '@/App' -import { TurnNavigationSettingsUpdate } from '@/actions/Actions' let speechSynthesizer = new SpeechSynthesizer(navigator.language) console.log(`Source code: https://github.com/graphhopper/graphhopper-maps/tree/${GIT_SHA}`) diff --git a/src/map/ContextMenuContent.tsx b/src/map/ContextMenuContent.tsx index ea33de49..4c4c31d3 100644 --- a/src/map/ContextMenuContent.tsx +++ b/src/map/ContextMenuContent.tsx @@ -112,7 +112,7 @@ export function ContextMenuContent({ className={styles.entry} onClick={() => { onSelect() - Dispatcher.dispatch(new ZoomMapToPoint(coordinate, 8, 0, false)) + Dispatcher.dispatch(new ZoomMapToPoint(coordinate, 8, 0, false, null)) }} > {tr('center_map')} diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 45e37c06..7be5158c 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -41,7 +41,7 @@ export default class MapActionReceiver implements ActionReceiver { // The heading is in degrees and shows direction into which device is going. // And although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. const rotation = - action.heading === undefined || Number.isNaN(action.heading) + action.heading === null || Number.isNaN(action.heading) ? this.map.getView().getRotation() : -toRadians(action.heading) this.map.getView().animate({ diff --git a/src/stores/RouteStore.ts b/src/stores/RouteStore.ts index 8240549e..cb06d0b1 100644 --- a/src/stores/RouteStore.ts +++ b/src/stores/RouteStore.ts @@ -1,15 +1,6 @@ import Store from '@/stores/Store' import { Action } from '@/stores/Dispatcher' -import { - ClearPoints, - ClearRoute, - RemovePoint, - RouteRequestSuccess, - SetPoint, - SetSelectedPath, - TurnNavigationSettingsUpdate, - TurnNavigationStop, -} from '@/actions/Actions' +import { ClearPoints, ClearRoute, RemovePoint, RouteRequestSuccess, SetPoint, SetSelectedPath } from '@/actions/Actions' import QueryStore, { RequestState } from '@/stores/QueryStore' import { Path, RoutingArgs, RoutingResult } from '@/api/graphhopper' diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index dd1f3560..f39fd98f 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -87,6 +87,8 @@ export default class TurnNavigationStore extends Store } reduce(state: TurnNavigationStoreState, action: Action): TurnNavigationStoreState { + // For the navigation we need: + // current location (frequently updated), the active path (updated on reroute) and the profile (required for rerouting) if (action instanceof TurnNavigationStop) { this.stop() return { ...state, enabled: false, speed: 0, heading: 0 } @@ -155,7 +157,7 @@ export default class TurnNavigationStore extends Store const { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } = getCurrentInstruction(path.instructions, coordinate) - // reroute only if already in turn navigation mode + // reroute only if already in turn navigation mode otherwise UI is not ready if (state.enabled && distanceToRoute > 50) { // TODO use correct customModel @@ -190,7 +192,7 @@ export default class TurnNavigationStore extends Store Dispatcher.dispatch(new TurnNavigationReroutingFailed()) }) } else { - console.warn( + console.error( 'profile=' + state.activeProfile + ', reroute in progress = ' + state.rerouteInProgress ) } From 1d87ecb425b75d979641dbdc73c45a0809be83f1 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 29 Oct 2022 11:19:36 +0200 Subject: [PATCH 146/322] add test for TurnNavigationStore and nextWaypointIndex --- src/SpeechSynthesizer.ts | 15 +- src/index.tsx | 6 +- src/stores/TurnNavigationStore.ts | 47 ++-- src/turnNavigation/GeoMethods.ts | 28 +- test/stores/TurnNavigationStore.test.ts | 34 +++ test/turnNavigation/GeoMethods.test.ts | 30 +++ .../turnNavigation/response-hoyerswerda2.json | 243 ++++++++++++++++++ 7 files changed, 371 insertions(+), 32 deletions(-) create mode 100644 test/stores/TurnNavigationStore.test.ts create mode 100644 test/turnNavigation/response-hoyerswerda2.json diff --git a/src/SpeechSynthesizer.ts b/src/SpeechSynthesizer.ts index 419d7da9..981ead64 100644 --- a/src/SpeechSynthesizer.ts +++ b/src/SpeechSynthesizer.ts @@ -1,20 +1,23 @@ -export class SpeechSynthesizer { - private locale: string +export interface SpeechSynthesizer { + synthesize(text: string): void +} + +export class SpeechSynthesizerImpl implements SpeechSynthesizer { + private readonly locale: string private readonly speechSynthesisAPIAvailable: boolean private audioCtx: AudioContext private source?: AudioBufferSourceNode constructor(locale: string) { this.locale = locale - // this is a bit funny the comma is required and prettier moves it to the next line!? + // this is a bit funny: the comma is required and prettier moves it to the next line this.speechSynthesisAPIAvailable = 'speechSynthesis' in window ;(window as any).AudioContext = (window as any).AudioContext || (window as any).webkitAudioContext this.audioCtx = new AudioContext() } - synthesize(text: string, offline = true) { - if (!this.speechSynthesisAPIAvailable) offline = false - if (offline) { + synthesize(text: string) { + if (this.speechSynthesisAPIAvailable) { let utterance = new SpeechSynthesisUtterance(text) utterance.lang = this.locale if (speechSynthesis.pending) speechSynthesis.cancel() diff --git a/src/index.tsx b/src/index.tsx index a3980019..b14a8ace 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -5,8 +5,8 @@ import * as config from 'config' import MapActionReceiver from '@/stores/MapActionReceiver' import { createMap, getMap, setMap } from '@/map/map' import MapFeatureStore from '@/stores/MapFeatureStore' -import SettingsStore, { Settings } from '@/stores/SettingsStore' -import { SpeechSynthesizer } from '@/SpeechSynthesizer' +import SettingsStore from '@/stores/SettingsStore' +import { SpeechSynthesizerImpl } from '@/SpeechSynthesizer' import { setTranslation } from '@/translation/Translation' import { getApi, setApi } from '@/api/Api' import QueryStore from '@/stores/QueryStore' @@ -32,7 +32,7 @@ import Dispatcher from '@/stores/Dispatcher' import NavBar from '@/NavBar' import App from '@/App' -let speechSynthesizer = new SpeechSynthesizer(navigator.language) +const speechSynthesizer = new SpeechSynthesizerImpl(navigator.language) console.log(`Source code: https://github.com/graphhopper/graphhopper-maps/tree/${GIT_SHA}`) const url = new URL(window.location.href) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index f39fd98f..3f2a7ebf 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -1,4 +1,4 @@ -import { Coordinate, QueryStoreState } from '@/stores/QueryStore' +import { Coordinate } from '@/stores/QueryStore' import Store from '@/stores/Store' import { ErrorAction, @@ -14,14 +14,18 @@ import { } from '@/actions/Actions' import Dispatcher, { Action } from '@/stores/Dispatcher' import NoSleep from 'nosleep.js' -import { SpeechSynthesizer } from '@/SpeechSynthesizer' import Api, { ApiImpl } from '@/api/Api' -import { calcOrientation, getCurrentDetails, getCurrentInstruction, toNorthBased } from '@/turnNavigation/GeoMethods' +import { + calcOrientation, + getCurrentDetails, + getCurrentInstruction, + toDegrees, + toNorthBased, +} from '@/turnNavigation/GeoMethods' import * as config from 'config' -import { toDegrees } from 'ol/math' -import { Instruction, Path, RoutingArgs, RoutingProfile } from '@/api/graphhopper' -import { getTurnNavigationStore } from '@/stores/Stores' +import { Instruction, Path, RoutingArgs } from '@/api/graphhopper' import { tr } from '@/translation/Translation' +import { SpeechSynthesizer } from '@/SpeechSynthesizer' export interface TurnNavigationStoreState { enabled: boolean @@ -104,8 +108,10 @@ export default class TurnNavigationStore extends Store const path = action.path // ensure that path and instruction are synced - const { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } = - getCurrentInstruction(path.instructions, state.coordinate) + const { instructionIndex, distanceToNext, remainingTime, remainingDistance } = getCurrentInstruction( + path.instructions, + state.coordinate + ) // current location is still not close if (instructionIndex < 0) { @@ -154,18 +160,25 @@ export default class TurnNavigationStore extends Store } else if (action instanceof LocationUpdate) { const coordinate = action.coordinate const path = state.activePath - const { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } = - getCurrentInstruction(path.instructions, coordinate) + const { + instructionIndex, + timeToNext, + distanceToNext, + distanceToRoute, + remainingTime, + remainingDistance, + nextWaypointIndex, + } = getCurrentInstruction(path.instructions, coordinate) // reroute only if already in turn navigation mode otherwise UI is not ready - if (state.enabled && distanceToRoute > 50) { + if (state.enabled && distanceToRoute > 50 && nextWaypointIndex > 0) { // TODO use correct customModel if (state.activeProfile && !state.rerouteInProgress) { const fromPoint: [number, number] = [coordinate.lng, coordinate.lat] const toPoint: [number, number] = [ - path.snapped_waypoints.coordinates[1][0], - path.snapped_waypoints.coordinates[1][1], + path.snapped_waypoints.coordinates[nextWaypointIndex][0], + path.snapped_waypoints.coordinates[nextWaypointIndex][1], ] const args: RoutingArgs = { points: [fromPoint, toPoint], @@ -181,7 +194,7 @@ export default class TurnNavigationStore extends Store if (result.paths.length > 0) { console.log('rerouting: {}', result.paths[0]) Dispatcher.dispatch(new TurnNavigationRerouting(result.paths[0])) - getTurnNavigationStore().getSpeechSynthesizer().synthesize(tr('reroute')) + this.speechSynthesizer.synthesize(tr('reroute')) } else { console.log('rerouting found no path: {}', result) Dispatcher.dispatch(new TurnNavigationReroutingFailed()) @@ -223,7 +236,7 @@ export default class TurnNavigationStore extends Store (instructionState.distanceToNext > lastAnnounceDistance || instructionIndex != instructionState.index) ) { - getTurnNavigationStore().getSpeechSynthesizer().synthesize(nextInstruction.text) + this.speechSynthesizer.synthesize(nextInstruction.text) } const firstAnnounceDistance = 1150 @@ -238,9 +251,7 @@ export default class TurnNavigationStore extends Store distanceToNext > 800 ? tr('in_km_singular') : tr('in_m', ['' + Math.round(distanceToNext / 100) * 100]) - getTurnNavigationStore() - .getSpeechSynthesizer() - .synthesize(inString + ' ' + nextInstruction.text) + this.speechSynthesizer.synthesize(inString + ' ' + nextInstruction.text) } } diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 31beb15d..93fef214 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -52,12 +52,17 @@ export function getCurrentInstruction( distanceToRoute: number remainingTime: number remainingDistance: number + nextWaypointIndex: number } { let instructionIndex = -1 let distanceToRoute = Number.MAX_VALUE let distanceToNext = 10.0 + let nextWaypointIndex = 0 + let waypointIndex = 0 for (let instrIdx = 0; instrIdx < instructions.length; instrIdx++) { + const sign = instructions[instrIdx].sign + if (sign === 4 || sign === 5) waypointIndex++ const points: number[][] = instructions[instrIdx].points for (let pIdx = 0; pIdx < points.length; pIdx++) { @@ -79,6 +84,7 @@ export function getCurrentInstruction( instructionIndex = instrIdx + 1 < instructions.length ? instrIdx + 1 : instrIdx const last: number[] = points[points.length - 1] distanceToNext = Math.round(distCalc(last[1], last[0], snapped.lat, snapped.lng)) + nextWaypointIndex = waypointIndex + 1 } } } @@ -102,7 +108,15 @@ export function getCurrentInstruction( } } - return { instructionIndex, timeToNext, distanceToNext, distanceToRoute, remainingTime, remainingDistance } + return { + instructionIndex, + timeToNext, + distanceToNext, + distanceToRoute, + remainingTime, + remainingDistance, + nextWaypointIndex, + } } export function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: number): number { @@ -114,10 +128,6 @@ export function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: return 6371000 * 2 * Math.asin(Math.sqrt(normedDist)) } -function toRadians(deg: number): number { - return (deg * Math.PI) / 180.0 -} - function validEdgeDistance( r_lat_deg: number, r_lon_deg: number, @@ -207,3 +217,11 @@ export function toNorthBased(orientation: number): number { // modulo with decimals seems to work too!? orientation % (2 * Math.PI) return orientation > 2 * Math.PI ? orientation - 2 * Math.PI : orientation } + +export function toDegrees(rad: number): number { + return (rad * 180.0) / Math.PI +} + +export function toRadians(deg: number): number { + return (deg * Math.PI) / 180.0 +} diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts new file mode 100644 index 00000000..af4fa1e0 --- /dev/null +++ b/test/stores/TurnNavigationStore.test.ts @@ -0,0 +1,34 @@ +import Dispatcher from '@/stores/Dispatcher' +import { SetPoint, SetSelectedPath } from '@/actions/Actions' +import RouteStore from '@/stores/RouteStore' +import QueryStore from '@/stores/QueryStore' +import TurnNavigationStore from '@/stores/TurnNavigationStore' +import { SpeechSynthesizer } from '@/SpeechSynthesizer' +import DummyApi from '../DummyApi' +import Api from '@/api/Api' +import { Path } from '@/api/graphhopper' + +describe('TurnNavigationStore', () => { + afterEach(() => { + Dispatcher.clear() + }) + + describe('set path', () => { + it('should set path', () => { + const store = createStore() + const path = { distance: 1000 } as Path + Dispatcher.dispatch(new SetSelectedPath(path)) + expect(store.state.activePath).toEqual(path) + }) + }) + + function createStore() { + const store = new TurnNavigationStore(new DummyApi(), new DummySpeech(), true) + Dispatcher.register(store) + return store + } + + class DummySpeech implements SpeechSynthesizer { + synthesize(text: string, offline = true) {} + } +}) diff --git a/test/turnNavigation/GeoMethods.test.ts b/test/turnNavigation/GeoMethods.test.ts index 41e62be0..a6eea397 100644 --- a/test/turnNavigation/GeoMethods.test.ts +++ b/test/turnNavigation/GeoMethods.test.ts @@ -3,6 +3,7 @@ import Dispatcher from '../../src/stores/Dispatcher' import { ApiImpl } from '../../src/api/Api' let responseHoyerswerda1 = require('./response-hoyerswerda1.json') +let responseHoyerswerda2 = require('./response-hoyerswerda2.json') afterEach(() => Dispatcher.clear()) @@ -36,6 +37,35 @@ describe('calculate instruction', () => { expect(Math.round(remainingDistance)).toEqual(578) }) + it('nextWaypointIndex should be correct', () => { + let path = ApiImpl.decodeResult(responseHoyerswerda2, true)[0] + { + const { nextWaypointIndex } = getCurrentInstruction(path.instructions, { + lat: 51.434672, + lng: 14.267248, + }) + expect(nextWaypointIndex).toEqual(1) + } + + // points that could return both indices return the first + // TODO include heading to differentiate! + { + const { nextWaypointIndex } = getCurrentInstruction(path.instructions, { + lat: 51.434491, + lng: 14.268535, + }) + expect(nextWaypointIndex).toEqual(1) + } + + { + const { nextWaypointIndex } = getCurrentInstruction(path.instructions, { + lat: 51.433247, + lng: 14.267763, + }) + expect(nextWaypointIndex).toEqual(2) + } + }) + it('calc angle', () => { // downwards+west expect(Math.round(toDegrees(calcOrientation(51.439146, 14.245258, 51.438908, 14.245931)))).toEqual(-30) diff --git a/test/turnNavigation/response-hoyerswerda2.json b/test/turnNavigation/response-hoyerswerda2.json new file mode 100644 index 00000000..3a82d070 --- /dev/null +++ b/test/turnNavigation/response-hoyerswerda2.json @@ -0,0 +1,243 @@ +{ + "hints": { + "visited_nodes.sum": 38, + "visited_nodes.average": 19.0 + }, + "info": { + "copyrights": [ + "GraphHopper", + "OpenStreetMap contributors" + ], + "took": 0 + }, + "paths": [ + { + "distance": 624.542, + "weight": 114.70033, + "time": 105334, + "transfers": 0, + "points_encoded": true, + "bbox": [ + 14.266506, + 51.432538, + 14.269298, + 51.43549 + ], + "points": "w~|xHslavAucVzFgFNeAcEc@k@aCmAj@`ClAdAbEb@p@o@iCPIk@RCo@`@@qAr@XgBbDrByF", + "instructions": [ + { + "distance": 162.02, + "heading": 150.1, + "sign": 0, + "interval": [ + 0, + 1 + ], + "text": "Continue onto Bautzener Allee", + "time": 20832, + "street_name": "Bautzener Allee" + }, + { + "distance": 129.808, + "sign": -2, + "interval": [ + 1, + 3 + ], + "text": "Turn left onto Franz-Liszt-Straße", + "time": 29207, + "street_name": "Franz-Liszt-Straße" + }, + { + "distance": 0.0, + "sign": 5, + "last_heading": 60.412669918594, + "interval": [ + 3, + 3 + ], + "text": "Waypoint 1", + "time": 0, + "street_name": "" + }, + { + "distance": 129.808, + "heading": 240.41, + "sign": -98, + "interval": [ + 3, + 5 + ], + "text": "Make a U-turn onto Franz-Liszt-Straße", + "time": 29207, + "street_name": "Franz-Liszt-Straße" + }, + { + "distance": 202.906, + "sign": -2, + "interval": [ + 5, + 11 + ], + "text": "Turn left onto Bautzener Allee", + "time": 26088, + "street_name": "Bautzener Allee" + }, + { + "distance": 0.0, + "sign": 4, + "last_heading": 202.52339184489207, + "interval": [ + 11, + 11 + ], + "text": "Arrive at destination", + "time": 0, + "street_name": "" + } + ], + "legs": [], + "details": { + "country": [ + [ + 0, + 3, + "DEU" + ], + [ + 3, + 11, + "DEU" + ] + ], + "surface": [ + [ + 0, + 2, + "missing" + ], + [ + 2, + 3, + "asphalt" + ], + [ + 3, + 4, + "asphalt" + ], + [ + 4, + 11, + "missing" + ] + ], + "road_environment": [ + [ + 0, + 3, + "road" + ], + [ + 3, + 11, + "road" + ] + ], + "road_class": [ + [ + 0, + 1, + "tertiary" + ], + [ + 1, + 3, + "residential" + ], + [ + 3, + 5, + "residential" + ], + [ + 5, + 11, + "tertiary" + ] + ], + "max_speed": [ + [ + 0, + 1, + null + ], + [ + 1, + 3, + 30.0 + ], + [ + 3, + 5, + 30.0 + ], + [ + 5, + 11, + null + ] + ], + "average_speed": [ + [ + 0, + 1, + 28.0 + ], + [ + 1, + 3, + 16.0 + ], + [ + 3, + 5, + 16.0 + ], + [ + 5, + 11, + 28.0 + ] + ], + "toll": [ + [ + 0, + 3, + "missing" + ], + [ + 3, + 11, + "missing" + ] + ], + "track_type": [ + [ + 0, + 3, + "missing" + ], + [ + 3, + 11, + "missing" + ] + ] + }, + "ascend": 4.897502899169922, + "descend": 1.6450042724609375, + "snapped_waypoints": "w~|xHslavAucVhCmPaBbMvKgP" + } + ] +} \ No newline at end of file From d27aac516052735e5b49c9630826f52b255b1b03 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 30 Oct 2022 12:10:59 +0100 Subject: [PATCH 147/322] more tests --- src/layers/UsePathsLayer.tsx | 2 +- src/stores/TurnNavigationStore.ts | 141 +++++++++-------- src/turnNavigation/GeoMethods.ts | 4 +- src/turnNavigation/TurnNavigation.tsx | 5 +- test/stores/TurnNavigationStore.test.ts | 126 +++++++++++++-- test/turnNavigation/GeoMethods.test.ts | 13 +- .../turnNavigation/response-hoyerswerda1.json | 1 + .../turnNavigation/response-hoyerswerda2.json | 1 + .../turnNavigation/response-hoyerswerda3.json | 149 ++++++++++++++++++ 9 files changed, 349 insertions(+), 93 deletions(-) create mode 100644 test/turnNavigation/response-hoyerswerda3.json diff --git a/src/layers/UsePathsLayer.tsx b/src/layers/UsePathsLayer.tsx index 65950318..c7a6f97d 100644 --- a/src/layers/UsePathsLayer.tsx +++ b/src/layers/UsePathsLayer.tsx @@ -21,7 +21,7 @@ const selectedPathLayerKey = 'selectedPathLayer' export default function usePathsLayer(map: Map, route: RouteStoreState, turnNavigation: TurnNavigationStoreState) { useEffect(() => { removeCurrentPathLayers(map) - if (turnNavigation.enabled) { + if (turnNavigation.enabled && turnNavigation.activePath != null) { addSelectedPathsLayer(map, turnNavigation.activePath) } else { addUnselectedPathsLayer( diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 3f2a7ebf..7efdbb96 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -28,11 +28,13 @@ import { tr } from '@/translation/Translation' import { SpeechSynthesizer } from '@/SpeechSynthesizer' export interface TurnNavigationStoreState { + // TODO replace "enabled" with a composite state depending on activePath, coordinate and instruction enabled: boolean coordinate: Coordinate speed: number heading: number - activePath: Path + initialPath: Path | null + activePath: Path | null activeProfile: string rerouteInProgress: boolean settings: TNSettingsState @@ -75,7 +77,8 @@ export default class TurnNavigationStore extends Store coordinate: { lat: 0, lng: 0 }, speed: 0, heading: 0, - activePath: {} as Path, + initialPath: null, + activePath: null, rerouteInProgress: false, activeProfile: '', settings: { acceptedRisk: false, fakeGPS: fakeGPS, soundEnabled: !fakeGPS } as TNSettingsState, @@ -93,6 +96,7 @@ export default class TurnNavigationStore extends Store reduce(state: TurnNavigationStoreState, action: Action): TurnNavigationStoreState { // For the navigation we need: // current location (frequently updated), the active path (updated on reroute) and the profile (required for rerouting) + // and so we collect this from different actions if (action instanceof TurnNavigationStop) { this.stop() return { ...state, enabled: false, speed: 0, heading: 0 } @@ -104,39 +108,6 @@ export default class TurnNavigationStore extends Store ...state, rerouteInProgress: false, } - } else if (action instanceof TurnNavigationRerouting) { - const path = action.path - - // ensure that path and instruction are synced - const { instructionIndex, distanceToNext, remainingTime, remainingDistance } = getCurrentInstruction( - path.instructions, - state.coordinate - ) - - // current location is still not close - if (instructionIndex < 0) { - console.log('instruction after rerouting not found') - return { - ...state, - rerouteInProgress: false, - } - } - - const text = path.instructions[instructionIndex].street_name - const [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, state.coordinate, [ - path.details.average_speed, - path.details.max_speed, - path.details.surface, - path.details.road_class, - ]) - - return { - ...state, - activePath: path, - rerouteInProgress: false, - instruction: { index: instructionIndex, distanceToNext, remainingTime, remainingDistance, text }, - pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, - } } else if (action instanceof SetRoutingParametersAtOnce) { console.log('SetRoutingParametersAtOnce, profile: ' + action.routingProfile.name) return { @@ -155,30 +126,29 @@ export default class TurnNavigationStore extends Store return { ...state, + initialPath: action.path, activePath: action.path, } } else if (action instanceof LocationUpdate) { + if (state.initialPath == null) throw new Error('initialPath must not be null') + if (state.activePath == null) throw new Error('activePath must not be null') const coordinate = action.coordinate - const path = state.activePath - const { - instructionIndex, - timeToNext, - distanceToNext, - distanceToRoute, - remainingTime, - remainingDistance, - nextWaypointIndex, - } = getCurrentInstruction(path.instructions, coordinate) + let path = state.activePath + let instr = getCurrentInstruction(path.instructions, coordinate) - // reroute only if already in turn navigation mode otherwise UI is not ready - if (state.enabled && distanceToRoute > 50 && nextWaypointIndex > 0) { - // TODO use correct customModel + // if (instr.index < 0 || instr.distanceToRoute > 50) { + // path = state.initialPath + // instr = getCurrentInstruction(path.instructions, coordinate) + // } + // reroute only if already in turn navigation mode otherwise UI is not ready + if (state.enabled && instr.distanceToRoute > 50) { + let queriedAPI = false if (state.activeProfile && !state.rerouteInProgress) { const fromPoint: [number, number] = [coordinate.lng, coordinate.lat] const toPoint: [number, number] = [ - path.snapped_waypoints.coordinates[nextWaypointIndex][0], - path.snapped_waypoints.coordinates[nextWaypointIndex][1], + path.snapped_waypoints.coordinates[instr.nextWaypointIndex][0], + path.snapped_waypoints.coordinates[instr.nextWaypointIndex][1], ] const args: RoutingArgs = { points: [fromPoint, toPoint], @@ -186,13 +156,14 @@ export default class TurnNavigationStore extends Store heading: action.heading, zoom: false, profile: state.activeProfile, + // TODO use correct customModel customModel: null, } this.api .route(args) .then(result => { if (result.paths.length > 0) { - console.log('rerouting: {}', result.paths[0]) + console.log('rerouting -> ', result.paths[0].distance) Dispatcher.dispatch(new TurnNavigationRerouting(result.paths[0])) this.speechSynthesizer.synthesize(tr('reroute')) } else { @@ -204,25 +175,24 @@ export default class TurnNavigationStore extends Store console.warn('error for reroute request: ', error) Dispatcher.dispatch(new TurnNavigationReroutingFailed()) }) + queriedAPI = true } else { - console.error( - 'profile=' + state.activeProfile + ', reroute in progress = ' + state.rerouteInProgress - ) + console.log('profile=' + state.activeProfile + ', reroute in progress = ' + state.rerouteInProgress) } return { ...state, - rerouteInProgress: true, + rerouteInProgress: queriedAPI, heading: action.heading, speed: action.speed, coordinate: coordinate, } } - if (instructionIndex < 0) throw new Error('Instruction should be valid if distanceToRoute is small') + if (instr.index < 0) throw new Error('Instruction should be valid if distanceToRoute is small') const instructionState = state.instruction - const nextInstruction: Instruction = path.instructions[instructionIndex] + const nextInstruction: Instruction = path.instructions[instr.index] const text = nextInstruction.street_name if (state.settings.soundEnabled) { @@ -232,9 +202,8 @@ export default class TurnNavigationStore extends Store let lastAnnounceDistance = 10 + 2 * Math.round(averageSpeed / 5) * 5 if ( - distanceToNext <= lastAnnounceDistance && - (instructionState.distanceToNext > lastAnnounceDistance || - instructionIndex != instructionState.index) + instr.distanceToNext <= lastAnnounceDistance && + (instructionState.distanceToNext > lastAnnounceDistance || instr.index != instructionState.index) ) { this.speechSynthesizer.synthesize(nextInstruction.text) } @@ -242,15 +211,14 @@ export default class TurnNavigationStore extends Store const firstAnnounceDistance = 1150 if ( averageSpeed > 15 && // two announcements only if faster speed - distanceToNext > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) - distanceToNext <= firstAnnounceDistance && - (instructionState.distanceToNext > firstAnnounceDistance || - instructionIndex != instructionState.index) + instr.distanceToNext > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) + instr.distanceToNext <= firstAnnounceDistance && + (instructionState.distanceToNext > firstAnnounceDistance || instr.index != instructionState.index) ) { let inString = - distanceToNext > 800 + instr.distanceToNext > 800 ? tr('in_km_singular') - : tr('in_m', ['' + Math.round(distanceToNext / 100) * 100]) + : tr('in_m', ['' + Math.round(instr.distanceToNext / 100) * 100]) this.speechSynthesizer.synthesize(inString + ' ' + nextInstruction.text) } } @@ -268,7 +236,46 @@ export default class TurnNavigationStore extends Store heading: action.heading, speed: action.speed, coordinate: coordinate, - instruction: { index: instructionIndex, distanceToNext, remainingTime, remainingDistance, text }, + instruction: { + index: instr.index, + distanceToNext: instr.distanceToNext, + remainingTime: instr.remainingTime, + remainingDistance: instr.remainingDistance, + text, + }, + pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, + } + } else if (action instanceof TurnNavigationRerouting) { + const path = action.path + + // ensure that path and instruction are synced + const { index, distanceToNext, remainingTime, remainingDistance } = getCurrentInstruction( + path.instructions, + state.coordinate + ) + + // current location is still not close + if (index < 0) { + console.log('instruction after rerouting not found') + return { + ...state, + rerouteInProgress: false, + } + } + + const text = path.instructions[index].street_name + const [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, state.coordinate, [ + path.details.average_speed, + path.details.max_speed, + path.details.surface, + path.details.road_class, + ]) + + return { + ...state, + activePath: path, + rerouteInProgress: false, + instruction: { index: index, distanceToNext, remainingTime, remainingDistance, text }, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, } } diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 93fef214..53469b0b 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -46,7 +46,7 @@ export function getCurrentInstruction( instructions: Instruction[], location: Coordinate ): { - instructionIndex: number + index: number timeToNext: number distanceToNext: number distanceToRoute: number @@ -109,7 +109,7 @@ export function getCurrentInstruction( } return { - instructionIndex, + index: instructionIndex, timeToNext, distanceToNext, distanceToRoute, diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index c665cfe0..2265e099 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -7,9 +7,12 @@ import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import Dispatcher from '@/stores/Dispatcher' import { TurnNavigationStop, ZoomMapToPoint } from '@/actions/Actions' import PlainButton from '@/PlainButton' +import { Path } from '@/api/graphhopper' export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { - const path = turnNavigation.activePath + if (turnNavigation.activePath == null) new Error('activePath cannot be null if TurnNavigation is enabled') + // ugly workaround to make typescript happy + const path = turnNavigation.activePath == null ? ({} as Path) : turnNavigation.activePath const instruction = turnNavigation.instruction const pd = turnNavigation.pathDetails diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index af4fa1e0..d5628155 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -1,34 +1,132 @@ import Dispatcher from '@/stores/Dispatcher' -import { SetPoint, SetSelectedPath } from '@/actions/Actions' -import RouteStore from '@/stores/RouteStore' -import QueryStore from '@/stores/QueryStore' +import { LocationUpdate, SetSelectedPath, SetVehicleProfile } from '@/actions/Actions' import TurnNavigationStore from '@/stores/TurnNavigationStore' import { SpeechSynthesizer } from '@/SpeechSynthesizer' -import DummyApi from '../DummyApi' -import Api from '@/api/Api' -import { Path } from '@/api/graphhopper' +import { ApiInfo, GeocodingResult, Path, RawResult, RoutingArgs, RoutingResult } from '@/api/graphhopper' +import Api, { ApiImpl } from '@/api/Api' +import { setTranslation } from '@/translation/Translation' + +let routeWithVia = toRoutingResult(require('../turnNavigation/response-hoyerswerda2.json')) +let reroute = toRoutingResult(require('../turnNavigation/response-hoyerswerda3.json')) + +function toRoutingResult(rawResult: RawResult): RoutingResult { + return { + ...rawResult, + paths: ApiImpl.decodeResult(rawResult, true), + } +} describe('TurnNavigationStore', () => { + beforeAll(() => { + setTranslation('en') + }) + afterEach(() => { Dispatcher.clear() }) - describe('set path', () => { + describe('path state handling', () => { it('should set path', () => { - const store = createStore() - const path = { distance: 1000 } as Path - Dispatcher.dispatch(new SetSelectedPath(path)) - expect(store.state.activePath).toEqual(path) + const store = createStore(reroute) + Dispatcher.dispatch(new SetSelectedPath(reroute.paths[0])) + expect(store.state.initialPath).toEqual(reroute.paths[0]) + }) + + it('should reroute', async () => { + const store = createStore(reroute) + Dispatcher.dispatch(new SetSelectedPath(routeWithVia.paths[0])) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266959, lat: 51.435051 }, 10, 120)) + expect(store.state.speed).toEqual(10) + expect(store.state.activePath).toEqual(routeWithVia.paths[0]) + expect(store.state.instruction.index).toEqual(1) + + // no rerouting without profile + Dispatcher.dispatch(new LocationUpdate({ lng: 14.268302, lat: 51.435232 }, 12, 120)) + expect(store.state.speed).toEqual(12) + expect(store.state.rerouteInProgress).toBeFalsy() + + Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.268302, lat: 51.435232 }, 12, 120)) + expect(store.state.speed).toEqual(12) + expect(store.state.rerouteInProgress).toBeTruthy() + await flushPromises() + expect(store.state.rerouteInProgress).toBeFalsy() + + expect(store.state.activePath).toEqual(reroute.paths[0]) + expect(store.state.instruction.index).toEqual(1) + }) + + it('should reroute with via point', async () => { + const store = createStore(reroute) + Dispatcher.dispatch(new SetSelectedPath(routeWithVia.paths[0])) + Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266959, lat: 51.435051 }, 10, 120)) + expect(store.state.speed).toEqual(10) + expect(store.state.instruction.index).toEqual(1) + expect(store.state.activePath).toEqual(routeWithVia.paths[0]) + + // TODO NOW + // close to via point it should force rerouting to avoid potential interferences with overlapping edges + // Dispatcher.dispatch(new LocationUpdate({ lng: 14.269289, lat: 51.434764 }, 12, 70)) + // expect(store.state.speed).toEqual(12) + // + // expect(store.state.rerouteInProgress).toBeTruthy() + // await flushPromises() + // expect(store.state.rerouteInProgress).toBeFalsy() + // + // expect(store.state.activePath).toEqual(reroute.paths[0]) + // expect(store.state.instruction.index).toEqual(1) }) }) - function createStore() { - const store = new TurnNavigationStore(new DummyApi(), new DummySpeech(), true) + function createStore(resultOnReroute: RoutingResult) { + const store = new TurnNavigationStore(new LocalApi(resultOnReroute), new DummySpeech(), true) Dispatcher.register(store) return store } class DummySpeech implements SpeechSynthesizer { - synthesize(text: string, offline = true) {} + synthesize(text: string, offline = true) { + // TODO we could collect the text to ensure spoken words + } + } + + class LocalApi implements Api { + readonly resultOnReroute + + constructor(resultOnReroute: RoutingResult) { + this.resultOnReroute = resultOnReroute + } + + route(args: RoutingArgs): Promise { + return Promise.resolve(this.resultOnReroute) + } + + geocode(query: string): Promise { + return Promise.resolve({ + took: 0, + hits: [], + }) + } + + info(): Promise { + return Promise.resolve({ + bbox: [0, 0, 0, 0], + elevation: false, + version: '', + import_date: '', + profiles: [], + encoded_values: [], + }) + } + + infoWithDispatch(): void {} + + routeWithDispatch(args: RoutingArgs): void {} } }) + +async function flushPromises() { + const flush = () => new Promise(setImmediate) + await flush() +} diff --git a/test/turnNavigation/GeoMethods.test.ts b/test/turnNavigation/GeoMethods.test.ts index a6eea397..9cd78365 100644 --- a/test/turnNavigation/GeoMethods.test.ts +++ b/test/turnNavigation/GeoMethods.test.ts @@ -11,19 +11,16 @@ describe('calculate instruction', () => { // http://localhost:3000/?point=51.437233%2C14.246489&point=51.435514%2C14.239923&profile=car it('second instruction should not be "right turn"', () => { let path = ApiImpl.decodeResult(responseHoyerswerda1, true)[0] - const { instructionIndex, distanceToNext, remainingTime, remainingDistance } = getCurrentInstruction( - path.instructions, - { - lat: 51.435029, - lng: 14.243259, - } - ) + const { index, distanceToNext, remainingTime, remainingDistance } = getCurrentInstruction(path.instructions, { + lat: 51.435029, + lng: 14.243259, + }) expect(distanceToNext).toEqual(236) expect(remainingDistance).toEqual(236) expect(Math.round(remainingTime / 1000)).toEqual(30) - expect(path.instructions[instructionIndex].text).toEqual('Ziel erreicht') + expect(path.instructions[index].text).toEqual('Ziel erreicht') }) it('remaining time should be correct', () => { diff --git a/test/turnNavigation/response-hoyerswerda1.json b/test/turnNavigation/response-hoyerswerda1.json index feb0c9c4..b6037c7d 100644 --- a/test/turnNavigation/response-hoyerswerda1.json +++ b/test/turnNavigation/response-hoyerswerda1.json @@ -1,4 +1,5 @@ { + "orig_url": "https://graphhopper.com/maps/?point=51.43727%2C14.24642&point=51.43546%2C14.23991&profile=car", "hints": { "visited_nodes.sum": 32, "visited_nodes.average": 32 diff --git a/test/turnNavigation/response-hoyerswerda2.json b/test/turnNavigation/response-hoyerswerda2.json index 3a82d070..ae8d7a4f 100644 --- a/test/turnNavigation/response-hoyerswerda2.json +++ b/test/turnNavigation/response-hoyerswerda2.json @@ -1,4 +1,5 @@ { + "orig_url": "https://graphhopper.com/maps/?point=51.43548%2C14.2665_51.43548%2C14.26650&point=51.43479%2C14.26929&point=51.43253%2C14.26725&profile=car", "hints": { "visited_nodes.sum": 38, "visited_nodes.average": 19.0 diff --git a/test/turnNavigation/response-hoyerswerda3.json b/test/turnNavigation/response-hoyerswerda3.json new file mode 100644 index 00000000..e92f873b --- /dev/null +++ b/test/turnNavigation/response-hoyerswerda3.json @@ -0,0 +1,149 @@ +{ + "orig_url": "https://graphhopper.com/maps/?point=51.434764%2C14.269289&point=51.43253%2C14.26725&profile=car", + "hints": { + "visited_nodes.sum": 130, + "visited_nodes.average": 130.0 + }, + "info": { + "copyrights": [ + "GraphHopper", + "OpenStreetMap contributors" + ], + "took": 3 + }, + "paths": [ + { + "distance": 331.123, + "weight": 359.820537, + "time": 354855, + "transfers": 0, + "points_encoded": true, + "bbox": [ + 14.267247, + 51.432531, + 14.269267, + 51.434789 + ], + "points": "kz|xH{}avAwfVh@zBlAdAbEb@p@o@iCPIk@RCo@`@@qAr@XgBbDtByF", + "instructions": [ + { + "distance": 127.356, + "heading": 240.41, + "sign": -98, + "interval": [ + 0, + 2 + ], + "text": "Make a U-turn onto Franz-Liszt-Straße", + "time": 28656, + "street_name": "Franz-Liszt-Straße" + }, + { + "distance": 203.766, + "sign": -2, + "interval": [ + 2, + 8 + ], + "text": "Turn left onto Bautzener Allee", + "time": 26199, + "street_name": "Bautzener Allee" + }, + { + "distance": 0.0, + "sign": 4, + "last_heading": 202.52339184489207, + "interval": [ + 8, + 8 + ], + "text": "Arrive at destination", + "time": 0, + "street_name": "" + } + ], + "legs": [], + "details": { + "country": [ + [ + 0, + 8, + "DEU" + ] + ], + "surface": [ + [ + 0, + 1, + "asphalt" + ], + [ + 1, + 8, + "missing" + ] + ], + "road_environment": [ + [ + 0, + 8, + "road" + ] + ], + "road_class": [ + [ + 0, + 2, + "residential" + ], + [ + 2, + 8, + "tertiary" + ] + ], + "max_speed": [ + [ + 0, + 2, + 30.0 + ], + [ + 2, + 8, + null + ] + ], + "average_speed": [ + [ + 0, + 2, + 16.0 + ], + [ + 2, + 8, + 28.0 + ] + ], + "toll": [ + [ + 0, + 8, + "missing" + ] + ], + "track_type": [ + [ + 0, + 8, + "missing" + ] + ] + }, + "ascend": 3.8489990234375, + "descend": 1.0839996337890625, + "snapped_waypoints": "kz|xH{}avAwfV`MrKgP" + } + ] +} \ No newline at end of file From 2bac2b8370f43456eeef90a03c9d804676cfd21e Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 30 Oct 2022 15:29:02 +0100 Subject: [PATCH 148/322] more robust waypoint skipping --- src/stores/TurnNavigationStore.ts | 63 ++++- src/turnNavigation/GeoMethods.ts | 9 + src/turnNavigation/TurnNavigation.tsx | 2 +- test/stores/TurnNavigationStore.test.ts | 142 +++++++++-- .../turnNavigation/response-hoyerswerda4.json | 229 ++++++++++++++++++ 5 files changed, 412 insertions(+), 33 deletions(-) create mode 100644 test/turnNavigation/response-hoyerswerda4.json diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 7efdbb96..25c4b1c2 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -136,13 +136,28 @@ export default class TurnNavigationStore extends Store let path = state.activePath let instr = getCurrentInstruction(path.instructions, coordinate) - // if (instr.index < 0 || instr.distanceToRoute > 50) { - // path = state.initialPath - // instr = getCurrentInstruction(path.instructions, coordinate) - // } + if ( + TurnNavigationStore.skipWaypoint( + instr.distanceUntilNextWaypoint, + { + lng: path.snapped_waypoints.coordinates[instr.nextWaypointIndex][0], + lat: path.snapped_waypoints.coordinates[instr.nextWaypointIndex][1], + }, + state.coordinate, + action.coordinate + ) + ) { + if (instr.nextWaypointIndex + 1 < path.instructions.length) { + instr.nextWaypointIndex++ + } else { + // reached destination -> stop navigation + //this.stop() + //return { ...state, enabled: false, speed: 0, heading: 0 } + } + } // reroute only if already in turn navigation mode otherwise UI is not ready - if (state.enabled && instr.distanceToRoute > 50) { + if (state.enabled && (instr.distanceToRoute > 50 || instr.distanceUntilNextWaypoint < 50)) { let queriedAPI = false if (state.activeProfile && !state.rerouteInProgress) { const fromPoint: [number, number] = [coordinate.lng, coordinate.lat] @@ -163,7 +178,13 @@ export default class TurnNavigationStore extends Store .route(args) .then(result => { if (result.paths.length > 0) { - console.log('rerouting -> ', result.paths[0].distance) + console.log( + 'rerouted:' + + result.paths[0].distance + + 'm, before: ' + + state.activePath?.distance + + 'm' + ) Dispatcher.dispatch(new TurnNavigationRerouting(result.paths[0])) this.speechSynthesizer.synthesize(tr('reroute')) } else { @@ -249,10 +270,8 @@ export default class TurnNavigationStore extends Store const path = action.path // ensure that path and instruction are synced - const { index, distanceToNext, remainingTime, remainingDistance } = getCurrentInstruction( - path.instructions, - state.coordinate - ) + const { index, distanceToNext, remainingTime, remainingDistance, distanceUntilNextWaypoint } = + getCurrentInstruction(path.instructions, state.coordinate) // current location is still not close if (index < 0) { @@ -275,13 +294,33 @@ export default class TurnNavigationStore extends Store ...state, activePath: path, rerouteInProgress: false, - instruction: { index: index, distanceToNext, remainingTime, remainingDistance, text }, + instruction: { index, distanceToNext, remainingTime, remainingDistance, text }, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, } } return state } + public static skipWaypoint( + distanceUntilNextWaypoint: number, + waypoint: Coordinate, + stateCoord: Coordinate, + actionCoord: Coordinate + ): boolean { + return ( + // if waypoint reached use next waypoint as destination + distanceUntilNextWaypoint < 50 || + // detect passing by via measuring orientation compared to previous location + (distanceUntilNextWaypoint < 250 && + toDegrees( + Math.abs( + calcOrientation(stateCoord.lat, stateCoord.lng, waypoint.lat, waypoint.lng) - + calcOrientation(actionCoord.lat, actionCoord.lng, waypoint.lat, waypoint.lng) + ) + ) > 80) + ) + } + public async initFake() { console.log('started fake GPS injection') this.started = true @@ -306,7 +345,7 @@ export default class TurnNavigationStore extends Store for (let idx = 0; idx < coords.length; idx++) { // very ugly: in JS the random object cannot be initialed with a seed - const lat = coords[idx][1] + 0.001 * Math.random() // approx +-5m ? + const lat = coords[idx][1] + 0.0001 * Math.random() // approx +-5m ? const lon = coords[idx][0] + 0.0001 * Math.random() let heading = 0 if (idx > 0) { diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 53469b0b..d5f77894 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -52,6 +52,7 @@ export function getCurrentInstruction( distanceToRoute: number remainingTime: number remainingDistance: number + distanceUntilNextWaypoint: number nextWaypointIndex: number } { let instructionIndex = -1 @@ -89,6 +90,7 @@ export function getCurrentInstruction( } } + let distanceUntilNextWaypoint = -1 let timeToNext = 0 let remainingTime = 0 let remainingDistance = distanceToNext @@ -105,7 +107,13 @@ export function getCurrentInstruction( for (let instrIdx = instructionIndex; instrIdx < instructions.length; instrIdx++) { remainingTime += instructions[instrIdx].time remainingDistance += instructions[instrIdx].distance + + const sign = instructions[instrIdx].sign + if ((sign === 4 || sign === 5) && distanceUntilNextWaypoint < 0) + distanceUntilNextWaypoint = remainingDistance } + if (distanceUntilNextWaypoint < 0) + throw new Error("remaining instructions didn't include a via or finish!?" + instructions) } return { @@ -115,6 +123,7 @@ export function getCurrentInstruction( distanceToRoute, remainingTime, remainingDistance, + distanceUntilNextWaypoint, nextWaypointIndex, } } diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 2265e099..3c8d17d1 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -11,7 +11,7 @@ import { Path } from '@/api/graphhopper' export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { if (turnNavigation.activePath == null) new Error('activePath cannot be null if TurnNavigation is enabled') - // ugly workaround to make typescript happy + // can we avoid this workaround to make typescript happy? const path = turnNavigation.activePath == null ? ({} as Path) : turnNavigation.activePath const instruction = turnNavigation.instruction const pd = turnNavigation.pathDetails diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index d5628155..14e6fd2b 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -2,12 +2,14 @@ import Dispatcher from '@/stores/Dispatcher' import { LocationUpdate, SetSelectedPath, SetVehicleProfile } from '@/actions/Actions' import TurnNavigationStore from '@/stores/TurnNavigationStore' import { SpeechSynthesizer } from '@/SpeechSynthesizer' -import { ApiInfo, GeocodingResult, Path, RawResult, RoutingArgs, RoutingResult } from '@/api/graphhopper' +import { ApiInfo, GeocodingResult, RawResult, RoutingArgs, RoutingResult } from '@/api/graphhopper' import Api, { ApiImpl } from '@/api/Api' import { setTranslation } from '@/translation/Translation' +import { Coordinate } from '@/stores/QueryStore' let routeWithVia = toRoutingResult(require('../turnNavigation/response-hoyerswerda2.json')) let reroute = toRoutingResult(require('../turnNavigation/response-hoyerswerda3.json')) +let routeWithSimpleVia = toRoutingResult(require('../turnNavigation/response-hoyerswerda4.json')) function toRoutingResult(rawResult: RawResult): RoutingResult { return { @@ -25,19 +27,82 @@ describe('TurnNavigationStore', () => { Dispatcher.clear() }) + describe('geo method', () => { + it('skip waypoint', () => { + // close enough + expect( + TurnNavigationStore.skipWaypoint(49, {} as Coordinate, {} as Coordinate, {} as Coordinate) + ).toBeTruthy() + + // state and action coordinate are both not close enough but indicate passing waypoint + expect( + TurnNavigationStore.skipWaypoint( + 58, + { lng: 14.081976, lat: 51.420467 }, + { lng: 14.082183, lat: 51.420978 }, + { lng: 14.081711, lat: 51.419924 } + ) + ).toBeTruthy() + + // not close enough and no passing + expect( + TurnNavigationStore.skipWaypoint( + 58, + { lng: 14.081976, lat: 51.420467 }, + { lng: 14.082183, lat: 51.420978 }, + { lng: 14.083116, lat: 51.420814 } + ) + ).toBeFalsy() + + // not close enough but rough passing + expect( + TurnNavigationStore.skipWaypoint( + 58, + { lng: 14.081976, lat: 51.420467 }, + { lng: 14.082183, lat: 51.420978 }, + { lng: 14.082424, lat: 51.419894 } + ) + ).toBeTruthy() + + // not close enough but typical situation of passing by + expect( + TurnNavigationStore.skipWaypoint( + 72, + { lng: 14.073986, lat: 51.419021 }, + { lng: 14.07319, lat: 51.418877 }, + { lng: 14.074043, lat: 51.418791 } + ) + ).toBeTruthy() + // same situation but too far away from waypoint + expect( + TurnNavigationStore.skipWaypoint( + 72, + { lng: 14.074243, lat: 51.419593 }, + { lng: 14.07319, lat: 51.418877 }, + { lng: 14.074043, lat: 51.418791 } + ) + ).toBeFalsy() + }) + }) + describe('path state handling', () => { it('should set path', () => { - const store = createStore(reroute) + const store = createStore() Dispatcher.dispatch(new SetSelectedPath(reroute.paths[0])) expect(store.state.initialPath).toEqual(reroute.paths[0]) }) it('should reroute', async () => { - const store = createStore(reroute) - Dispatcher.dispatch(new SetSelectedPath(routeWithVia.paths[0])) + // why 00000000001? + const rerouteWaypoints = [ + [14.266328, 51.434653], + [14.267240000000001, 51.43253000000001], + ] as [number, number][] + const store = createStore(reroute, rerouteWaypoints) + Dispatcher.dispatch(new SetSelectedPath(reroute.paths[0])) Dispatcher.dispatch(new LocationUpdate({ lng: 14.266959, lat: 51.435051 }, 10, 120)) expect(store.state.speed).toEqual(10) - expect(store.state.activePath).toEqual(routeWithVia.paths[0]) + expect(store.state.activePath).toEqual(reroute.paths[0]) expect(store.state.instruction.index).toEqual(1) // no rerouting without profile @@ -46,7 +111,7 @@ describe('TurnNavigationStore', () => { expect(store.state.rerouteInProgress).toBeFalsy() Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.268302, lat: 51.435232 }, 12, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, 12, 120)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() await flushPromises() @@ -57,7 +122,11 @@ describe('TurnNavigationStore', () => { }) it('should reroute with via point', async () => { - const store = createStore(reroute) + const rerouteWaypoints = [ + [14.269289, 51.434764], + [14.26725, 51.43253000000001], + ] as [number, number][] + const store = createStore(reroute, rerouteWaypoints) Dispatcher.dispatch(new SetSelectedPath(routeWithVia.paths[0])) Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) Dispatcher.dispatch(new LocationUpdate({ lng: 14.266959, lat: 51.435051 }, 10, 120)) @@ -65,22 +134,52 @@ describe('TurnNavigationStore', () => { expect(store.state.instruction.index).toEqual(1) expect(store.state.activePath).toEqual(routeWithVia.paths[0]) - // TODO NOW // close to via point it should force rerouting to avoid potential interferences with overlapping edges - // Dispatcher.dispatch(new LocationUpdate({ lng: 14.269289, lat: 51.434764 }, 12, 70)) - // expect(store.state.speed).toEqual(12) - // - // expect(store.state.rerouteInProgress).toBeTruthy() - // await flushPromises() - // expect(store.state.rerouteInProgress).toBeFalsy() - // - // expect(store.state.activePath).toEqual(reroute.paths[0]) - // expect(store.state.instruction.index).toEqual(1) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.269289, lat: 51.434764 }, 12, 70)) + expect(store.state.speed).toEqual(12) + + expect(store.state.rerouteInProgress).toBeTruthy() + await flushPromises() + expect(store.state.rerouteInProgress).toBeFalsy() + + expect(store.state.activePath?.distance).toEqual(reroute.paths[0].distance) + expect(store.state.instruction.index).toEqual(1) + }) + + it('should reroute with via point passing by', async () => { + const rerouteWaypoints = [ + [14.269289, 51.434764], + [14.26725, 51.43253], + ] as [number, number][] + const store = createStore(reroute, rerouteWaypoints) + Dispatcher.dispatch(new SetSelectedPath(routeWithSimpleVia.paths[0])) + Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) + Dispatcher.dispatch(new LocationUpdate({ lng: 51.436269, lat: 14.2727 }, 10, 120)) + expect(store.state.activePath).toEqual(routeWithSimpleVia.paths[0]) + + // close to middle waypoint but not within 50m + Dispatcher.dispatch(new LocationUpdate({ lng: 14.269289, lat: 51.434764 }, 12, 70)) + expect(store.state.speed).toEqual(12) + + // close to middle waypoint but not within 50m but still rerouting as more than 50m to previous location + Dispatcher.dispatch(new LocationUpdate({ lng: 14.269289, lat: 51.434764 }, 14, 70)) + expect(store.state.speed).toEqual(14) + + expect(store.state.rerouteInProgress).toBeTruthy() + await flushPromises() + expect(store.state.rerouteInProgress).toBeFalsy() + + expect(store.state.activePath?.distance).toEqual(reroute.paths[0].distance) + expect(store.state.instruction.index).toEqual(1) }) }) - function createStore(resultOnReroute: RoutingResult) { - const store = new TurnNavigationStore(new LocalApi(resultOnReroute), new DummySpeech(), true) + function createStore(resultOnReroute?: RoutingResult, wayPointsInQuery?: [number, number][]) { + const store = new TurnNavigationStore( + new LocalApi(resultOnReroute ? resultOnReroute : ({} as RoutingResult), wayPointsInQuery), + new DummySpeech(), + true + ) Dispatcher.register(store) return store } @@ -93,12 +192,15 @@ describe('TurnNavigationStore', () => { class LocalApi implements Api { readonly resultOnReroute + readonly wayPointsInQuery - constructor(resultOnReroute: RoutingResult) { + constructor(resultOnReroute: RoutingResult, wayPointsInQuery?: [number, number][]) { this.resultOnReroute = resultOnReroute + this.wayPointsInQuery = wayPointsInQuery } route(args: RoutingArgs): Promise { + if (this.wayPointsInQuery) expect(args.points).toEqual(this.wayPointsInQuery) return Promise.resolve(this.resultOnReroute) } diff --git a/test/turnNavigation/response-hoyerswerda4.json b/test/turnNavigation/response-hoyerswerda4.json new file mode 100644 index 00000000..58f74efa --- /dev/null +++ b/test/turnNavigation/response-hoyerswerda4.json @@ -0,0 +1,229 @@ +{ + "orig_url": "https://graphhopper.com/maps/?point=51.436269%2C14.272708&point=51.435115%2C14.270294&point=51.43253%2C14.26725&profile=car", + "hints": { + "visited_nodes.sum": 32, + "visited_nodes.average": 16.0 + }, + "info": { + "copyrights": [ + "GraphHopper", + "OpenStreetMap contributors" + ], + "took": 0 + }, + "paths": [ + { + "distance": 648.972, + "weight": 136.105064, + "time": 126370, + "transfers": 0, + "points_encoded": true, + "bbox": [ + 14.267247, + 51.432531, + 14.272937, + 51.436285 + ], + "points": "wc}xHusbvAacVf@c@qBzDtO~ApBbIUdAbEb@p@o@iCPIk@RCo@`@@qAr@XgBbDtByF", + "instructions": [ + { + "distance": 25.313, + "heading": 149.83, + "sign": 0, + "interval": [ + 0, + 1 + ], + "text": "Continue onto Robert-Schumann-Straße", + "time": 5695, + "street_name": "Robert-Schumann-Straße" + }, + { + "distance": 212.703, + "sign": 2, + "interval": [ + 1, + 2 + ], + "text": "Turn right onto Franz-Liszt-Straße", + "time": 47858, + "street_name": "Franz-Liszt-Straße" + }, + { + "distance": 0.0, + "sign": 5, + "last_heading": 240.4073612589421, + "interval": [ + 2, + 2 + ], + "text": "Waypoint 1", + "time": 0, + "street_name": "" + }, + { + "distance": 207.19, + "heading": 240.41, + "sign": 0, + "interval": [ + 2, + 4 + ], + "text": "Continue onto Franz-Liszt-Straße", + "time": 46618, + "street_name": "Franz-Liszt-Straße" + }, + { + "distance": 203.766, + "sign": -2, + "interval": [ + 4, + 10 + ], + "text": "Turn left onto Bautzener Allee", + "time": 26199, + "street_name": "Bautzener Allee" + }, + { + "distance": 0.0, + "sign": 4, + "last_heading": 202.52339184489207, + "interval": [ + 10, + 10 + ], + "text": "Arrive at destination", + "time": 0, + "street_name": "" + } + ], + "legs": [], + "details": { + "country": [ + [ + 0, + 2, + "DEU" + ], + [ + 2, + 10, + "DEU" + ] + ], + "surface": [ + [ + 0, + 1, + "concrete" + ], + [ + 1, + 2, + "asphalt" + ], + [ + 2, + 3, + "asphalt" + ], + [ + 3, + 10, + "missing" + ] + ], + "road_environment": [ + [ + 0, + 2, + "road" + ], + [ + 2, + 10, + "road" + ] + ], + "road_class": [ + [ + 0, + 2, + "residential" + ], + [ + 2, + 4, + "residential" + ], + [ + 4, + 10, + "tertiary" + ] + ], + "max_speed": [ + [ + 0, + 2, + 30.0 + ], + [ + 2, + 4, + 30.0 + ], + [ + 4, + 10, + null + ] + ], + "average_speed": [ + [ + 0, + 2, + 16.0 + ], + [ + 2, + 4, + 16.0 + ], + [ + 4, + 10, + 28.0 + ] + ], + "toll": [ + [ + 0, + 2, + "missing" + ], + [ + 2, + 10, + "missing" + ] + ], + "track_type": [ + [ + 0, + 2, + "missing" + ], + [ + 2, + 10, + "missing" + ] + ] + }, + "ascend": 5.411998748779297, + "descend": 2.06500244140625, + "snapped_waypoints": "wc}xHusbvAacVbFpNQhOzQkS" + } + ] +} \ No newline at end of file From d6ee6346f0b310cec5279fb602963cef2cebda28 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 31 Oct 2022 12:46:29 +0100 Subject: [PATCH 149/322] better rerouting and tests with via points --- src/stores/TurnNavigationStore.ts | 131 ++++++++++-------- src/turnNavigation/GeoMethods.ts | 52 ++++--- src/turnNavigation/TurnNavigation.tsx | 8 +- test/stores/TurnNavigationStore.test.ts | 109 ++++++++++----- test/turnNavigation/GeoMethods.test.ts | 14 +- ...sponse-hoyerswerda3.json => reroute1.json} | 0 test/turnNavigation/reroute2.json | 118 ++++++++++++++++ ...erswerda4.json => routeWithSimpleVia.json} | 0 8 files changed, 302 insertions(+), 130 deletions(-) rename test/turnNavigation/{response-hoyerswerda3.json => reroute1.json} (100%) create mode 100644 test/turnNavigation/reroute2.json rename test/turnNavigation/{response-hoyerswerda4.json => routeWithSimpleVia.json} (100%) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 25c4b1c2..b976923e 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -17,6 +17,7 @@ import NoSleep from 'nosleep.js' import Api, { ApiImpl } from '@/api/Api' import { calcOrientation, + distCalc, getCurrentDetails, getCurrentInstruction, toDegrees, @@ -44,9 +45,10 @@ export interface TurnNavigationStoreState { export interface TNInstructionState { index: number - distanceToNext: number - remainingTime: number - remainingDistance: number + distanceToTurn: number + timeToEnd: number + distanceToEnd: number + distanceToWaypoint: number text: string } @@ -136,37 +138,46 @@ export default class TurnNavigationStore extends Store let path = state.activePath let instr = getCurrentInstruction(path.instructions, coordinate) + // skip waypoint if close to it and next is available (either activePath has via points or initialPath) + let skipWaypoint = TurnNavigationStore.skipWaypoint( + state.instruction.distanceToWaypoint, + TurnNavigationStore.getWaypoint(path, instr.nextWaypointIndex), + state.coordinate, + action.coordinate + ) + // ... the waypoint of activePath should be skipped -> pick next waypoint from initialPath if ( - TurnNavigationStore.skipWaypoint( - instr.distanceUntilNextWaypoint, - { - lng: path.snapped_waypoints.coordinates[instr.nextWaypointIndex][0], - lat: path.snapped_waypoints.coordinates[instr.nextWaypointIndex][1], - }, + skipWaypoint && + path.snapped_waypoints.coordinates.length == 2 && + state.initialPath.snapped_waypoints.coordinates.length > 2 + ) { + // switch back to original path and skip the current waypoint + path = state.initialPath + instr = getCurrentInstruction(path.instructions, coordinate) + skipWaypoint = TurnNavigationStore.skipWaypoint( + state.instruction.distanceToWaypoint, + TurnNavigationStore.getWaypoint(path, instr.nextWaypointIndex), state.coordinate, action.coordinate ) - ) { - if (instr.nextWaypointIndex + 1 < path.instructions.length) { - instr.nextWaypointIndex++ - } else { - // reached destination -> stop navigation - //this.stop() - //return { ...state, enabled: false, speed: 0, heading: 0 } - } + } + + // the initialPath can contain more than 2 waypoints -> pick the next as destination for rerouting + if (skipWaypoint) { + if (instr.nextWaypointIndex + 1 < path.snapped_waypoints.coordinates.length) instr.nextWaypointIndex++ + else skipWaypoint = false // no reroute if end is reached } // reroute only if already in turn navigation mode otherwise UI is not ready - if (state.enabled && (instr.distanceToRoute > 50 || instr.distanceUntilNextWaypoint < 50)) { + if (state.enabled && (instr.distanceToRoute > 50 || skipWaypoint)) { let queriedAPI = false if (state.activeProfile && !state.rerouteInProgress) { - const fromPoint: [number, number] = [coordinate.lng, coordinate.lat] - const toPoint: [number, number] = [ - path.snapped_waypoints.coordinates[instr.nextWaypointIndex][0], - path.snapped_waypoints.coordinates[instr.nextWaypointIndex][1], - ] + const toCoordinate = TurnNavigationStore.getWaypoint(path, instr.nextWaypointIndex) const args: RoutingArgs = { - points: [fromPoint, toPoint], + points: [ + [coordinate.lng, coordinate.lat], + [toCoordinate.lng, toCoordinate.lat], + ], maxAlternativeRoutes: 0, heading: action.heading, zoom: false, @@ -178,13 +189,7 @@ export default class TurnNavigationStore extends Store .route(args) .then(result => { if (result.paths.length > 0) { - console.log( - 'rerouted:' + - result.paths[0].distance + - 'm, before: ' + - state.activePath?.distance + - 'm' - ) + console.log('rerouted:' + state.activePath?.distance + '->' + result.paths[0].distance) Dispatcher.dispatch(new TurnNavigationRerouting(result.paths[0])) this.speechSynthesizer.synthesize(tr('reroute')) } else { @@ -223,8 +228,8 @@ export default class TurnNavigationStore extends Store let lastAnnounceDistance = 10 + 2 * Math.round(averageSpeed / 5) * 5 if ( - instr.distanceToNext <= lastAnnounceDistance && - (instructionState.distanceToNext > lastAnnounceDistance || instr.index != instructionState.index) + instr.distanceToTurn <= lastAnnounceDistance && + (instructionState.distanceToTurn > lastAnnounceDistance || instr.index != instructionState.index) ) { this.speechSynthesizer.synthesize(nextInstruction.text) } @@ -232,14 +237,14 @@ export default class TurnNavigationStore extends Store const firstAnnounceDistance = 1150 if ( averageSpeed > 15 && // two announcements only if faster speed - instr.distanceToNext > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) - instr.distanceToNext <= firstAnnounceDistance && - (instructionState.distanceToNext > firstAnnounceDistance || instr.index != instructionState.index) + instr.distanceToTurn > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) + instr.distanceToTurn <= firstAnnounceDistance && + (instructionState.distanceToTurn > firstAnnounceDistance || instr.index != instructionState.index) ) { let inString = - instr.distanceToNext > 800 + instr.distanceToTurn > 800 ? tr('in_km_singular') - : tr('in_m', ['' + Math.round(instr.distanceToNext / 100) * 100]) + : tr('in_m', ['' + Math.round(instr.distanceToTurn / 100) * 100]) this.speechSynthesizer.synthesize(inString + ' ' + nextInstruction.text) } } @@ -259,9 +264,10 @@ export default class TurnNavigationStore extends Store coordinate: coordinate, instruction: { index: instr.index, - distanceToNext: instr.distanceToNext, - remainingTime: instr.remainingTime, - remainingDistance: instr.remainingDistance, + distanceToTurn: instr.distanceToTurn, + timeToEnd: instr.timeToEnd, + distanceToEnd: instr.distanceToEnd, + distanceToWaypoint: instr.distanceToWaypoint, text, }, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, @@ -270,8 +276,10 @@ export default class TurnNavigationStore extends Store const path = action.path // ensure that path and instruction are synced - const { index, distanceToNext, remainingTime, remainingDistance, distanceUntilNextWaypoint } = - getCurrentInstruction(path.instructions, state.coordinate) + const { index, distanceToTurn, timeToEnd, distanceToEnd, distanceToWaypoint } = getCurrentInstruction( + path.instructions, + state.coordinate + ) // current location is still not close if (index < 0) { @@ -294,31 +302,38 @@ export default class TurnNavigationStore extends Store ...state, activePath: path, rerouteInProgress: false, - instruction: { index, distanceToNext, remainingTime, remainingDistance, text }, + instruction: { + index, + distanceToTurn: distanceToTurn, + timeToEnd: timeToEnd, + distanceToEnd: distanceToEnd, + distanceToWaypoint: distanceToWaypoint, + text, + }, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, } } return state } + private static getWaypoint(path: Path, nextWaypointIndex: number): Coordinate { + return { + lng: path.snapped_waypoints.coordinates[nextWaypointIndex][0], + lat: path.snapped_waypoints.coordinates[nextWaypointIndex][1], + } + } + public static skipWaypoint( - distanceUntilNextWaypoint: number, + prevStateDistanceToWaypoint: number, waypoint: Coordinate, stateCoord: Coordinate, actionCoord: Coordinate ): boolean { - return ( - // if waypoint reached use next waypoint as destination - distanceUntilNextWaypoint < 50 || - // detect passing by via measuring orientation compared to previous location - (distanceUntilNextWaypoint < 250 && - toDegrees( - Math.abs( - calcOrientation(stateCoord.lat, stateCoord.lng, waypoint.lat, waypoint.lng) - - calcOrientation(actionCoord.lat, actionCoord.lng, waypoint.lat, waypoint.lng) - ) - ) > 80) - ) + // if waypoint reached use next waypoint as destination + if (prevStateDistanceToWaypoint < 50) return true + const straightDistToWaypoint = distCalc(actionCoord.lat, actionCoord.lng, waypoint.lat, waypoint.lng) + if (straightDistToWaypoint < 50) return true + return prevStateDistanceToWaypoint < 80 && straightDistToWaypoint < 80 } public async initFake() { @@ -345,7 +360,7 @@ export default class TurnNavigationStore extends Store for (let idx = 0; idx < coords.length; idx++) { // very ugly: in JS the random object cannot be initialed with a seed - const lat = coords[idx][1] + 0.0001 * Math.random() // approx +-5m ? + const lat = coords[idx][1] + 0.0007 * Math.random() // approx +-5m ? const lon = coords[idx][0] + 0.0001 * Math.random() let heading = 0 if (idx > 0) { diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index d5f77894..2d72de58 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -47,17 +47,17 @@ export function getCurrentInstruction( location: Coordinate ): { index: number - timeToNext: number - distanceToNext: number + timeToTurn: number + distanceToTurn: number distanceToRoute: number - remainingTime: number - remainingDistance: number - distanceUntilNextWaypoint: number + timeToEnd: number + distanceToEnd: number + distanceToWaypoint: number nextWaypointIndex: number } { let instructionIndex = -1 let distanceToRoute = Number.MAX_VALUE - let distanceToNext = 10.0 + let distanceToTurn = 10.0 let nextWaypointIndex = 0 let waypointIndex = 0 @@ -84,50 +84,48 @@ export function getCurrentInstruction( // use next instruction or finish instructionIndex = instrIdx + 1 < instructions.length ? instrIdx + 1 : instrIdx const last: number[] = points[points.length - 1] - distanceToNext = Math.round(distCalc(last[1], last[0], snapped.lat, snapped.lng)) + distanceToTurn = Math.round(distCalc(last[1], last[0], snapped.lat, snapped.lng)) nextWaypointIndex = waypointIndex + 1 } } } - let distanceUntilNextWaypoint = -1 - let timeToNext = 0 - let remainingTime = 0 - let remainingDistance = distanceToNext + let distanceToWaypoint = -1 + let timeToTurn = 0 + let timeToEnd = 0 + let distanceToEnd = distanceToTurn if (instructionIndex >= 0) { if (instructionIndex > 0) { // proportional estimate the time to the next instruction, TODO use time from path details instead - let prevInstruction = instructions[instructionIndex - 1] - timeToNext = - prevInstruction.distance > 0 ? prevInstruction.time * (distanceToNext / prevInstruction.distance) : 0 - // console.log('time: ' + prevInstruction.time + ', ' + distanceToNext + ', ' + prevInstruction.distance) + let prevInstr = instructions[instructionIndex - 1] + timeToTurn = prevInstr.distance > 0 ? prevInstr.time * (distanceToEnd / prevInstr.distance) : 0 } - remainingTime = timeToNext - remainingDistance = distanceToNext + timeToEnd = timeToTurn + distanceToEnd = distanceToTurn for (let instrIdx = instructionIndex; instrIdx < instructions.length; instrIdx++) { - remainingTime += instructions[instrIdx].time - remainingDistance += instructions[instrIdx].distance + timeToEnd += instructions[instrIdx].time + distanceToEnd += instructions[instrIdx].distance const sign = instructions[instrIdx].sign - if ((sign === 4 || sign === 5) && distanceUntilNextWaypoint < 0) - distanceUntilNextWaypoint = remainingDistance + if ((sign === 4 || sign === 5) && distanceToWaypoint < 0) distanceToWaypoint = distanceToEnd } - if (distanceUntilNextWaypoint < 0) + if (distanceToWaypoint < 0) throw new Error("remaining instructions didn't include a via or finish!?" + instructions) } return { index: instructionIndex, - timeToNext, - distanceToNext, + timeToTurn, + distanceToTurn, distanceToRoute, - remainingTime, - remainingDistance, - distanceUntilNextWaypoint, + timeToEnd, + distanceToEnd, + distanceToWaypoint, nextWaypointIndex, } } +// TODO NOW merge with distUtils.calcDist export function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: number): number { const sinDeltaLat: number = Math.sin(toRadians(toLat - fromLat) / 2) const sinDeltaLon: number = Math.sin(toRadians(toLng - fromLng) / 2) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 3c8d17d1..2e224526 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -21,7 +21,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto const arrivalDate = new Date() const currentSpeed = Math.round(turnNavigation.speed * 3.6) - arrivalDate.setMilliseconds(arrivalDate.getSeconds() + instruction.remainingTime) + arrivalDate.setMilliseconds(arrivalDate.getSeconds() + instruction.timeToEnd) const min = arrivalDate.getMinutes() return ( @@ -29,7 +29,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
    {getTurnSign(path.instructions[instruction.index].sign, instruction.index)}
    -
    {metersToText(instruction.distanceToNext, false)}
    +
    {metersToText(instruction.distanceToTurn, false)}
    @@ -44,7 +44,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
    ) : (
    - {milliSecondsToText(instruction.remainingTime)} + {milliSecondsToText(instruction.timeToEnd)} @@ -52,7 +52,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
    )}
    - {metersToText(instruction.remainingDistance, false)} + {metersToText(instruction.distanceToEnd, false)}
    setShowDebug(!showDebug)}> diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index 14e6fd2b..1c3ebb6a 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -8,8 +8,9 @@ import { setTranslation } from '@/translation/Translation' import { Coordinate } from '@/stores/QueryStore' let routeWithVia = toRoutingResult(require('../turnNavigation/response-hoyerswerda2.json')) -let reroute = toRoutingResult(require('../turnNavigation/response-hoyerswerda3.json')) -let routeWithSimpleVia = toRoutingResult(require('../turnNavigation/response-hoyerswerda4.json')) +let reroute1 = toRoutingResult(require('../turnNavigation/reroute1.json')) +let routeWithSimpleVia = toRoutingResult(require('../turnNavigation/routeWithSimpleVia.json')) +let reroute2 = toRoutingResult(require('../turnNavigation/reroute2.json')) function toRoutingResult(rawResult: RawResult): RoutingResult { return { @@ -44,17 +45,19 @@ describe('TurnNavigationStore', () => { ) ).toBeTruthy() + // https://graphhopper.com/maps/?point=51.421294%2C14.08236&point=51.420467%2C14.081976&point=51.420814%2C14.083116 // not close enough and no passing expect( TurnNavigationStore.skipWaypoint( - 58, + 110, { lng: 14.081976, lat: 51.420467 }, - { lng: 14.082183, lat: 51.420978 }, + { lng: 14.08236, lat: 51.421294 }, { lng: 14.083116, lat: 51.420814 } ) ).toBeFalsy() - // not close enough but rough passing + // https://graphhopper.com/maps/?point=51.420978%2C14.082183&point=51.420467%2C14.081976&point=51.419894%2C14.082424 + // not close enough but roughly passing expect( TurnNavigationStore.skipWaypoint( 58, @@ -64,6 +67,7 @@ describe('TurnNavigationStore', () => { ) ).toBeTruthy() + // https://graphhopper.com/maps/?point=51.418877%2C14.07319&point=51.419021%2C14.073986&point=51.418791%2C14.074043 // not close enough but typical situation of passing by expect( TurnNavigationStore.skipWaypoint( @@ -73,6 +77,8 @@ describe('TurnNavigationStore', () => { { lng: 14.074043, lat: 51.418791 } ) ).toBeTruthy() + + // https://graphhopper.com/maps/?point=51.418877%2C14.07319&point=51.419593%2C14.074243&point=51.418791%2C14.074043 // same situation but too far away from waypoint expect( TurnNavigationStore.skipWaypoint( @@ -87,22 +93,22 @@ describe('TurnNavigationStore', () => { describe('path state handling', () => { it('should set path', () => { - const store = createStore() - Dispatcher.dispatch(new SetSelectedPath(reroute.paths[0])) - expect(store.state.initialPath).toEqual(reroute.paths[0]) + const store = createStore(new LocalApi()) + Dispatcher.dispatch(new SetSelectedPath(reroute1.paths[0])) + expect(store.state.initialPath).toEqual(reroute1.paths[0]) }) it('should reroute', async () => { - // why 00000000001? + // TODO are these ugly numbers like 00000000001 from server-side snapped_waypoints array? const rerouteWaypoints = [ [14.266328, 51.434653], [14.267240000000001, 51.43253000000001], ] as [number, number][] - const store = createStore(reroute, rerouteWaypoints) - Dispatcher.dispatch(new SetSelectedPath(reroute.paths[0])) + const store = createStore(new LocalApi().setRerouteData(reroute1, rerouteWaypoints)) + Dispatcher.dispatch(new SetSelectedPath(reroute1.paths[0])) Dispatcher.dispatch(new LocationUpdate({ lng: 14.266959, lat: 51.435051 }, 10, 120)) expect(store.state.speed).toEqual(10) - expect(store.state.activePath).toEqual(reroute.paths[0]) + expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) // no rerouting without profile @@ -117,7 +123,7 @@ describe('TurnNavigationStore', () => { await flushPromises() expect(store.state.rerouteInProgress).toBeFalsy() - expect(store.state.activePath).toEqual(reroute.paths[0]) + expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) }) @@ -126,7 +132,7 @@ describe('TurnNavigationStore', () => { [14.269289, 51.434764], [14.26725, 51.43253000000001], ] as [number, number][] - const store = createStore(reroute, rerouteWaypoints) + const store = createStore(new LocalApi().setRerouteData(reroute1, rerouteWaypoints)) Dispatcher.dispatch(new SetSelectedPath(routeWithVia.paths[0])) Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) Dispatcher.dispatch(new LocationUpdate({ lng: 14.266959, lat: 51.435051 }, 10, 120)) @@ -142,44 +148,77 @@ describe('TurnNavigationStore', () => { await flushPromises() expect(store.state.rerouteInProgress).toBeFalsy() - expect(store.state.activePath?.distance).toEqual(reroute.paths[0].distance) + expect(store.state.activePath?.distance).toEqual(reroute1.paths[0].distance) expect(store.state.instruction.index).toEqual(1) }) it('should reroute with via point passing by', async () => { const rerouteWaypoints = [ - [14.269289, 51.434764], - [14.26725, 51.43253], + [14.271099, 51.435433], + [14.267240000000001, 51.43253000000001], ] as [number, number][] - const store = createStore(reroute, rerouteWaypoints) + const store = createStore(new LocalApi().setRerouteData(reroute1, rerouteWaypoints)) Dispatcher.dispatch(new SetSelectedPath(routeWithSimpleVia.paths[0])) Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) - Dispatcher.dispatch(new LocationUpdate({ lng: 51.436269, lat: 14.2727 }, 10, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.2727, lat: 51.436269 }, 10, 120)) expect(store.state.activePath).toEqual(routeWithSimpleVia.paths[0]) // close to middle waypoint but not within 50m - Dispatcher.dispatch(new LocationUpdate({ lng: 14.269289, lat: 51.434764 }, 12, 70)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.27109, lat: 51.435472 }, 12, 70)) expect(store.state.speed).toEqual(12) - // close to middle waypoint but not within 50m but still rerouting as more than 50m to previous location - Dispatcher.dispatch(new LocationUpdate({ lng: 14.269289, lat: 51.434764 }, 14, 70)) + // close to middle waypoint but again not within 50m but still rerouting as skipWaypoint was true + Dispatcher.dispatch(new LocationUpdate({ lng: 14.271099, lat: 51.435433 }, 14, 70)) expect(store.state.speed).toEqual(14) expect(store.state.rerouteInProgress).toBeTruthy() await flushPromises() expect(store.state.rerouteInProgress).toBeFalsy() - expect(store.state.activePath?.distance).toEqual(reroute.paths[0].distance) + expect(store.state.activePath?.distance).toEqual(reroute1.paths[0].distance) + expect(store.state.instruction.index).toEqual(1) + }) + + it('reroute and fetch next destination from initialPath', async () => { + const rerouteWaypoints = [ + [14.273946, 51.436422], + [14.27026, 51.435140000000004], + ] as [number, number][] + const api = new LocalApi() + api.setRerouteData(reroute2, rerouteWaypoints) + const store = createStore(api) + Dispatcher.dispatch(new SetSelectedPath(routeWithSimpleVia.paths[0])) + Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.2727, lat: 51.436269 }, 10, 120)) + expect(store.state.activePath).toEqual(routeWithSimpleVia.paths[0]) + + // force reroute + Dispatcher.dispatch(new LocationUpdate({ lng: 14.273946, lat: 51.436422 }, 12, 70)) + expect(store.state.speed).toEqual(12) + expect(store.state.rerouteInProgress).toBeTruthy() + await flushPromises() + expect(store.state.rerouteInProgress).toBeFalsy() + expect(store.state.activePath?.distance).toEqual(reroute2.paths[0].distance) + + // reroute from initialPath + const newWaypoints = [ + [14.270589, 51.435272], + [14.267240000000001, 51.43253000000001], + ] as [number, number][] + api.setRerouteData(reroute1, newWaypoints) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.270589, lat: 51.435272 }, 16, 70)) + expect(store.state.speed).toEqual(16) + + expect(store.state.rerouteInProgress).toBeTruthy() + await flushPromises() + expect(store.state.rerouteInProgress).toBeFalsy() + expect(store.state.activePath?.distance).toEqual(reroute1.paths[0].distance) expect(store.state.instruction.index).toEqual(1) }) }) - function createStore(resultOnReroute?: RoutingResult, wayPointsInQuery?: [number, number][]) { - const store = new TurnNavigationStore( - new LocalApi(resultOnReroute ? resultOnReroute : ({} as RoutingResult), wayPointsInQuery), - new DummySpeech(), - true - ) + function createStore(api: Api) { + const store = new TurnNavigationStore(api, new DummySpeech(), true) Dispatcher.register(store) return store } @@ -191,16 +230,18 @@ describe('TurnNavigationStore', () => { } class LocalApi implements Api { - readonly resultOnReroute - readonly wayPointsInQuery + private resultOnReroute?: RoutingResult + private waypointsInQuery?: [number, number][] - constructor(resultOnReroute: RoutingResult, wayPointsInQuery?: [number, number][]) { + setRerouteData(resultOnReroute: RoutingResult, waypointsInQuery: [number, number][]): Api { this.resultOnReroute = resultOnReroute - this.wayPointsInQuery = wayPointsInQuery + this.waypointsInQuery = waypointsInQuery + return this } route(args: RoutingArgs): Promise { - if (this.wayPointsInQuery) expect(args.points).toEqual(this.wayPointsInQuery) + if (this.waypointsInQuery) expect(args.points).toEqual(this.waypointsInQuery) + if (!this.resultOnReroute) throw Error('no result on reroute defined') return Promise.resolve(this.resultOnReroute) } diff --git a/test/turnNavigation/GeoMethods.test.ts b/test/turnNavigation/GeoMethods.test.ts index 9cd78365..6360801a 100644 --- a/test/turnNavigation/GeoMethods.test.ts +++ b/test/turnNavigation/GeoMethods.test.ts @@ -11,27 +11,27 @@ describe('calculate instruction', () => { // http://localhost:3000/?point=51.437233%2C14.246489&point=51.435514%2C14.239923&profile=car it('second instruction should not be "right turn"', () => { let path = ApiImpl.decodeResult(responseHoyerswerda1, true)[0] - const { index, distanceToNext, remainingTime, remainingDistance } = getCurrentInstruction(path.instructions, { + const { index, distanceToTurn, timeToEnd, distanceToEnd } = getCurrentInstruction(path.instructions, { lat: 51.435029, lng: 14.243259, }) - expect(distanceToNext).toEqual(236) - expect(remainingDistance).toEqual(236) - expect(Math.round(remainingTime / 1000)).toEqual(30) + expect(distanceToTurn).toEqual(236) + expect(distanceToEnd).toEqual(236) + expect(Math.round(timeToEnd / 1000)).toEqual(30) expect(path.instructions[index].text).toEqual('Ziel erreicht') }) it('remaining time should be correct', () => { let path = ApiImpl.decodeResult(responseHoyerswerda1, true)[0] - const { remainingTime, remainingDistance } = getCurrentInstruction(path.instructions, { + const { timeToEnd, distanceToEnd } = getCurrentInstruction(path.instructions, { lat: 51.439291, lng: 14.245254, }) - expect(Math.round(remainingTime / 1000)).toEqual(101) - expect(Math.round(remainingDistance)).toEqual(578) + expect(Math.round(timeToEnd / 1000)).toEqual(101) + expect(Math.round(distanceToEnd)).toEqual(578) }) it('nextWaypointIndex should be correct', () => { diff --git a/test/turnNavigation/response-hoyerswerda3.json b/test/turnNavigation/reroute1.json similarity index 100% rename from test/turnNavigation/response-hoyerswerda3.json rename to test/turnNavigation/reroute1.json diff --git a/test/turnNavigation/reroute2.json b/test/turnNavigation/reroute2.json new file mode 100644 index 00000000..b816210a --- /dev/null +++ b/test/turnNavigation/reroute2.json @@ -0,0 +1,118 @@ +{ + "orig_url": "https://graphhopper.com/maps/?point=51.436422%2C14.273946&point=51.435115%2C14.270294&profile=car", + "hints": { + "visited_nodes.sum": 20, + "visited_nodes.average": 20.0 + }, + "info": { + "copyrights": [ + "GraphHopper", + "OpenStreetMap contributors" + ], + "took": 0 + }, + "paths": [ + { + "distance": 291.911, + "weight": 70.0586, + "time": 65679, + "transfers": 0, + "points_encoded": true, + "bbox": [ + 14.270268, + 51.435143, + 14.27393, + 51.43644 + ], + "points": "ud}xH_{bvAqaV`GzUaA", + "instructions": [ + { + "distance": 291.911, + "heading": 240.41, + "sign": 0, + "interval": [ + 0, + 1 + ], + "text": "Continue onto Franz-Liszt-Straße", + "time": 65679, + "street_name": "Franz-Liszt-Straße" + }, + { + "distance": 0.0, + "sign": 4, + "last_heading": 240.4073612589421, + "interval": [ + 1, + 1 + ], + "text": "Arrive at destination", + "time": 0, + "street_name": "" + } + ], + "legs": [], + "details": { + "country": [ + [ + 0, + 1, + "DEU" + ] + ], + "surface": [ + [ + 0, + 1, + "asphalt" + ] + ], + "road_environment": [ + [ + 0, + 1, + "road" + ] + ], + "road_class": [ + [ + 0, + 1, + "residential" + ] + ], + "max_speed": [ + [ + 0, + 1, + 30.0 + ] + ], + "average_speed": [ + [ + 0, + 1, + 16.0 + ] + ], + "toll": [ + [ + 0, + 1, + "missing" + ] + ], + "track_type": [ + [ + 0, + 1, + "missing" + ] + ] + }, + "ascend": 1.3070030212402344, + "descend": 0.9810028076171875, + "snapped_waypoints": "ud}xH_{bvAqaV`GzUaA" + } + ] +} \ No newline at end of file diff --git a/test/turnNavigation/response-hoyerswerda4.json b/test/turnNavigation/routeWithSimpleVia.json similarity index 100% rename from test/turnNavigation/response-hoyerswerda4.json rename to test/turnNavigation/routeWithSimpleVia.json From 2ad3c41f6fd4e8d1b347cba8ab3ffaaba2e800a1 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 31 Oct 2022 14:00:35 +0100 Subject: [PATCH 150/322] use filled navigation icon --- src/layers/CurrentLocationLayer.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index c19ece98..261724b6 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -46,10 +46,13 @@ function addCurrentLocation(map: Map, location: Coordinate) { currentLocationLayer.set('gh:current_location', true) currentLocationLayer.setZIndex(3) - // TODO avoid copy of navigation.svg + // we need a filled version of navigation.svg const svgData = '' + - '' + '' + + '' + + '' + currentLocationLayer.setStyle( feature => new Style({ From 8c2d4594ae799e719641c48a40d7deeabecfefca Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 31 Oct 2022 17:59:25 +0100 Subject: [PATCH 151/322] put a number in the turn instruction marker --- src/sidebar/instructions/Instructions.tsx | 6 +++--- src/stores/TurnNavigationStore.ts | 5 ++++- src/turnNavigation/TurnNavigation.tsx | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/sidebar/instructions/Instructions.tsx b/src/sidebar/instructions/Instructions.tsx index 426001e9..493f9bfe 100644 --- a/src/sidebar/instructions/Instructions.tsx +++ b/src/sidebar/instructions/Instructions.tsx @@ -49,14 +49,14 @@ const Line = function ({ instruction, index }: { instruction: Instruction; index ) } > - {getTurnSign(instruction.sign, index)} + {getTurnSign(instruction.sign, index, undefined)} {instruction.text} {metersToText(instruction.distance, showDistanceInMiles)} ) } -export function getTurnSign(sign: number, index: number) { +export function getTurnSign(sign: number, index: number, waypointIndex?: number) { // from, via and to signs are special if (index === 0 || sign === 4 || sign === 5) { let markerColor @@ -70,7 +70,7 @@ export function getTurnSign(sign: number, index: number) { return (
    - +
    ) } diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index b976923e..9b697377 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -48,6 +48,7 @@ export interface TNInstructionState { distanceToTurn: number timeToEnd: number distanceToEnd: number + nextWaypointIndex: number distanceToWaypoint: number text: string } @@ -267,6 +268,7 @@ export default class TurnNavigationStore extends Store distanceToTurn: instr.distanceToTurn, timeToEnd: instr.timeToEnd, distanceToEnd: instr.distanceToEnd, + nextWaypointIndex: instr.nextWaypointIndex, distanceToWaypoint: instr.distanceToWaypoint, text, }, @@ -276,7 +278,7 @@ export default class TurnNavigationStore extends Store const path = action.path // ensure that path and instruction are synced - const { index, distanceToTurn, timeToEnd, distanceToEnd, distanceToWaypoint } = getCurrentInstruction( + const { index, distanceToTurn, timeToEnd, distanceToEnd, nextWaypointIndex, distanceToWaypoint } = getCurrentInstruction( path.instructions, state.coordinate ) @@ -307,6 +309,7 @@ export default class TurnNavigationStore extends Store distanceToTurn: distanceToTurn, timeToEnd: timeToEnd, distanceToEnd: distanceToEnd, + nextWaypointIndex: nextWaypointIndex, distanceToWaypoint: distanceToWaypoint, text, }, diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 2e224526..9be7e1e9 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -28,7 +28,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto <>
    -
    {getTurnSign(path.instructions[instruction.index].sign, instruction.index)}
    +
    {getTurnSign(path.instructions[instruction.index].sign, instruction.index, instruction.nextWaypointIndex)}
    {metersToText(instruction.distanceToTurn, false)}
    From 5583749667dec1f89ac8b19b4bb4c2e0d9c9426b Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 6 Nov 2022 14:36:23 +0100 Subject: [PATCH 152/322] avoid path usage in TurnNavigation.tsx --- src/stores/TurnNavigationStore.ts | 9 +++++---- src/turnNavigation/TurnNavigation.tsx | 5 +---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 9b697377..e918b806 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -50,6 +50,7 @@ export interface TNInstructionState { distanceToEnd: number nextWaypointIndex: number distanceToWaypoint: number + sign: number text: string } @@ -270,6 +271,7 @@ export default class TurnNavigationStore extends Store distanceToEnd: instr.distanceToEnd, nextWaypointIndex: instr.nextWaypointIndex, distanceToWaypoint: instr.distanceToWaypoint, + sign: path.instructions[instr.index].sign, text, }, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, @@ -278,10 +280,8 @@ export default class TurnNavigationStore extends Store const path = action.path // ensure that path and instruction are synced - const { index, distanceToTurn, timeToEnd, distanceToEnd, nextWaypointIndex, distanceToWaypoint } = getCurrentInstruction( - path.instructions, - state.coordinate - ) + const { index, distanceToTurn, timeToEnd, distanceToEnd, nextWaypointIndex, distanceToWaypoint } = + getCurrentInstruction(path.instructions, state.coordinate) // current location is still not close if (index < 0) { @@ -311,6 +311,7 @@ export default class TurnNavigationStore extends Store distanceToEnd: distanceToEnd, nextWaypointIndex: nextWaypointIndex, distanceToWaypoint: distanceToWaypoint, + sign: path.instructions[index].sign, text, }, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 9be7e1e9..8aa9ca74 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -7,12 +7,9 @@ import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import Dispatcher from '@/stores/Dispatcher' import { TurnNavigationStop, ZoomMapToPoint } from '@/actions/Actions' import PlainButton from '@/PlainButton' -import { Path } from '@/api/graphhopper' export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { if (turnNavigation.activePath == null) new Error('activePath cannot be null if TurnNavigation is enabled') - // can we avoid this workaround to make typescript happy? - const path = turnNavigation.activePath == null ? ({} as Path) : turnNavigation.activePath const instruction = turnNavigation.instruction const pd = turnNavigation.pathDetails @@ -28,7 +25,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto <>
    -
    {getTurnSign(path.instructions[instruction.index].sign, instruction.index, instruction.nextWaypointIndex)}
    +
    {getTurnSign(instruction.sign, instruction.index, instruction.nextWaypointIndex)}
    {metersToText(instruction.distanceToTurn, false)}
    From 6c8e5d7388bf546729ec951caf5b8d0fd8a891f7 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 6 Nov 2022 14:40:43 +0100 Subject: [PATCH 153/322] reset instruction and path detail object on SetSelectedPath action --- src/stores/TurnNavigationStore.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index e918b806..9bd14748 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -132,6 +132,8 @@ export default class TurnNavigationStore extends Store ...state, initialPath: action.path, activePath: action.path, + instruction: {} as TNInstructionState, + pathDetails: {} as TNPathDetailsState, } } else if (action instanceof LocationUpdate) { if (state.initialPath == null) throw new Error('initialPath must not be null') From 530861b3b38154e427ba7d56a63d86319ac52448 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 6 Nov 2022 16:01:12 +0100 Subject: [PATCH 154/322] tweak panel with accept --- src/layers/ContextMenu.tsx | 2 +- src/sidebar/RoutingResult.module.css | 12 ++++- src/sidebar/RoutingResults.tsx | 78 +++++++++++++++------------- 3 files changed, 54 insertions(+), 38 deletions(-) diff --git a/src/layers/ContextMenu.tsx b/src/layers/ContextMenu.tsx index 7a3d62a9..8318e012 100644 --- a/src/layers/ContextMenu.tsx +++ b/src/layers/ContextMenu.tsx @@ -94,7 +94,7 @@ class LongTouchHandler { } onTouchEnd() { - console.log('touch end') + // console.log('touch end') window.clearTimeout(this.currentTimeout) this.currentEvent = undefined } diff --git a/src/sidebar/RoutingResult.module.css b/src/sidebar/RoutingResult.module.css index cbb7deff..c8b1160a 100644 --- a/src/sidebar/RoutingResult.module.css +++ b/src/sidebar/RoutingResult.module.css @@ -149,12 +149,20 @@ padding-bottom: 1em; } -.showRisk { +.showRiskAccept button { padding: 0.5em; + margin: 0.1em; + background-color: #f97777; + color: white; +} + +.showRiskBack svg { + width: 20px; + height: 20px; } .showRiskButtons { - padding: 0.5em; + padding: 1.5em 1.5em 3em 1.5em; display: flex; flex-direction: row; justify-content: space-around; diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index a725bc95..79bfef7f 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -1,7 +1,7 @@ import { Instruction, Path } from '@/api/graphhopper' import { CurrentRequest, RequestState, SubRequest } from '@/stores/QueryStore' import styles from './RoutingResult.module.css' -import { useContext, useEffect, useState } from 'react' +import React, { useContext, useEffect, useState } from 'react' import Dispatcher from '@/stores/Dispatcher' import { SetSelectedPath, TurnNavigationSettingsUpdate, TurnNavigationStop } from '@/actions/Actions' import { metersToSimpleText, metersToText, milliSecondsToText } from '@/Converters' @@ -17,6 +17,7 @@ import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import { ApiImpl } from '@/api/Api' import { getTurnNavigationStore } from '@/stores/Stores' import { TNSettingsState, TurnNavigationStoreState } from '@/stores/TurnNavigationStore' +import Cross from '@/sidebar/times-solid.svg' export interface RoutingResultsProps { paths: Path[] @@ -60,33 +61,40 @@ function RoutingResult({ const showHints = hasFords || hasTolls || hasFerries || showAndHasBadTracks || showAndHasSteps || hasBorderCrossed const showDistanceInMiles = useContext(ShowDistanceInMilesContext) - let [showRisk, setShowRisk] = useState(false) - if (!turnNavigation.settings.acceptedRisk && showRisk) + let [showBackAndRisk, setShowBackAndRisk] = useState(false) + + if (showBackAndRisk) return ( -
    -
    {tr('warning')}
    -
    - { - setShowRisk(false) - Dispatcher.dispatch(new TurnNavigationStop()) - }} - > - {tr('back')} - - { - Dispatcher.dispatch( - new TurnNavigationSettingsUpdate({ acceptedRisk: true } as TNSettingsState) - ) - turnNavigation.settings.fakeGPS - ? getTurnNavigationStore().initFake() - : getTurnNavigationStore().initReal() - }} - > - {tr('accept_risks_after_warning')} - -
    +
    + { + // if this panel is still shown although we already confirmed the risk then we are waiting for GPS (or an error with location permission) + turnNavigation.settings.acceptedRisk ? ( + {tr('waiting_for_gps')} + ) : ( +
    +
    {tr('warning')}
    + { + Dispatcher.dispatch( + new TurnNavigationSettingsUpdate({ acceptedRisk: true } as TNSettingsState) + ) + if (turnNavigation.settings.fakeGPS) getTurnNavigationStore().initFake() + else getTurnNavigationStore().initReal() + }} + > + {tr('accept_risks_after_warning')} + +
    + )} + { + setShowBackAndRisk(false) + Dispatcher.dispatch(new TurnNavigationStop()) + }} + > + +
    ) @@ -115,22 +123,22 @@ function RoutingResult({ )}
    - {isSelected && !showRisk && ( + {isSelected && !showBackAndRisk && ( { - if (!turnNavigation.settings.acceptedRisk) setShowRisk(true) - else - turnNavigation.settings.fakeGPS - ? getTurnNavigationStore().initFake() - : getTurnNavigationStore().initReal() + setShowBackAndRisk(true) + if (turnNavigation.settings.acceptedRisk) { + if (turnNavigation.settings.fakeGPS) getTurnNavigationStore().initFake() + else getTurnNavigationStore().initReal() + } }} >
    {tr('Navi')}
    )} - {isSelected && !showRisk && ( + {isSelected && !showBackAndRisk && ( downloadGPX(path, showDistanceInMiles)} @@ -139,7 +147,7 @@ function RoutingResult({
    {tr('gpx_button')}
    )} - {isSelected && !showRisk && ( + {isSelected && !showBackAndRisk && ( setExpanded(!isExpanded)} From c56f9e0f44cae9d812e0daf3faa998750d1113bd Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 6 Nov 2022 20:52:09 +0100 Subject: [PATCH 155/322] make clicking volume easier --- src/App.module.css | 9 +++++--- src/App.tsx | 21 ++++++++++--------- src/sidebar/RoutingResults.tsx | 35 ++++++++++++++++--------------- src/stores/SettingsStore.ts | 2 +- src/stores/TurnNavigationStore.ts | 10 ++++++--- 5 files changed, 43 insertions(+), 34 deletions(-) diff --git a/src/App.module.css b/src/App.module.css index 53953323..98af6874 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -55,9 +55,8 @@ .turnNavigation { grid-column: 1 / span 1; grid-row: 1 / span 1; - z-index: 5; + z-index: 3; max-height: 8em; - margin: 0.5rem; padding: 0.5rem; background-color: white; @@ -137,10 +136,14 @@ background-color: white; } +.smallScreenVolume svg { + transform: scale(1.5); +} + .smallScreenVolume { grid-row: 1 / span 1; grid-column: 1 / span 1; - padding: 5px 4px 3px 7px; + padding: 0.9em 0.8em 0.8em 0.9em; width: 30px; z-index: 2; background-color: white; diff --git a/src/App.tsx b/src/App.tsx index 10ef37bb..f5b045fd 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -241,16 +241,17 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, turnNav
    -
    - - Dispatcher.dispatch( - new TurnNavigationSettingsUpdate({ - soundEnabled: !turnNavigation.settings.soundEnabled, - } as TNSettingsState) - ) - } - > +
    + Dispatcher.dispatch( + new TurnNavigationSettingsUpdate({ + soundEnabled: !turnNavigation.settings.soundEnabled, + } as TNSettingsState) + ) + } + > + {turnNavigation.settings.soundEnabled ? ( ) : ( diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 79bfef7f..74e9ba3b 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -69,23 +69,24 @@ function RoutingResult({ { // if this panel is still shown although we already confirmed the risk then we are waiting for GPS (or an error with location permission) turnNavigation.settings.acceptedRisk ? ( - {tr('waiting_for_gps')} - ) : ( -
    -
    {tr('warning')}
    - { - Dispatcher.dispatch( - new TurnNavigationSettingsUpdate({ acceptedRisk: true } as TNSettingsState) - ) - if (turnNavigation.settings.fakeGPS) getTurnNavigationStore().initFake() - else getTurnNavigationStore().initReal() - }} - > - {tr('accept_risks_after_warning')} - -
    - )} + {tr('waiting_for_gps')} + ) : ( +
    +
    {tr('warning')}
    + { + Dispatcher.dispatch( + new TurnNavigationSettingsUpdate({ acceptedRisk: true } as TNSettingsState) + ) + if (turnNavigation.settings.fakeGPS) getTurnNavigationStore().initFake() + else getTurnNavigationStore().initReal() + }} + > + {tr('accept_risks_after_warning')} + +
    + ) + } { diff --git a/src/stores/SettingsStore.ts b/src/stores/SettingsStore.ts index d311efaa..10c74293 100644 --- a/src/stores/SettingsStore.ts +++ b/src/stores/SettingsStore.ts @@ -1,6 +1,6 @@ import Store from '@/stores/Store' import { Action } from '@/stores/Dispatcher' -import { ToggleDistanceUnits, TurnNavigationSettingsUpdate } from '@/actions/Actions' +import { ToggleDistanceUnits } from '@/actions/Actions' export interface Settings { showDistanceInMiles: boolean diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 9bd14748..e5390bd3 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -195,7 +195,7 @@ export default class TurnNavigationStore extends Store if (result.paths.length > 0) { console.log('rerouted:' + state.activePath?.distance + '->' + result.paths[0].distance) Dispatcher.dispatch(new TurnNavigationRerouting(result.paths[0])) - this.speechSynthesizer.synthesize(tr('reroute')) + this.synthesize(tr('reroute')) } else { console.log('rerouting found no path: {}', result) Dispatcher.dispatch(new TurnNavigationReroutingFailed()) @@ -235,7 +235,7 @@ export default class TurnNavigationStore extends Store instr.distanceToTurn <= lastAnnounceDistance && (instructionState.distanceToTurn > lastAnnounceDistance || instr.index != instructionState.index) ) { - this.speechSynthesizer.synthesize(nextInstruction.text) + this.synthesize(nextInstruction.text) } const firstAnnounceDistance = 1150 @@ -249,7 +249,7 @@ export default class TurnNavigationStore extends Store instr.distanceToTurn > 800 ? tr('in_km_singular') : tr('in_m', ['' + Math.round(instr.distanceToTurn / 100) * 100]) - this.speechSynthesizer.synthesize(inString + ' ' + nextInstruction.text) + this.synthesize(inString + ' ' + nextInstruction.text) } } @@ -322,6 +322,10 @@ export default class TurnNavigationStore extends Store return state } + private synthesize(text: string) { + if (this.state.settings.soundEnabled) this.speechSynthesizer.synthesize(text) + } + private static getWaypoint(path: Path, nextWaypointIndex: number): Coordinate { return { lng: path.snapped_waypoints.coordinates[nextWaypointIndex][0], From 80fb4fe702a98d7d4a3830b30b56ca0350ce2ce9 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 6 Nov 2022 21:09:12 +0100 Subject: [PATCH 156/322] critical order change to make context menu working again when navi was clicked --- src/App.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index f5b045fd..0595eb15 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -238,6 +238,9 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, turnNav if (turnNavigation.enabled) return ( <> +
    + +
    @@ -259,9 +262,6 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, turnNav )}
    -
    - -
    ) From c566f5be2c8914fb441355341784ad824afddb4e Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 7 Nov 2022 08:35:48 +0100 Subject: [PATCH 157/322] less fluctuation in fake mode --- src/stores/TurnNavigationStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index e5390bd3..38fe98a8 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -370,7 +370,7 @@ export default class TurnNavigationStore extends Store for (let idx = 0; idx < coords.length; idx++) { // very ugly: in JS the random object cannot be initialed with a seed - const lat = coords[idx][1] + 0.0007 * Math.random() // approx +-5m ? + const lat = coords[idx][1] + 0.0001 * Math.random() // approx +-5m ? const lon = coords[idx][0] + 0.0001 * Math.random() let heading = 0 if (idx > 0) { From c44b2d1cf1a27d69316d0b7098b739548bd368d5 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 11 Nov 2022 12:42:33 +0100 Subject: [PATCH 158/322] make end navigation icon larger --- src/turnNavigation/TurnNavigation.module.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 31a05945..6a3b90d6 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -51,13 +51,13 @@ } .thirdCol { - width: 20px; - height: 20px; + width: 30px; + height: 30px; } .thirdCol svg { - width: 20px; - height: 20px; + width: 30px; + height: 30px; padding-left: 0; padding-right: 0; } From c2d2f93b3167a4889cec8bbcf97815e65f7590f9 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 12 Nov 2022 20:52:44 +0100 Subject: [PATCH 159/322] translate start navi button --- src/sidebar/RoutingResults.tsx | 2 +- src/translation/tr.json | 235 ++++++++++++++++++++------------- 2 files changed, 141 insertions(+), 96 deletions(-) diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 382fa449..43353afa 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -136,7 +136,7 @@ function RoutingResult({ }} > -
    {tr('Navi')}
    +
    {tr('navigation_start')}
    )} {isSelected && !showBackAndRisk && ( diff --git a/src/translation/tr.json b/src/translation/tr.json index a218d498..08aaea34 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -80,7 +80,8 @@ "in_ft":"In %1$s feet", "for_mi":"for %1$s miles", "warning":"WARNING: This application is highly experimental! Use at your own risk!", -"accept_risks_after_warning":"I understand and agree" +"accept_risks_after_warning":"I understand and agree", +"start_navigation":"Start" }, "ar":{ "total_ascend":"%1$s اجمالى صعود", @@ -164,7 +165,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "ast":{ "total_ascend":"%1$s d'ascensu total", @@ -248,7 +250,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "az":{ "total_ascend":"%1$s yüksəliş", @@ -332,7 +335,8 @@ "in_ft":"%1$s futda", "for_mi":"%1$s mildə", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "bg":{ "total_ascend":"%1$s общо изкачване", @@ -416,7 +420,8 @@ "in_ft":"След %1$s фута", "for_mi":"за %1$s мили", "warning":"Внимание: Приложението е експериментално! Използвайте на свой риск!", -"accept_risks_after_warning":"Разбирам и се съгласявам" +"accept_risks_after_warning":"Разбирам и се съгласявам", +"start_navigation":"" }, "bn_BN":{ "total_ascend":"", @@ -500,7 +505,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "ca":{ "total_ascend":"%1$s de pujada total", @@ -584,7 +590,8 @@ "in_ft":"En %1$s peus", "for_mi":"per %1$s milles", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "cs_CZ":{ "total_ascend":"Celkové stoupání %1$s", @@ -668,7 +675,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "da_DK":{ "total_ascend":"%1$s samlet stigning", @@ -752,7 +760,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "de_DE":{ "total_ascend":"%1$s Gesamtaufstieg", @@ -836,7 +845,8 @@ "in_ft":"In %1$s Fuß", "for_mi":"für %1$s Meilen", "warning":"Achtung: diese Applikation ist experimentell! Benutzung auf eigene Gefahr!", -"accept_risks_after_warning":"I verstehe und akzeptiere das Risiko" +"accept_risks_after_warning":"I verstehe und akzeptiere das Risiko", +"start_navigation":"Navi" }, "el":{ "total_ascend":"%1$s συνολική ανάβαση", @@ -920,7 +930,8 @@ "in_ft":"Σε %1$s πόδια", "for_mi":"για %1$s μίλια", "warning":"ΠΡΟΣΟΧΗ: Αυτή η εφαρμογή είναι πειραματική! Χρησιμοποιήστε την με δική σας ευθύνη!", -"accept_risks_after_warning":"Καταλαβαίνω και συμφωνώ" +"accept_risks_after_warning":"Καταλαβαίνω και συμφωνώ", +"start_navigation":"" }, "eo":{ "total_ascend":"%1$s supreniro tute", @@ -1004,7 +1015,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "es":{ "total_ascend":"Ascender %1$s en total", @@ -1088,7 +1100,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "fa":{ "total_ascend":"مجموع صعود %1$s", @@ -1172,7 +1185,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "fil":{ "total_ascend":"", @@ -1256,7 +1270,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "fi":{ "total_ascend":"nousu yhteensä %1$s", @@ -1340,7 +1355,8 @@ "in_ft":"%1$s jalan päässä", "for_mi":"kulje %1$s mailia", "warning":"VAROITUS: Tämä sovellus on erittäin kokeellinen! Käytä omalla vastuullasi!", -"accept_risks_after_warning":"Ymmärrän ja hyväksyn" +"accept_risks_after_warning":"Ymmärrän ja hyväksyn", +"start_navigation":"" }, "fr_FR":{ "total_ascend":"%1$s de dénivelé positif", @@ -1424,7 +1440,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "fr_CH":{ "total_ascend":"%1$s de dénivelé positif", @@ -1508,7 +1525,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "gl":{ "total_ascend":"", @@ -1592,7 +1610,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "he":{ "total_ascend":"עלייה כוללת של %1$s", @@ -1676,7 +1695,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "hr_HR":{ "total_ascend":"%1$s ukupni uspon", @@ -1760,7 +1780,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "hsb":{ "total_ascend":"", @@ -1844,7 +1865,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "hu_HU":{ "total_ascend":"Összes szintemelkedés: %1$s", @@ -1928,7 +1950,8 @@ "in_ft":"", "for_mi":"", "warning":"FIGYELEM! Ez az alkalmazás erősen kísérleti jellegű. Használat csak saját felelősségre!", -"accept_risks_after_warning":"Megértettem és elfogadom" +"accept_risks_after_warning":"Megértettem és elfogadom", +"start_navigation":"" }, "in_ID":{ "total_ascend":"naik dengan jarak %1$s", @@ -2012,7 +2035,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "it":{ "total_ascend":"%1$s di dislivello positivo", @@ -2096,7 +2120,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "ja":{ "total_ascend":"", @@ -2180,7 +2205,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "ko":{ "total_ascend":"오르막길 총 %1$s", @@ -2264,7 +2290,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "lt_LT":{ "total_ascend":"", @@ -2348,7 +2375,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "ne":{ "total_ascend":"", @@ -2432,7 +2460,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "nl":{ "total_ascend":"%1$s totale klim", @@ -2516,7 +2545,8 @@ "in_ft":"Over %1$s voet", "for_mi":"Voor %1$s mijl", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "pl_PL":{ "total_ascend":"%1$s podejść ogółem", @@ -2600,7 +2630,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "pt_BR":{ "total_ascend":"subida de %1$s", @@ -2684,7 +2715,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "pt_PT":{ "total_ascend":"subida de %1$s", @@ -2768,7 +2800,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "ro":{ "total_ascend":"urcare %1$s", @@ -2852,7 +2885,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "ru":{ "total_ascend":"подъём на %1$s", @@ -2936,7 +2970,8 @@ "in_ft":"В %1$s футах", "for_mi":"В %1$s милях", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "sk":{ "total_ascend":"%1$s celkové stúpanie", @@ -3020,7 +3055,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "sl_SI":{ "total_ascend":"Skupni vzpon: %1$s", @@ -3104,7 +3140,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "sr_RS":{ "total_ascend":"%1$s ukupni uspon", @@ -3188,7 +3225,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "sv_SE":{ "total_ascend":"%1$s stigning", @@ -3272,7 +3310,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "tr":{ "total_ascend":"%1$s toplam tırmanış", @@ -3356,7 +3395,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "uk":{ "total_ascend":"%1$s загалом підйому", @@ -3440,7 +3480,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "vi_VN":{ "total_ascend":"Đi tiếp %1$s nữa", @@ -3524,19 +3565,20 @@ "in_ft":"Trong %1$s ft", "for_mi":"Khoảng %1$s dặm", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "zh_CN":{ -"total_ascend":"总上升%1$s", -"total_descend":"总下降%1$s", +"total_ascend":"总上升 %1$s", +"total_descend":"总下降 %1$s", "way_contains_ford":"路径中包含河滩", -"way_contains_ferry":"", -"way_contains_private":"", -"way_contains_toll":"", -"way_crosses_border":"", -"way_contains":"", -"tracks":"", -"steps":"", +"way_contains_ferry":"路径中包含轮渡", +"way_contains_private":"路径中包含私有道路", +"way_contains_toll":"路径中包含收费路段", +"way_crosses_border":"路径中跨越了国界", +"way_contains":"路径中包含%1$s", +"tracks":"未铺设的土路", +"steps":"台阶", "start_label":"起点", "intermediate_label":"途经点", "end_label":"终点", @@ -3545,70 +3587,71 @@ "set_end":"设置为终点", "center_map":"地图居中到这里", "show_coords":"显示坐标", -"query_osm":"", +"query_osm":"查询 OSM", "route":"路线", -"add_to_route":"", +"add_to_route":"增加位置", "delete_from_route":"从线路中移除", -"open_custom_model_box":"", -"help_custom_model":"", -"apply_custom_model":"", -"exclude_motorway_example":"", -"limit_speed_example":"", -"exclude_area_example":"", -"combined_example":"", -"examples_custom_model":"", +"open_custom_model_box":"打开自定义模型选项", +"help_custom_model":"帮助", +"apply_custom_model":"应用", +"exclude_motorway_example":"排除高速公路", +"limit_speed_example":"限速", +"exclude_area_example":"排除区域", +"combined_example":"综合范例", +"examples_custom_model":"范例", "marker":"标记", -"gh_offline_info":"无法链接GraphHopper API", +"gh_offline_info":"无法连接 GraphHopper API", "refresh_button":"刷新网页", "server_status":"状态", "zoom_in":"放大", "zoom_out":"缩小", "drag_to_reorder":"拖动可重新排序", -"route_timed_out":"", -"route_request_failed":"", -"current_location":"", -"searching_location":"", -"searching_location_failed":"", +"route_timed_out":"导航计算超时", +"route_request_failed":"导航请求失败", +"current_location":"当前位置", +"searching_location":"正在搜索位置", +"searching_location_failed":"搜索位置失败", "via_hint":"途经点", "from_hint":"起点", -"gpx_export_button":"GPX导出", -"gpx_button":"", -"hide_button":"", -"details_button":"", +"gpx_export_button":"GPX 格式导出", +"gpx_button":"GPX", +"hide_button":"隐藏", +"details_button":"详情", "to_hint":"终点", -"route_info":"%1$s 的路线,需要 %2$s 时间", +"route_info":"%1$s 的路线,需要 %2$s", "search_button":"搜索", "more_button":"更多", -"pt_route_info":"", -"pt_route_info_walking":"步行(%2$s), %1$s到达", -"locations_not_found":"地点未找到", -"search_with_nominatim":"", -"powered_by":"", +"pt_route_info":"换乘 %2$s 次,在 %1$s 到达 (%3$s)", +"pt_route_info_walking":"仅需步行,在 %1$s 到达 (%2$s)", +"locations_not_found":"无法导航,因为地点未找到。", +"search_with_nominatim":"用 Nominatim 搜索", +"powered_by":"Powered by", "bike":"自行车", "racingbike":"竞技自行车", "mtb":"山地自行车", "car":"驾车", "foot":"步行", "hike":"徒步", -"small_truck":"小火车", +"small_truck":"小货车", "bus":"公交车", "truck":"卡车", -"staticlink":"静态链接", +"staticlink":"永久链接", "motorcycle":"摩托车", -"back_to_map":"", -"distance_unit":"", -"waiting_for_gps":"", -"in_km_singular":"", -"in_km":"", -"in_m":"", -"for_km":"", -"then":"", -"in_mi_singular":"", -"in_mi":"", -"in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"" +"back_to_map":"返回", +"distance_unit":"距离单位:%1$s", +"waiting_for_gps":"正在搜索 GPS 信号……", +"in_km_singular":"1km 后", +"in_km":"%1$skm 后", +"in_m":"%1$sm 后", +"for_km":"行驶 %1$skm", +"then":"然后", +"in_mi_singular":"1 英里后", +"in_mi":"%1$s 英里后", +"in_ft":"%1$s 英尺后", +"for_mi":"行驶 %1$s 英里", +"warning":"警告:该应用程序处于早期实验阶段,使用时风险自负!", +"accept_risks_after_warning":"我理解并同意", +"start_navigation":"" }, "zh_HK":{ "total_ascend":"總共上昇 %1$s", @@ -3692,7 +3735,8 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }, "zh_TW":{ "total_ascend":"總共上昇 %1$s", @@ -3776,5 +3820,6 @@ "in_ft":"", "for_mi":"", "warning":"", -"accept_risks_after_warning":"" +"accept_risks_after_warning":"", +"start_navigation":"" }} \ No newline at end of file From 5b1ab86e771378cad63ad3403183486d4692cecc Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 12 Nov 2022 21:20:44 +0100 Subject: [PATCH 160/322] cleanup and switch layer to vector tiles when starting navigation --- src/actions/Actions.ts | 2 ++ src/custom.d.ts | 1 + src/index.tsx | 2 +- src/sidebar/RoutingResults.tsx | 26 +++++++++++++-------- src/stores/TurnNavigationStore.ts | 33 +++++++++++++++------------ src/turnNavigation/TurnNavigation.tsx | 3 ++- 6 files changed, 42 insertions(+), 25 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 57d5cc2c..1c1b4857 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -14,6 +14,8 @@ export class InfoReceived implements Action { export class TurnNavigationStop implements Action {} +export class TurnNavigationStart implements Action {} + export class LocationUpdate implements Action { readonly coordinate: Coordinate readonly speed: number diff --git a/src/custom.d.ts b/src/custom.d.ts index 86c2bdea..8f55bbf5 100644 --- a/src/custom.d.ts +++ b/src/custom.d.ts @@ -7,6 +7,7 @@ declare module 'custom-model-editor/src/index' declare module 'config' { const api: string const defaultTiles: string + const navigationTiles: string const keys: { graphhopper: string omniscale: string diff --git a/src/index.tsx b/src/index.tsx index b706506f..cc2b08e7 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -25,7 +25,7 @@ import { setStores, } from '@/stores/Stores' import MapOptionsStore from '@/stores/MapOptionsStore' -import TurnNavigationStore, { TNSettingsState } from '@/stores/TurnNavigationStore' +import TurnNavigationStore from '@/stores/TurnNavigationStore' import PathDetailsStore from '@/stores/PathDetailsStore' import Dispatcher from '@/stores/Dispatcher' import NavBar from '@/NavBar' diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 43353afa..8883c7a5 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -3,7 +3,13 @@ import { CurrentRequest, RequestState, SubRequest } from '@/stores/QueryStore' import styles from './RoutingResult.module.css' import React, { useContext, useEffect, useState } from 'react' import Dispatcher from '@/stores/Dispatcher' -import { SetSelectedPath, TurnNavigationSettingsUpdate, TurnNavigationStop } from '@/actions/Actions' +import { + SelectMapLayer, + SetSelectedPath, + TurnNavigationSettingsUpdate, + TurnNavigationStart, + TurnNavigationStop +} from '@/actions/Actions' import { metersToSimpleText, metersToText, milliSecondsToText } from '@/Converters' import PlainButton from '@/PlainButton' import Details from '@/sidebar/list.svg' @@ -15,9 +21,9 @@ import { useMediaQuery } from 'react-responsive' import { tr } from '@/translation/Translation' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import { ApiImpl } from '@/api/Api' -import { getTurnNavigationStore } from '@/stores/Stores' import { TNSettingsState, TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import Cross from '@/sidebar/times-solid.svg' +import * as config from 'config' export interface RoutingResultsProps { paths: Path[] @@ -78,8 +84,7 @@ function RoutingResult({ Dispatcher.dispatch( new TurnNavigationSettingsUpdate({ acceptedRisk: true } as TNSettingsState) ) - if (turnNavigation.settings.fakeGPS) getTurnNavigationStore().initFake() - else getTurnNavigationStore().initReal() + startNavigation() }} > {tr('accept_risks_after_warning')} @@ -91,6 +96,7 @@ function RoutingResult({ className={styles.showRiskBack} onClick={() => { setShowBackAndRisk(false) + Dispatcher.dispatch(new SelectMapLayer(turnNavigation.oldTiles)) Dispatcher.dispatch(new TurnNavigationStop()) }} > @@ -129,14 +135,11 @@ function RoutingResult({ className={styles.exportButton} onClick={() => { setShowBackAndRisk(true) - if (turnNavigation.settings.acceptedRisk) { - if (turnNavigation.settings.fakeGPS) getTurnNavigationStore().initFake() - else getTurnNavigationStore().initReal() - } + if (turnNavigation.settings.acceptedRisk) startNavigation() }} > -
    {tr('navigation_start')}
    +
    {tr('start_navigation')}
    )} {isSelected && !showBackAndRisk && ( @@ -174,6 +177,11 @@ function RoutingResult({ ) } +function startNavigation() { + Dispatcher.dispatch(new TurnNavigationStart()) + Dispatcher.dispatch(new SelectMapLayer(config.navigationTiles)) +} + function containsBadTracks(details: [number, number, string][]) { if (!details) return false for (const i in details) { diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 40573751..e3c1a364 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -3,12 +3,12 @@ import Store from '@/stores/Store' import { ErrorAction, LocationUpdate, - SetQueryPoints, + SelectMapLayer, SetSelectedPath, SetVehicleProfile, TurnNavigationRerouting, TurnNavigationReroutingFailed, - TurnNavigationSettingsUpdate, + TurnNavigationSettingsUpdate, TurnNavigationStart, TurnNavigationStop, ZoomMapToPoint, } from '@/actions/Actions' @@ -27,10 +27,12 @@ import * as config from 'config' import { Instruction, Path, RoutingArgs } from '@/api/graphhopper' import { tr } from '@/translation/Translation' import { SpeechSynthesizer } from '@/SpeechSynthesizer' +import {getTurnNavigationStore} from "@/stores/Stores"; export interface TurnNavigationStoreState { // TODO replace "enabled" with a composite state depending on activePath, coordinate and instruction enabled: boolean + oldTiles: string coordinate: Coordinate speed: number heading: number @@ -73,11 +75,11 @@ export default class TurnNavigationStore extends Store private interval: any private noSleep: any private readonly speechSynthesizer: SpeechSynthesizer - private started: boolean = false constructor(api: Api, speechSynthesizer: SpeechSynthesizer, fakeGPS: boolean) { super({ enabled: false, + oldTiles: '', coordinate: { lat: 0, lng: 0 }, speed: 0, heading: 0, @@ -93,10 +95,6 @@ export default class TurnNavigationStore extends Store this.speechSynthesizer = speechSynthesizer } - public getSpeechSynthesizer(): SpeechSynthesizer { - return this.speechSynthesizer - } - reduce(state: TurnNavigationStoreState, action: Action): TurnNavigationStoreState { // For the navigation we need: // current location (frequently updated), the active path (updated on reroute) and the profile (required for rerouting) @@ -105,7 +103,17 @@ export default class TurnNavigationStore extends Store this.stop() return { ...state, enabled: false, speed: 0, heading: 0 } } else if (action instanceof TurnNavigationSettingsUpdate) { - return { ...state, settings: { ...state.settings, ...action.settings } } + return {...state, settings: {...state.settings, ...action.settings}} + } else if (action instanceof TurnNavigationStart) { + if (state.settings.fakeGPS) this.initFake() + else this.initReal() + return { ...state, enabled: true } + } else if (action instanceof SelectMapLayer) { + if(!this.state.enabled) + return { + ...state, + oldTiles: action.layer + } } else if (action instanceof TurnNavigationReroutingFailed) { console.log('TurnNavigationReroutingFailed') return { @@ -340,9 +348,8 @@ export default class TurnNavigationStore extends Store return prevStateDistanceToWaypoint < 80 && straightDistToWaypoint < 80 } - public async initFake() { + private async initFake() { console.log('started fake GPS injection') - this.started = true // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car&layer=MapTiler&fake=true let api = new ApiImpl(config.api, config.keys.graphhopper) @@ -407,8 +414,7 @@ export default class TurnNavigationStore extends Store Dispatcher.dispatch(new LocationUpdate(c, pos.coords.speed, pos.coords.heading ? pos.coords.heading : 0)) } - public initReal() { - this.started = true + private initReal() { if (!this.noSleep) this.noSleep = new NoSleep() this.noSleep.enable() if (!navigator.geolocation) { @@ -431,7 +437,7 @@ export default class TurnNavigationStore extends Store err => { // TODO exit fullscreen does not work // Dispatcher.dispatch(new TurnNavigationStop()) - if (this.started) Dispatcher.dispatch(new ErrorAction('location watch error: ' + err.message)) + if (this.state.enabled) Dispatcher.dispatch(new ErrorAction('location watch error: ' + err.message)) }, { timeout: 300_000, @@ -446,7 +452,6 @@ export default class TurnNavigationStore extends Store // console.log('LocationStore.stop', this.watchId, this.interval) if (document.fullscreenElement) document.exitFullscreen() - this.started = false if (this.interval) clearInterval(this.interval) if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 8aa9ca74..11c0c420 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -5,7 +5,7 @@ import styles from '@/turnNavigation/TurnNavigation.module.css' import EndNavigation from '@/sidebar/times-solid.svg' import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import Dispatcher from '@/stores/Dispatcher' -import { TurnNavigationStop, ZoomMapToPoint } from '@/actions/Actions' +import {SelectMapLayer, TurnNavigationStop, ZoomMapToPoint} from '@/actions/Actions' import PlainButton from '@/PlainButton' export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { @@ -68,6 +68,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto { + Dispatcher.dispatch(new SelectMapLayer(turnNavigation.oldTiles)) Dispatcher.dispatch(new TurnNavigationStop()) Dispatcher.dispatch(new ZoomMapToPoint(turnNavigation.coordinate, 15, 0, false, 0)) }} From 57622d3479ee5ea6f869851eeb236d52dbaab3af Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 13 Nov 2022 10:45:33 +0100 Subject: [PATCH 161/322] show intermediate UI if waiting for GPS --- src/App.tsx | 4 ++-- src/layers/UsePathsLayer.tsx | 4 ++-- src/stores/TurnNavigationStore.ts | 23 ++++++++++++----------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 0595eb15..3ec94cbd 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -160,7 +160,7 @@ interface LayoutProps { } function LargeScreenLayout({ query, route, map, error, mapOptions, info, turnNavigation }: LayoutProps) { - if (turnNavigation.enabled) + if (turnNavigation.showUI) return ( <>
    @@ -235,7 +235,7 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, info, turnNav } function SmallScreenLayout({ query, route, map, error, mapOptions, info, turnNavigation }: LayoutProps) { - if (turnNavigation.enabled) + if (turnNavigation.showUI) return ( <>
    diff --git a/src/layers/UsePathsLayer.tsx b/src/layers/UsePathsLayer.tsx index c7a6f97d..ca44fb9c 100644 --- a/src/layers/UsePathsLayer.tsx +++ b/src/layers/UsePathsLayer.tsx @@ -21,7 +21,7 @@ const selectedPathLayerKey = 'selectedPathLayer' export default function usePathsLayer(map: Map, route: RouteStoreState, turnNavigation: TurnNavigationStoreState) { useEffect(() => { removeCurrentPathLayers(map) - if (turnNavigation.enabled && turnNavigation.activePath != null) { + if (turnNavigation.showUI && turnNavigation.activePath != null) { addSelectedPathsLayer(map, turnNavigation.activePath) } else { addUnselectedPathsLayer( @@ -33,7 +33,7 @@ export default function usePathsLayer(map: Map, route: RouteStoreState, turnNavi return () => { removeCurrentPathLayers(map) } - }, [map, route.routingResult.paths, route.selectedPath, turnNavigation.enabled, turnNavigation.activePath]) + }, [map, route.routingResult.paths, route.selectedPath, turnNavigation.showUI, turnNavigation.activePath]) } function removeCurrentPathLayers(map: Map) { diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index e3c1a364..1e8983e7 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -27,11 +27,11 @@ import * as config from 'config' import { Instruction, Path, RoutingArgs } from '@/api/graphhopper' import { tr } from '@/translation/Translation' import { SpeechSynthesizer } from '@/SpeechSynthesizer' -import {getTurnNavigationStore} from "@/stores/Stores"; export interface TurnNavigationStoreState { - // TODO replace "enabled" with a composite state depending on activePath, coordinate and instruction - enabled: boolean + // TODO replace "showUI" with a composite state depending on activePath, coordinate and instruction + showUI: boolean + started: boolean oldTiles: string coordinate: Coordinate speed: number @@ -78,7 +78,8 @@ export default class TurnNavigationStore extends Store constructor(api: Api, speechSynthesizer: SpeechSynthesizer, fakeGPS: boolean) { super({ - enabled: false, + showUI: false, + started: false, oldTiles: '', coordinate: { lat: 0, lng: 0 }, speed: 0, @@ -101,15 +102,15 @@ export default class TurnNavigationStore extends Store // and so we collect this from different actions if (action instanceof TurnNavigationStop) { this.stop() - return { ...state, enabled: false, speed: 0, heading: 0 } + return { ...state, showUI: false, started: false, speed: 0, heading: 0 } } else if (action instanceof TurnNavigationSettingsUpdate) { return {...state, settings: {...state.settings, ...action.settings}} } else if (action instanceof TurnNavigationStart) { if (state.settings.fakeGPS) this.initFake() else this.initReal() - return { ...state, enabled: true } + return { ...state, started: true } } else if (action instanceof SelectMapLayer) { - if(!this.state.enabled) + if(!this.state.started) return { ...state, oldTiles: action.layer @@ -128,7 +129,7 @@ export default class TurnNavigationStore extends Store } } else if (action instanceof SetSelectedPath) { // no need to update instruction as changing the path should happen only outside of the navigation - if (state.enabled) throw new Error('Changing path while turn navigation should not happen') + if (state.showUI) throw new Error('Changing path while turn navigation should not happen') return { ...state, @@ -175,7 +176,7 @@ export default class TurnNavigationStore extends Store } // reroute only if already in turn navigation mode otherwise UI is not ready - if (state.enabled && (instr.distanceToRoute > 50 || skipWaypoint)) { + if (state.showUI && (instr.distanceToRoute > 50 || skipWaypoint)) { let queriedAPI = false if (state.activeProfile && !state.rerouteInProgress) { const toCoordinate = TurnNavigationStore.getWaypoint(path, instr.nextWaypointIndex) @@ -264,7 +265,7 @@ export default class TurnNavigationStore extends Store return { ...state, - enabled: true, + showUI: true, heading: action.heading, speed: action.speed, coordinate: coordinate, @@ -437,7 +438,7 @@ export default class TurnNavigationStore extends Store err => { // TODO exit fullscreen does not work // Dispatcher.dispatch(new TurnNavigationStop()) - if (this.state.enabled) Dispatcher.dispatch(new ErrorAction('location watch error: ' + err.message)) + if (this.state.started) Dispatcher.dispatch(new ErrorAction('location watch error: ' + err.message)) }, { timeout: 300_000, From 0aab99aca230f8555af660b3487200fbeae8546a Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 13 Nov 2022 11:30:08 +0100 Subject: [PATCH 162/322] do fullscreen only for small screens --- src/actions/Actions.ts | 8 +++++++- src/index.tsx | 2 +- src/sidebar/RoutingResults.tsx | 14 +++++++++----- src/stores/TurnNavigationStore.ts | 28 ++++++++++++++------------- src/turnNavigation/TurnNavigation.tsx | 2 +- 5 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 1c1b4857..ffb564f3 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -14,7 +14,13 @@ export class InfoReceived implements Action { export class TurnNavigationStop implements Action {} -export class TurnNavigationStart implements Action {} +export class TurnNavigationStart implements Action { + readonly enableFullscreen: boolean + + constructor(enableFullscreen: boolean) { + this.enableFullscreen = enableFullscreen + } +} export class LocationUpdate implements Action { readonly coordinate: Coordinate diff --git a/src/index.tsx b/src/index.tsx index cc2b08e7..2c5506f5 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -25,7 +25,7 @@ import { setStores, } from '@/stores/Stores' import MapOptionsStore from '@/stores/MapOptionsStore' -import TurnNavigationStore from '@/stores/TurnNavigationStore' +import TurnNavigationStore from '@/stores/TurnNavigationStore' import PathDetailsStore from '@/stores/PathDetailsStore' import Dispatcher from '@/stores/Dispatcher' import NavBar from '@/NavBar' diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 8883c7a5..f33a0ac8 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -8,7 +8,7 @@ import { SetSelectedPath, TurnNavigationSettingsUpdate, TurnNavigationStart, - TurnNavigationStop + TurnNavigationStop, } from '@/actions/Actions' import { metersToSimpleText, metersToText, milliSecondsToText } from '@/Converters' import PlainButton from '@/PlainButton' @@ -45,11 +45,13 @@ function RoutingResult({ path, isSelected, profile, + fullscreenForTN, turnNavigation, }: { path: Path isSelected: boolean profile: string + fullscreenForTN: boolean turnNavigation: TurnNavigationStoreState }) { const [isExpanded, setExpanded] = useState(false) @@ -84,7 +86,7 @@ function RoutingResult({ Dispatcher.dispatch( new TurnNavigationSettingsUpdate({ acceptedRisk: true } as TNSettingsState) ) - startNavigation() + startNavigation(fullscreenForTN) }} > {tr('accept_risks_after_warning')} @@ -135,7 +137,7 @@ function RoutingResult({ className={styles.exportButton} onClick={() => { setShowBackAndRisk(true) - if (turnNavigation.settings.acceptedRisk) startNavigation() + if (turnNavigation.settings.acceptedRisk) startNavigation(fullscreenForTN) }} > @@ -177,8 +179,8 @@ function RoutingResult({ ) } -function startNavigation() { - Dispatcher.dispatch(new TurnNavigationStart()) +function startNavigation(fullscreen: boolean) { + Dispatcher.dispatch(new TurnNavigationStart(fullscreen)) Dispatcher.dispatch(new SelectMapLayer(config.navigationTiles)) } @@ -296,6 +298,7 @@ function createSingletonListContent(props: RoutingResultsProps) { path={props.selectedPath} isSelected={true} profile={props.profile} + fullscreenForTN={true} turnNavigation={props.turnNavigation} /> ) @@ -315,6 +318,7 @@ function createListContent({ paths, currentRequest, selectedPath, profile, turnN path={paths[i]} isSelected={paths[i] === selectedPath} profile={profile} + fullscreenForTN={false} turnNavigation={turnNavigation} /> ) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 1e8983e7..6a8b8dfe 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -8,7 +8,8 @@ import { SetVehicleProfile, TurnNavigationRerouting, TurnNavigationReroutingFailed, - TurnNavigationSettingsUpdate, TurnNavigationStart, + TurnNavigationSettingsUpdate, + TurnNavigationStart, TurnNavigationStop, ZoomMapToPoint, } from '@/actions/Actions' @@ -104,16 +105,16 @@ export default class TurnNavigationStore extends Store this.stop() return { ...state, showUI: false, started: false, speed: 0, heading: 0 } } else if (action instanceof TurnNavigationSettingsUpdate) { - return {...state, settings: {...state.settings, ...action.settings}} + return { ...state, settings: { ...state.settings, ...action.settings } } } else if (action instanceof TurnNavigationStart) { if (state.settings.fakeGPS) this.initFake() - else this.initReal() + else this.initReal(action.enableFullscreen) return { ...state, started: true } } else if (action instanceof SelectMapLayer) { - if(!this.state.started) + if (!this.state.started) return { ...state, - oldTiles: action.layer + oldTiles: action.layer, } } else if (action instanceof TurnNavigationReroutingFailed) { console.log('TurnNavigationReroutingFailed') @@ -415,7 +416,7 @@ export default class TurnNavigationStore extends Store Dispatcher.dispatch(new LocationUpdate(c, pos.coords.speed, pos.coords.heading ? pos.coords.heading : 0)) } - private initReal() { + private initReal(doFullscreen: boolean) { if (!this.noSleep) this.noSleep = new NoSleep() this.noSleep.enable() if (!navigator.geolocation) { @@ -425,13 +426,14 @@ export default class TurnNavigationStore extends Store // force calling clearWatch can help to find GPS fix more reliable in android firefox if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) - try { - let el = document.documentElement - let requestFullscreenFct = el.requestFullscreen - requestFullscreenFct.call(el) - } catch (e) { - console.log('error requesting full screen ' + JSON.stringify(e)) - } + if (doFullscreen) + try { + let el = document.documentElement + let requestFullscreenFct = el.requestFullscreen + requestFullscreenFct.call(el) + } catch (e) { + console.log('error requesting full screen ' + JSON.stringify(e)) + } this.watchId = navigator.geolocation.watchPosition( this.locationUpdate, diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 11c0c420..6bf7c165 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -5,7 +5,7 @@ import styles from '@/turnNavigation/TurnNavigation.module.css' import EndNavigation from '@/sidebar/times-solid.svg' import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import Dispatcher from '@/stores/Dispatcher' -import {SelectMapLayer, TurnNavigationStop, ZoomMapToPoint} from '@/actions/Actions' +import { SelectMapLayer, TurnNavigationStop, ZoomMapToPoint } from '@/actions/Actions' import PlainButton from '@/PlainButton' export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { From b0910d1b80fbe16cbc86868814f50f66aa370f44 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 13 Nov 2022 14:17:51 +0100 Subject: [PATCH 163/322] set default layer to TNStore --- src/index.tsx | 4 ++-- src/stores/TurnNavigationStore.ts | 4 ++-- test/stores/TurnNavigationStore.test.ts | 2 +- webpack.common.js | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/index.tsx b/src/index.tsx index 2c5506f5..5bfb7c74 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -32,7 +32,6 @@ import NavBar from '@/NavBar' import App from '@/App' import { ErrorAction, InfoReceived } from '@/actions/Actions' -const speechSynthesizer = new SpeechSynthesizerImpl(navigator.language) console.log(`Source code: https://github.com/graphhopper/graphhopper-maps/tree/${GIT_SHA}`) const url = new URL(window.location.href) @@ -47,6 +46,7 @@ setApi(config.api, apiKey || '') const initialCustomModelStr = url.searchParams.get('custom_model') const queryStore = new QueryStore(getApi(), initialCustomModelStr) const routeStore = new RouteStore(queryStore) +const speechSynthesizer = new SpeechSynthesizerImpl(navigator.language) setStores({ settingsStore: new SettingsStore(), @@ -55,7 +55,7 @@ setStores({ infoStore: new ApiInfoStore(), errorStore: new ErrorStore(), mapOptionsStore: new MapOptionsStore(), - turnNavigationStore: new TurnNavigationStore(getApi(), speechSynthesizer, fake != null), + turnNavigationStore: new TurnNavigationStore(getApi(), speechSynthesizer, fake != null, config.defaultTiles), pathDetailsStore: new PathDetailsStore(), mapFeatureStore: new MapFeatureStore(), }) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 6a8b8dfe..c8ffadf8 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -77,11 +77,11 @@ export default class TurnNavigationStore extends Store private noSleep: any private readonly speechSynthesizer: SpeechSynthesizer - constructor(api: Api, speechSynthesizer: SpeechSynthesizer, fakeGPS: boolean) { + constructor(api: Api, speechSynthesizer: SpeechSynthesizer, fakeGPS: boolean, tiles: string) { super({ showUI: false, started: false, - oldTiles: '', + oldTiles: tiles, coordinate: { lat: 0, lng: 0 }, speed: 0, heading: 0, diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index 1c3ebb6a..381c14f0 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -218,7 +218,7 @@ describe('TurnNavigationStore', () => { }) function createStore(api: Api) { - const store = new TurnNavigationStore(api, new DummySpeech(), true) + const store = new TurnNavigationStore(api, new DummySpeech(), true, '') Dispatcher.register(store) return store } diff --git a/webpack.common.js b/webpack.common.js index b6c2c64b..572d6cd7 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -76,7 +76,7 @@ module.exports = { }, { test: /\.png$/i, - type: 'asset/inline', + type: 'asset', }, ], }, From 5bebfe2c68f3ede7e7cffe09cf7d6adda4f65fc4 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 13 Nov 2022 14:30:30 +0100 Subject: [PATCH 164/322] remove duplicate calcDist method --- src/distUtils.ts | 27 --------------------------- src/map/findNextWayPoint.ts | 2 +- src/pathDetails/PathDetails.tsx | 2 +- src/stores/QueryStore.ts | 2 +- src/stores/TurnNavigationStore.ts | 4 ++-- src/turnNavigation/GeoMethods.ts | 22 ++++++++++++++-------- 6 files changed, 19 insertions(+), 40 deletions(-) delete mode 100644 src/distUtils.ts diff --git a/src/distUtils.ts b/src/distUtils.ts deleted file mode 100644 index 3e8a8d3b..00000000 --- a/src/distUtils.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Coordinate } from '@/stores/QueryStore' - -/** - * Calculates the great-circle distance between two points on Earth given the latitudes and longitudes - * assuming that Earth is a sphere with radius 6371km. The result is returned in meters. - */ -export function calcDist(point1: Coordinate, point2: Coordinate): number { - const lat1 = point1.lat - const lat2 = point2.lat - const lon1 = point1.lng - const lon2 = point2.lng - const sinDeltaLat = Math.sin(toRad(lat2 - lat1) / 2) - const sinDeltaLon = Math.sin(toRad(lon2 - lon1) / 2) - return ( - 6371000 * - 2 * - Math.asin( - Math.sqrt( - sinDeltaLat * sinDeltaLat + sinDeltaLon * sinDeltaLon * Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) - ) - ) - ) -} - -export function toRad(deg: number): number { - return deg * 0.017453292519943295 -} diff --git a/src/map/findNextWayPoint.ts b/src/map/findNextWayPoint.ts index 3855e99f..6434f8d9 100644 --- a/src/map/findNextWayPoint.ts +++ b/src/map/findNextWayPoint.ts @@ -1,5 +1,5 @@ import { Coordinate } from '@/stores/QueryStore' -import { calcDist } from '@/distUtils' +import {calcDist} from "@/turnNavigation/GeoMethods"; /** * Finds the way-point that follows the part of a route that is closest to a given location diff --git a/src/pathDetails/PathDetails.tsx b/src/pathDetails/PathDetails.tsx index 5cdff25c..f2aa73c0 100644 --- a/src/pathDetails/PathDetails.tsx +++ b/src/pathDetails/PathDetails.tsx @@ -7,8 +7,8 @@ import Dispatcher from '@/stores/Dispatcher' import { PathDetailsElevationSelected, PathDetailsHover, PathDetailsRangeSelected } from '@/actions/Actions' import QueryStore, { Coordinate, QueryPointType } from '@/stores/QueryStore' import { Position } from 'geojson' -import { calcDist } from '@/distUtils' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' +import {calcDist} from "@/turnNavigation/GeoMethods"; interface PathDetailsProps { selectedPath: Path diff --git a/src/stores/QueryStore.ts b/src/stores/QueryStore.ts index 71a71a23..ff73c34d 100644 --- a/src/stores/QueryStore.ts +++ b/src/stores/QueryStore.ts @@ -19,7 +19,7 @@ import { SetVehicleProfile, } from '@/actions/Actions' import { RoutingArgs, RoutingProfile } from '@/api/graphhopper' -import { calcDist } from '@/distUtils' +import {calcDist} from "@/turnNavigation/GeoMethods"; export interface Coordinate { lat: number diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index c8ffadf8..fdef46ed 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -17,8 +17,8 @@ import Dispatcher, { Action } from '@/stores/Dispatcher' import NoSleep from 'nosleep.js' import Api, { ApiImpl } from '@/api/Api' import { + calcDist, calcOrientation, - distCalc, getCurrentDetails, getCurrentInstruction, toDegrees, @@ -345,7 +345,7 @@ export default class TurnNavigationStore extends Store ): boolean { // if waypoint reached use next waypoint as destination if (prevStateDistanceToWaypoint < 50) return true - const straightDistToWaypoint = distCalc(actionCoord.lat, actionCoord.lng, waypoint.lat, waypoint.lng) + const straightDistToWaypoint = calcDist(actionCoord, waypoint) if (straightDistToWaypoint < 50) return true return prevStateDistanceToWaypoint < 80 && straightDistToWaypoint < 80 } diff --git a/src/turnNavigation/GeoMethods.ts b/src/turnNavigation/GeoMethods.ts index 2d72de58..51c26515 100644 --- a/src/turnNavigation/GeoMethods.ts +++ b/src/turnNavigation/GeoMethods.ts @@ -1,6 +1,5 @@ import { Instruction, Path } from '@/api/graphhopper' import { Coordinate } from '@/stores/QueryStore' -import { or } from 'ol/format/filter' export function getCurrentDetails(path: Path, location: Coordinate, details: [any, any, any][][]): any[] { let smallestDist = Number.MAX_VALUE @@ -10,13 +9,13 @@ export function getCurrentDetails(path: Path, location: Coordinate, details: [an for (let pIdx = 0; pIdx < points.length; pIdx++) { const p: number[] = points[pIdx] let snapped = { lat: p[1], lng: p[0] } - let dist = distCalc(p[1], p[0], location.lat, location.lng) + let dist = calcDist(snapped, location) if (pIdx + 1 < points.length) { const next: number[] = points[pIdx + 1] if (validEdgeDistance(location.lat, location.lng, p[1], p[0], next[1], next[0])) { snapped = calcCrossingPointToEdge(location.lat, location.lng, p[1], p[0], next[1], next[0]) - dist = Math.min(dist, distCalc(snapped.lat, snapped.lng, location.lat, location.lng)) + dist = Math.min(dist, calcDist(snapped, location)) } } @@ -69,13 +68,13 @@ export function getCurrentInstruction( for (let pIdx = 0; pIdx < points.length; pIdx++) { const p: number[] = points[pIdx] let snapped = { lat: p[1], lng: p[0] } - let dist = distCalc(p[1], p[0], location.lat, location.lng) + let dist = calcDist(snapped, location) // calculate the snapped point, TODO use first point of next instruction for "next" if last point of current instruction if (pIdx + 1 < points.length) { const next: number[] = points[pIdx + 1] if (validEdgeDistance(location.lat, location.lng, p[1], p[0], next[1], next[0])) { snapped = calcCrossingPointToEdge(location.lat, location.lng, p[1], p[0], next[1], next[0]) - dist = Math.min(dist, distCalc(snapped.lat, snapped.lng, location.lat, location.lng)) + dist = Math.min(dist, calcDist(snapped, location)) } } @@ -84,7 +83,7 @@ export function getCurrentInstruction( // use next instruction or finish instructionIndex = instrIdx + 1 < instructions.length ? instrIdx + 1 : instrIdx const last: number[] = points[points.length - 1] - distanceToTurn = Math.round(distCalc(last[1], last[0], snapped.lat, snapped.lng)) + distanceToTurn = Math.round(calcDist({ lat: last[1], lng: last[0] }, snapped)) nextWaypointIndex = waypointIndex + 1 } } @@ -125,8 +124,15 @@ export function getCurrentInstruction( } } -// TODO NOW merge with distUtils.calcDist -export function distCalc(fromLat: number, fromLng: number, toLat: number, toLng: number): number { +/** + * Calculates the great-circle distance between two points on Earth given the latitudes and longitudes + * assuming that Earth is a sphere with radius 6371km. The result is returned in meters. + */ +export function calcDist(point1: Coordinate, point2: Coordinate): number { + const fromLat = point1.lat + const toLat = point2.lat + const fromLng = point1.lng + const toLng = point2.lng const sinDeltaLat: number = Math.sin(toRadians(toLat - fromLat) / 2) const sinDeltaLon: number = Math.sin(toRadians(toLng - fromLng) / 2) const normedDist: number = From fa60efe3e1a168761a529e18ca7ddfadcfbe378f Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 13 Nov 2022 14:36:40 +0100 Subject: [PATCH 165/322] more space for route result buttons --- src/sidebar/RoutingResult.module.css | 2 +- src/translation/tr.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sidebar/RoutingResult.module.css b/src/sidebar/RoutingResult.module.css index c8b1160a..50e05a64 100644 --- a/src/sidebar/RoutingResult.module.css +++ b/src/sidebar/RoutingResult.module.css @@ -28,7 +28,7 @@ .resultValues { cursor: pointer; - width: 50%; + width: 40%; display: flex; flex-direction: column; diff --git a/src/translation/tr.json b/src/translation/tr.json index 08aaea34..c602bc6e 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -81,7 +81,7 @@ "for_mi":"for %1$s miles", "warning":"WARNING: This application is highly experimental! Use at your own risk!", "accept_risks_after_warning":"I understand and agree", -"start_navigation":"Start" +"start_navigation":"Navigate" }, "ar":{ "total_ascend":"%1$s اجمالى صعود", From 1b6a439a1c25870fa5accf55236705f0bdc7fe04 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 21 Nov 2022 20:48:52 +0100 Subject: [PATCH 166/322] fix css (why is important necessary?); allow zoom but remove while navigation --- src/map/Map.module.css | 6 +++--- src/map/map.ts | 5 ++++- src/stores/MapActionReceiver.ts | 16 +++++++++++++++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/map/Map.module.css b/src/map/Map.module.css index e39e4ad3..6b1038e6 100644 --- a/src/map/Map.module.css +++ b/src/map/Map.module.css @@ -17,7 +17,7 @@ left: 0; bottom: 0; padding: 1px 5px; - background-color: rgba(255, 255, 255, 0.8); + background-color: rgba(255, 255, 255, 0.8) !important; border-radius: 0 4px 0 0; } @@ -32,5 +32,5 @@ } .customAttribution button { - display: none; -} + display: none !important; +} \ No newline at end of file diff --git a/src/map/map.ts b/src/map/map.ts index 10f23f0c..70a9cbf2 100644 --- a/src/map/map.ts +++ b/src/map/map.ts @@ -17,8 +17,11 @@ export function createMap(): Map { zoom: 2, }), controls: defaultControls({ - zoom: false, // zoom control is nice but currently overlaps with sound button rotate: false, // for now also disable this extra button + zoom: true, + zoomOptions: { + className: styles.customZoom + }, attribution: true, attributionOptions: { className: styles.customAttribution, diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 7be5158c..3d3fd62d 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -6,17 +6,19 @@ import { PathDetailsRangeSelected, RouteRequestSuccess, SetInitialBBox, - SetSelectedPath, + SetSelectedPath, TurnNavigationStart, TurnNavigationStop, ZoomMapToPoint, } from '@/actions/Actions' import RouteStore from '@/stores/RouteStore' import { Bbox } from '@/api/graphhopper' import { toRadians } from 'ol/math' +import {Zoom} from "ol/control"; export default class MapActionReceiver implements ActionReceiver { readonly map: Map private readonly routeStore: RouteStore private readonly isSmallScreenQuery: () => boolean + private zoomCtrl: Zoom | null = null constructor(map: Map, routeStore: RouteStore, isSmallScreenQuery: () => boolean) { this.map = map @@ -31,6 +33,18 @@ export default class MapActionReceiver implements ActionReceiver { // we estimate the map size to be equal to the window size. we don't know better at this point, because // the map has not been rendered for the first time yet fitBounds(this.map, action.bbox, isSmallScreen, [window.innerWidth, window.innerHeight]) + } else if (action instanceof TurnNavigationStop) { + if(this.zoomCtrl !== null) + this.map.getControls().insertAt(this.map.getControls().getLength() - 1, this.zoomCtrl) + } else if (action instanceof TurnNavigationStart) { + const arr = this.map.getControls() + for(let i = 0; i < arr.getLength(); i++) { + if (arr.item(i) instanceof Zoom) { + this.zoomCtrl = arr.item(i) as Zoom + arr.remove(this.zoomCtrl); + break; + } + } } else if (action instanceof ZoomMapToPoint) { // if navigating then move icon (in center) to the lower half if (action.navigationOffset) { From 35270d368e6a87b7c954da70eaf9311f4e4dd5ef Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 21 Nov 2022 22:34:11 +0100 Subject: [PATCH 167/322] include custom model in rerouting request --- src/map/Map.module.css | 2 +- src/map/map.ts | 2 +- src/stores/MapActionReceiver.ts | 14 ++++++++------ src/stores/TurnNavigationStore.ts | 13 ++++++++++--- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/map/Map.module.css b/src/map/Map.module.css index a7c632fa..70c03845 100644 --- a/src/map/Map.module.css +++ b/src/map/Map.module.css @@ -40,4 +40,4 @@ .customAttribution button { display: none !important; -} \ No newline at end of file +} diff --git a/src/map/map.ts b/src/map/map.ts index 70a9cbf2..7e94ff93 100644 --- a/src/map/map.ts +++ b/src/map/map.ts @@ -20,7 +20,7 @@ export function createMap(): Map { rotate: false, // for now also disable this extra button zoom: true, zoomOptions: { - className: styles.customZoom + className: styles.customZoom, }, attribution: true, attributionOptions: { diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 3d3fd62d..32ad95f2 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -6,13 +6,15 @@ import { PathDetailsRangeSelected, RouteRequestSuccess, SetInitialBBox, - SetSelectedPath, TurnNavigationStart, TurnNavigationStop, + SetSelectedPath, + TurnNavigationStart, + TurnNavigationStop, ZoomMapToPoint, } from '@/actions/Actions' import RouteStore from '@/stores/RouteStore' import { Bbox } from '@/api/graphhopper' import { toRadians } from 'ol/math' -import {Zoom} from "ol/control"; +import { Zoom } from 'ol/control' export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -34,15 +36,15 @@ export default class MapActionReceiver implements ActionReceiver { // the map has not been rendered for the first time yet fitBounds(this.map, action.bbox, isSmallScreen, [window.innerWidth, window.innerHeight]) } else if (action instanceof TurnNavigationStop) { - if(this.zoomCtrl !== null) + if (this.zoomCtrl !== null) this.map.getControls().insertAt(this.map.getControls().getLength() - 1, this.zoomCtrl) } else if (action instanceof TurnNavigationStart) { const arr = this.map.getControls() - for(let i = 0; i < arr.getLength(); i++) { + for (let i = 0; i < arr.getLength(); i++) { if (arr.item(i) instanceof Zoom) { this.zoomCtrl = arr.item(i) as Zoom - arr.remove(this.zoomCtrl); - break; + arr.remove(this.zoomCtrl) + break } } } else if (action instanceof ZoomMapToPoint) { diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index a058ecaa..cc06be3f 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -1,9 +1,10 @@ -import { Coordinate } from '@/stores/QueryStore' +import { Coordinate, CustomModel, QueryStoreState } from '@/stores/QueryStore' import Store from '@/stores/Store' import { ErrorAction, LocationUpdate, SelectMapLayer, + SetCustomModel, SetSelectedPath, SetVehicleProfile, TurnNavigationRerouting, @@ -40,6 +41,7 @@ export interface TurnNavigationStoreState { initialPath: Path | null activePath: Path | null activeProfile: string + customModel: CustomModel | null rerouteInProgress: boolean settings: TNSettingsState instruction: TNInstructionState @@ -87,6 +89,7 @@ export default class TurnNavigationStore extends Store heading: 0, initialPath: null, activePath: null, + customModel: null, rerouteInProgress: false, activeProfile: '', settings: { acceptedRisk: false, fakeGPS: fakeGPS, soundEnabled: !fakeGPS } as TNSettingsState, @@ -122,6 +125,11 @@ export default class TurnNavigationStore extends Store ...state, rerouteInProgress: false, } + } else if (action instanceof SetCustomModel) { + return { + ...state, + customModel: action.valid ? action.customModel : null, + } } else if (action instanceof SetVehicleProfile) { console.log('SetVehicleProfile, profile: ' + action.profile.name) return { @@ -190,8 +198,7 @@ export default class TurnNavigationStore extends Store heading: action.heading, zoom: false, profile: state.activeProfile, - // TODO use correct customModel - customModel: null, + customModel: state.customModel, } this.api .route(args) From 4c78626ddb2fbec90dea0e80b004606ed2146ad9 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 4 Dec 2022 17:43:16 +0100 Subject: [PATCH 168/322] show the moving arrow on map --- src/layers/CurrentLocationLayer.tsx | 171 ++++++++++++++++++++++------ src/stores/MapActionReceiver.ts | 12 +- 2 files changed, 145 insertions(+), 38 deletions(-) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index 261724b6..6b7470c6 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -1,24 +1,46 @@ -import React, { useEffect } from 'react' -import { Feature, Map } from 'ol' -import { Coordinate } from '@/stores/QueryStore' -import { Point } from 'ol/geom' -import { fromLonLat } from 'ol/proj' +import React, {useEffect, useState} from 'react' +import {Feature, Map} from 'ol' +import {Coordinate} from '@/stores/QueryStore' +import {Point} from 'ol/geom' +import {fromLonLat} from 'ol/proj' import VectorLayer from 'ol/layer/Vector' import VectorSource from 'ol/source/Vector' -import { Style, Icon } from 'ol/style' +import {Icon, Style} from 'ol/style' +import Event from "ol/render/Event"; +import {getVectorContext} from "ol/render"; + +// we need a filled version of navigation.svg +const svgArrowData = + '' + + '' + + '' + + '' export default function useCurrentLocationLayer(map: Map, location: Coordinate) { + const [oldLoc, setOldLoc] = useState(location) + useEffect(() => { + const tmpOldLoc = {lat: oldLoc.lat, lng: oldLoc.lng} + setOldLoc(location) + + let animation: InBetweenArrowAnimation | null = null let layer = findLayer(map) - if (location.lat != 0 && location.lng != 0) { - if (layer == null) addCurrentLocation(map, location) - else changeLocation(layer, location) + if (tmpOldLoc.lat != 0 && tmpOldLoc.lng != 0) { + if (layer == null) layer = addCurrentLocation(map, tmpOldLoc) + const feature = layer.getSource().getFeatures()[0] as Feature + animation = new InBetweenArrowAnimation(map, layer, feature) + if (tmpOldLoc.lat != 0 && tmpOldLoc.lng != 0) + animation.startAnimation(tmpOldLoc, location) + } + return () => { + animation?.stopAnimation() + map.removeLayer(layer) } }, [map, location]) } function findLayer(map: Map): any { - let layers = map + const layers = map .getLayers() .getArray() .filter(l => l.get('gh:current_location')) @@ -27,12 +49,6 @@ function findLayer(map: Map): any { : null } -function changeLocation(layer: VectorLayer, location: Coordinate) { - // TODO animate movement https://openlayers.org/en/latest/examples/feature-move-animation.html - let feature = layer.getSource()?.getFeatures()[0] as Feature - feature.setGeometry(new Point(fromLonLat([location.lng, location.lat]))) -} - function addCurrentLocation(map: Map, location: Coordinate) { const currentLocationLayer = new VectorLayer({ source: new VectorSource({ @@ -45,23 +61,114 @@ function addCurrentLocation(map: Map, location: Coordinate) { }) currentLocationLayer.set('gh:current_location', true) currentLocationLayer.setZIndex(3) - - // we need a filled version of navigation.svg - const svgData = - '' + - '' + - '' + - '' - - currentLocationLayer.setStyle( - feature => - new Style({ - image: new Icon({ - displacement: [0, 24], - src: 'data:image/svg+xml;utf8,' + svgData, - }), - }) + currentLocationLayer.setStyle(() => + new Style({ + image: new Icon({ + displacement: [0, 24], + src: 'data:image/svg+xml;utf8,' + svgArrowData, + }), + }) ) map.addLayer(currentLocationLayer) return currentLocationLayer } + +class InBetweenArrowAnimation { + animating: boolean = false + lastTime: number = 0.0 + distance: number = 0.0 + startCoord: Coordinate = {lat: 0, lng: 0} + endCoord: Coordinate = {lat: 0, lng: 0} + + private readonly map: Map + private readonly mf + private readonly vectorLayer: VectorLayer + private readonly feature: Feature + private readonly arrowStyle = new Style({ + image: new Icon({ + displacement: [0, 24], + src: 'data:image/svg+xml;utf8,' + svgArrowData, + }), + }) + + constructor(map: Map, vectorLayer: VectorLayer, feature: Feature) { + this.map = map; + // ensure that we call "on" and "un" with the same function + this.mf = this.moveFeature.bind(this) + this.feature = feature + this.vectorLayer = vectorLayer + } + + startAnimation(startCoord: Coordinate, endCoord: Coordinate) { + if (this.animating) { + console.log("Ignore startAnimation") + return + } + + console.log("startAnimation") + this.animating = true + this.distance = 0 + this.lastTime = Date.now() + this.startCoord.lat = startCoord.lat + this.startCoord.lng = startCoord.lng + this.endCoord.lat = endCoord.lat + this.endCoord.lng = endCoord.lng + this.vectorLayer.on('postrender', this.mf); + // WITHOUT this call the moveFeature method is not called + // but WITH this call the arrow is printed twice on the map!?!? + // this.feature.setGeometry(undefined) + + // trigger render directly (in the marker animation example this call wasn't necessary?) + this.map.render() + } + + stopAnimation() { + if (!this.animating) { + console.log("Ignore stopAnimation") + return + } + console.log("stopAnimation") + this.animating = false + this.distance = 0 + this.lastTime = -1 + + this.feature.setGeometry(new Point(fromLonLat([this.endCoord.lng, this.endCoord.lat]))); + this.feature.setStyle(this.arrowStyle) + this.vectorLayer.un('postrender', this.mf); + } + + moveFeature(event: Event) { + if (!this.animating) { + console.log("Ignored moveFeature") + return; + } + + if (event.frameState == undefined) { + console.log("event.frameState undefined") + return + } + + const time = event.frameState.time; + const elapsedTime = time - this.lastTime; + // TODO make this adaptable. for fake this is 3sec and for real it is ~1sec but spec is unclear about this :( + this.distance = this.distance + elapsedTime / 1000.0 + console.log("moveFeature " + this.distance) + this.lastTime = time + if (this.distance > 1) { + // make end coordinate permanent + this.stopAnimation() + return; + } + let coord = {lat: this.startCoord.lat, lng: this.startCoord.lng} + coord.lat = this.startCoord.lat + (this.endCoord.lat - this.startCoord.lat) * this.distance + coord.lng = this.startCoord.lng + (this.endCoord.lng - this.startCoord.lng) * this.distance + // console.log(coord) + const vectorContext = getVectorContext(event); + vectorContext.setStyle(this.arrowStyle) + vectorContext.drawGeometry(new Point(fromLonLat([coord.lng, coord.lat]))); + // better? vectorContext.drawFeature(this.feature, this.arrowStyle) + + // tell OpenLayers to continue the postrender animation + this.map.render(); + } +} \ No newline at end of file diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 32ad95f2..57cb3c9c 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -1,6 +1,6 @@ -import { Action, ActionReceiver } from '@/stores/Dispatcher' -import { Map } from 'ol' -import { fromLonLat } from 'ol/proj' +import {Action, ActionReceiver} from '@/stores/Dispatcher' +import {Map} from 'ol' +import {fromLonLat} from 'ol/proj' import { InfoReceived, PathDetailsRangeSelected, @@ -12,9 +12,9 @@ import { ZoomMapToPoint, } from '@/actions/Actions' import RouteStore from '@/stores/RouteStore' -import { Bbox } from '@/api/graphhopper' -import { toRadians } from 'ol/math' -import { Zoom } from 'ol/control' +import {Bbox} from '@/api/graphhopper' +import {Zoom} from 'ol/control' +import {toRadians} from "@/turnNavigation/GeoMethods"; export default class MapActionReceiver implements ActionReceiver { readonly map: Map From 29b1564b0ff27c667d4c395acf4d20c839bf19f8 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 6 Dec 2022 21:40:20 +0100 Subject: [PATCH 169/322] much simpler and working solution (no dup arrows and view is automatically in-sync). is this a hack? --- src/App.tsx | 5 +- src/layers/CurrentLocationLayer.tsx | 174 ---------------------------- src/sidebar/filled-navigation.svg | 6 + src/stores/MapActionReceiver.ts | 11 +- 4 files changed, 19 insertions(+), 177 deletions(-) delete mode 100644 src/layers/CurrentLocationLayer.tsx create mode 100644 src/sidebar/filled-navigation.svg diff --git a/src/App.tsx b/src/App.tsx index 6df7d872..6ab9b764 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -46,9 +46,9 @@ import VolumeOffIcon from '@/turnNavigation/volume_off.svg' import PlainButton from '@/PlainButton' import TurnNavigation from '@/turnNavigation/TurnNavigation' import MapPopups from '@/map/MapPopups' -import useCurrentLocationLayer from '@/layers/CurrentLocationLayer' import Menu from '@/sidebar/menu.svg' import Cross from '@/sidebar/times-solid.svg' +import FilledNaviSVG from '@/sidebar/filled-navigation.svg' export const POPUP_CONTAINER_ID = 'popup-container' export const SIDEBAR_CONTENT_ID = 'sidebar-content' @@ -117,7 +117,6 @@ export default function App() { usePathsLayer(map, route, turnNavigation) useQueryPointsLayer(map, query.queryPoints) usePathDetailsLayer(map, pathDetails) - useCurrentLocationLayer(map, turnNavigation.coordinate) const isSmallScreen = useMediaQuery({ query: '(max-width: 44rem)' }) return ( @@ -189,6 +188,7 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, info, turnNav
    + ) @@ -276,6 +276,7 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, turnNav )}
    + ) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx deleted file mode 100644 index 6b7470c6..00000000 --- a/src/layers/CurrentLocationLayer.tsx +++ /dev/null @@ -1,174 +0,0 @@ -import React, {useEffect, useState} from 'react' -import {Feature, Map} from 'ol' -import {Coordinate} from '@/stores/QueryStore' -import {Point} from 'ol/geom' -import {fromLonLat} from 'ol/proj' -import VectorLayer from 'ol/layer/Vector' -import VectorSource from 'ol/source/Vector' -import {Icon, Style} from 'ol/style' -import Event from "ol/render/Event"; -import {getVectorContext} from "ol/render"; - -// we need a filled version of navigation.svg -const svgArrowData = - '' + - '' + - '' + - '' - -export default function useCurrentLocationLayer(map: Map, location: Coordinate) { - const [oldLoc, setOldLoc] = useState(location) - - useEffect(() => { - const tmpOldLoc = {lat: oldLoc.lat, lng: oldLoc.lng} - setOldLoc(location) - - let animation: InBetweenArrowAnimation | null = null - let layer = findLayer(map) - if (tmpOldLoc.lat != 0 && tmpOldLoc.lng != 0) { - if (layer == null) layer = addCurrentLocation(map, tmpOldLoc) - const feature = layer.getSource().getFeatures()[0] as Feature - animation = new InBetweenArrowAnimation(map, layer, feature) - if (tmpOldLoc.lat != 0 && tmpOldLoc.lng != 0) - animation.startAnimation(tmpOldLoc, location) - } - return () => { - animation?.stopAnimation() - map.removeLayer(layer) - } - }, [map, location]) -} - -function findLayer(map: Map): any { - const layers = map - .getLayers() - .getArray() - .filter(l => l.get('gh:current_location')) - return layers.length > 0 && layers[0] instanceof VectorLayer && layers[0].getSource() instanceof VectorSource - ? layers[0] - : null -} - -function addCurrentLocation(map: Map, location: Coordinate) { - const currentLocationLayer = new VectorLayer({ - source: new VectorSource({ - features: [ - new Feature({ - geometry: new Point(fromLonLat([location.lng, location.lat])), - }), - ], - }), - }) - currentLocationLayer.set('gh:current_location', true) - currentLocationLayer.setZIndex(3) - currentLocationLayer.setStyle(() => - new Style({ - image: new Icon({ - displacement: [0, 24], - src: 'data:image/svg+xml;utf8,' + svgArrowData, - }), - }) - ) - map.addLayer(currentLocationLayer) - return currentLocationLayer -} - -class InBetweenArrowAnimation { - animating: boolean = false - lastTime: number = 0.0 - distance: number = 0.0 - startCoord: Coordinate = {lat: 0, lng: 0} - endCoord: Coordinate = {lat: 0, lng: 0} - - private readonly map: Map - private readonly mf - private readonly vectorLayer: VectorLayer - private readonly feature: Feature - private readonly arrowStyle = new Style({ - image: new Icon({ - displacement: [0, 24], - src: 'data:image/svg+xml;utf8,' + svgArrowData, - }), - }) - - constructor(map: Map, vectorLayer: VectorLayer, feature: Feature) { - this.map = map; - // ensure that we call "on" and "un" with the same function - this.mf = this.moveFeature.bind(this) - this.feature = feature - this.vectorLayer = vectorLayer - } - - startAnimation(startCoord: Coordinate, endCoord: Coordinate) { - if (this.animating) { - console.log("Ignore startAnimation") - return - } - - console.log("startAnimation") - this.animating = true - this.distance = 0 - this.lastTime = Date.now() - this.startCoord.lat = startCoord.lat - this.startCoord.lng = startCoord.lng - this.endCoord.lat = endCoord.lat - this.endCoord.lng = endCoord.lng - this.vectorLayer.on('postrender', this.mf); - // WITHOUT this call the moveFeature method is not called - // but WITH this call the arrow is printed twice on the map!?!? - // this.feature.setGeometry(undefined) - - // trigger render directly (in the marker animation example this call wasn't necessary?) - this.map.render() - } - - stopAnimation() { - if (!this.animating) { - console.log("Ignore stopAnimation") - return - } - console.log("stopAnimation") - this.animating = false - this.distance = 0 - this.lastTime = -1 - - this.feature.setGeometry(new Point(fromLonLat([this.endCoord.lng, this.endCoord.lat]))); - this.feature.setStyle(this.arrowStyle) - this.vectorLayer.un('postrender', this.mf); - } - - moveFeature(event: Event) { - if (!this.animating) { - console.log("Ignored moveFeature") - return; - } - - if (event.frameState == undefined) { - console.log("event.frameState undefined") - return - } - - const time = event.frameState.time; - const elapsedTime = time - this.lastTime; - // TODO make this adaptable. for fake this is 3sec and for real it is ~1sec but spec is unclear about this :( - this.distance = this.distance + elapsedTime / 1000.0 - console.log("moveFeature " + this.distance) - this.lastTime = time - if (this.distance > 1) { - // make end coordinate permanent - this.stopAnimation() - return; - } - let coord = {lat: this.startCoord.lat, lng: this.startCoord.lng} - coord.lat = this.startCoord.lat + (this.endCoord.lat - this.startCoord.lat) * this.distance - coord.lng = this.startCoord.lng + (this.endCoord.lng - this.startCoord.lng) * this.distance - // console.log(coord) - const vectorContext = getVectorContext(event); - vectorContext.setStyle(this.arrowStyle) - vectorContext.drawGeometry(new Point(fromLonLat([coord.lng, coord.lat]))); - // better? vectorContext.drawFeature(this.feature, this.arrowStyle) - - // tell OpenLayers to continue the postrender animation - this.map.render(); - } -} \ No newline at end of file diff --git a/src/sidebar/filled-navigation.svg b/src/sidebar/filled-navigation.svg new file mode 100644 index 00000000..612caa62 --- /dev/null +++ b/src/sidebar/filled-navigation.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 57cb3c9c..6c220430 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -64,7 +64,16 @@ export default class MapActionReceiver implements ActionReceiver { zoom: action.zoom, center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), rotation: rotation, - duration: 400, + duration: 1000, // 1s simulates a smooth location change as we expect a location update every 1s too + }, () => { + // After animation render the arrow i.e. it can be out of synch with the map but only until the next location update and only window resizes. + // Animating the move of the arrow on the map AND keeping the view in sync with it is much more than these 4 lines. + const pixels = this.map.getPixelFromCoordinate(fromLonLat([action.coordinate.lng, action.coordinate.lat])); + const myLayer = document.getElementById("filledNavi") as HTMLElement | null + if(myLayer != null) { + myLayer.style.left = (pixels[0] - 24) + 'px'; + myLayer.style.top = (pixels[1] - 24) + 'px'; + } }) } else if (action instanceof RouteRequestSuccess) { // this assumes that always the first path is selected as result. One could use the From add737a642e32492f561f3f05f1ce828c71de79f Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 9 Dec 2022 17:23:56 +0100 Subject: [PATCH 170/322] ugly: the always busy rendering (1sec animation vs. every 1sec a loc update) leads to sluggish navigation and especially rerouting experience --- src/stores/MapActionReceiver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 6c220430..c51d315f 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -64,7 +64,7 @@ export default class MapActionReceiver implements ActionReceiver { zoom: action.zoom, center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), rotation: rotation, - duration: 1000, // 1s simulates a smooth location change as we expect a location update every 1s too + duration: 700, // 1s simulates a smooth location change as we expect a location update every 1s too }, () => { // After animation render the arrow i.e. it can be out of synch with the map but only until the next location update and only window resizes. // Animating the move of the arrow on the map AND keeping the view in sync with it is much more than these 4 lines. From ce270aeeb7de8ebca4bb6c0b32c6e220f4c6b390 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 9 Dec 2022 17:40:32 +0100 Subject: [PATCH 171/322] try increase --- src/stores/MapActionReceiver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index c51d315f..6df29411 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -64,7 +64,7 @@ export default class MapActionReceiver implements ActionReceiver { zoom: action.zoom, center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), rotation: rotation, - duration: 700, // 1s simulates a smooth location change as we expect a location update every 1s too + duration: 900, // 1s simulates a smooth location change as we expect a location update every 1s too }, () => { // After animation render the arrow i.e. it can be out of synch with the map but only until the next location update and only window resizes. // Animating the move of the arrow on the map AND keeping the view in sync with it is much more than these 4 lines. From 3503651f5f317b80d7925fa604b2313f6ea93c09 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 11 Dec 2022 18:01:24 +0100 Subject: [PATCH 172/322] use estimated speed from path details instead of imprecise path.dist/path.time --- src/stores/TurnNavigationStore.ts | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index cc06be3f..8f252eb0 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -232,15 +232,19 @@ export default class TurnNavigationStore extends Store if (instr.index < 0) throw new Error('Instruction should be valid if distanceToRoute is small') + const [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, coordinate, [ + path.details.average_speed, + path.details.max_speed, + path.details.surface, + path.details.road_class, + ]) + const instructionState = state.instruction const nextInstruction: Instruction = path.instructions[instr.index] - const text = nextInstruction.street_name if (state.settings.soundEnabled) { // making lastAnnounceDistance dependent on location.speed is tricky because then it can change while driving, so pick the constant average speed - // TODO use instruction average speed of current+next instruction instead of whole path - let averageSpeed = (path.distance / (path.time / 1000)) * 3.6 - let lastAnnounceDistance = 10 + 2 * Math.round(averageSpeed / 5) * 5 + let lastAnnounceDistance = 10 + 2 * Math.round(estimatedAvgSpeed / 5) * 5 if ( instr.distanceToTurn <= lastAnnounceDistance && @@ -251,7 +255,7 @@ export default class TurnNavigationStore extends Store const firstAnnounceDistance = 1150 if ( - averageSpeed > 15 && // two announcements only if faster speed + estimatedAvgSpeed > 15 && // two announcements only if faster speed instr.distanceToTurn > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) instr.distanceToTurn <= firstAnnounceDistance && (instructionState.distanceToTurn > firstAnnounceDistance || instr.index != instructionState.index) @@ -264,13 +268,6 @@ export default class TurnNavigationStore extends Store } } - const [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, coordinate, [ - path.details.average_speed, - path.details.max_speed, - path.details.surface, - path.details.road_class, - ]) - return { ...state, showUI: true, From c138da1116a35678a64e0ad78981088c61faa11a Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 11 Dec 2022 17:59:58 +0100 Subject: [PATCH 173/322] avoid frequent rerouting if current location is more than 50m away --- src/stores/TurnNavigationStore.ts | 40 +++++++++++++++---------- test/stores/TurnNavigationStore.test.ts | 26 +++++++++++----- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 8f252eb0..89a82613 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -1,4 +1,4 @@ -import { Coordinate, CustomModel, QueryStoreState } from '@/stores/QueryStore' +import { Coordinate, CustomModel } from '@/stores/QueryStore' import Store from '@/stores/Store' import { ErrorAction, @@ -57,6 +57,7 @@ export interface TNInstructionState { distanceToWaypoint: number sign: number text: string + distanceToRoute: number } export interface TNPathDetailsState { @@ -131,7 +132,7 @@ export default class TurnNavigationStore extends Store customModel: action.valid ? action.customModel : null, } } else if (action instanceof SetVehicleProfile) { - console.log('SetVehicleProfile, profile: ' + action.profile.name) + // console.log('SetVehicleProfile, profile: ' + action.profile.name) return { ...state, activeProfile: action.profile.name, @@ -150,6 +151,8 @@ export default class TurnNavigationStore extends Store } else if (action instanceof LocationUpdate) { if (state.initialPath == null) throw new Error('initialPath must not be null') if (state.activePath == null) throw new Error('activePath must not be null') + if (!state.activeProfile) return this.state // throw new Error instead? + const coordinate = action.coordinate let path = state.activePath let instr = getCurrentInstruction(path.instructions, coordinate) @@ -185,9 +188,9 @@ export default class TurnNavigationStore extends Store } // reroute only if already in turn navigation mode otherwise UI is not ready - if (state.showUI && (instr.distanceToRoute > 50 || skipWaypoint)) { + if ((state.showUI && this.distanceToRouteChange(instr.distanceToRoute)) || skipWaypoint) { let queriedAPI = false - if (state.activeProfile && !state.rerouteInProgress) { + if (!state.rerouteInProgress) { const toCoordinate = TurnNavigationStore.getWaypoint(path, instr.nextWaypointIndex) const args: RoutingArgs = { points: [ @@ -281,6 +284,7 @@ export default class TurnNavigationStore extends Store distanceToEnd: instr.distanceToEnd, nextWaypointIndex: instr.nextWaypointIndex, distanceToWaypoint: instr.distanceToWaypoint, + distanceToRoute: instr.distanceToRoute, sign: path.instructions[instr.index].sign, text, }, @@ -290,11 +294,10 @@ export default class TurnNavigationStore extends Store const path = action.path // ensure that path and instruction are synced - const { index, distanceToTurn, timeToEnd, distanceToEnd, nextWaypointIndex, distanceToWaypoint } = - getCurrentInstruction(path.instructions, state.coordinate) + const instr = getCurrentInstruction(path.instructions, state.coordinate) // current location is still not close - if (index < 0) { + if (instr.index < 0) { console.log('instruction after rerouting not found') return { ...state, @@ -302,7 +305,7 @@ export default class TurnNavigationStore extends Store } } - const text = path.instructions[index].street_name + const text = path.instructions[instr.index].street_name const [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, state.coordinate, [ path.details.average_speed, path.details.max_speed, @@ -315,13 +318,14 @@ export default class TurnNavigationStore extends Store activePath: path, rerouteInProgress: false, instruction: { - index, - distanceToTurn: distanceToTurn, - timeToEnd: timeToEnd, - distanceToEnd: distanceToEnd, - nextWaypointIndex: nextWaypointIndex, - distanceToWaypoint: distanceToWaypoint, - sign: path.instructions[index].sign, + index: instr.index, + distanceToTurn: instr.distanceToTurn, + timeToEnd: instr.timeToEnd, + distanceToEnd: instr.distanceToEnd, + nextWaypointIndex: instr.nextWaypointIndex, + distanceToWaypoint: instr.distanceToWaypoint, + distanceToRoute: instr.distanceToRoute, + sign: path.instructions[instr.index].sign, text, }, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, @@ -330,6 +334,12 @@ export default class TurnNavigationStore extends Store return state } + private distanceToRouteChange(actionDistance: number) { + if (isNaN(this.state.instruction.distanceToRoute)) return actionDistance > 50 + // if we are far away from a route (which is already the result of a rerouting) then a new rerouting shouldn't be triggered + else return Math.abs(this.state.instruction.distanceToRoute - actionDistance) > 50 + } + private synthesize(text: string) { if (this.state.settings.soundEnabled) this.speechSynthesizer.synthesize(text) } diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index f528f7c6..d6796e00 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -101,30 +101,40 @@ describe('TurnNavigationStore', () => { it('should reroute', async () => { // TODO are these ugly numbers like 00000000001 from server-side snapped_waypoints array? const rerouteWaypoints = [ - [14.266328, 51.434653], + [14.267587, 51.434226], [14.267240000000001, 51.43253000000001], ] as [number, number][] const store = createStore(new LocalApi().setRerouteData(reroute1, rerouteWaypoints)) + // no navigation without profile although path is already selected (this ensures that rerouting is based on proper previous states) Dispatcher.dispatch(new SetSelectedPath(reroute1.paths[0])) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.266959, lat: 51.435051 }, 10, 120)) + Dispatcher.dispatch(new LocationUpdate({ lat: 51.434681, lng: 14.267249 }, 12, 120)) + expect(Math.round(store.state.instruction.distanceToRoute)).toBeNaN() + expect(store.state.showUI).toBeFalsy() + + Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) + Dispatcher.dispatch(new LocationUpdate({ lat: 51.434681, lng: 14.267249 }, 10, 120)) expect(store.state.speed).toEqual(10) + expect(store.state.showUI).toBeTruthy() + expect(Math.round(store.state.instruction.distanceToRoute)).toEqual(59) // usually this would trigger a rerouting but showUI was false before expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) - - // no rerouting without profile - Dispatcher.dispatch(new LocationUpdate({ lng: 14.268302, lat: 51.435232 }, 12, 120)) - expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeFalsy() - Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, 12, 120)) + Dispatcher.dispatch(new LocationUpdate({ lat: 51.434226, lng: 14.267587 }, 12, 120)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() await flushPromises() expect(store.state.rerouteInProgress).toBeFalsy() + expect(Math.round(store.state.instruction.distanceToRoute)).toEqual(5) expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) + + // now try again point which is more than 50m away but change of distanceToRoute is smaller than 50m + Dispatcher.dispatch(new LocationUpdate({ lat: 51.434621, lng: 14.267303 }, 10, 120)) + expect(store.state.speed).toEqual(10) + expect(Math.round(store.state.instruction.distanceToRoute)).toEqual(51) + expect(store.state.rerouteInProgress).toBeFalsy() }) it('should reroute with via point', async () => { From 44ff73c5dd566c7c1ada148032dcfec81b94fd9d Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 13 Dec 2022 16:45:44 +0100 Subject: [PATCH 174/322] Revert "avoid frequent rerouting if current location is more than 50m away" This reverts commit c138da1116a35678a64e0ad78981088c61faa11a. --- src/stores/TurnNavigationStore.ts | 40 ++++++++++--------------- test/stores/TurnNavigationStore.test.ts | 26 +++++----------- 2 files changed, 23 insertions(+), 43 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 89a82613..8f252eb0 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -1,4 +1,4 @@ -import { Coordinate, CustomModel } from '@/stores/QueryStore' +import { Coordinate, CustomModel, QueryStoreState } from '@/stores/QueryStore' import Store from '@/stores/Store' import { ErrorAction, @@ -57,7 +57,6 @@ export interface TNInstructionState { distanceToWaypoint: number sign: number text: string - distanceToRoute: number } export interface TNPathDetailsState { @@ -132,7 +131,7 @@ export default class TurnNavigationStore extends Store customModel: action.valid ? action.customModel : null, } } else if (action instanceof SetVehicleProfile) { - // console.log('SetVehicleProfile, profile: ' + action.profile.name) + console.log('SetVehicleProfile, profile: ' + action.profile.name) return { ...state, activeProfile: action.profile.name, @@ -151,8 +150,6 @@ export default class TurnNavigationStore extends Store } else if (action instanceof LocationUpdate) { if (state.initialPath == null) throw new Error('initialPath must not be null') if (state.activePath == null) throw new Error('activePath must not be null') - if (!state.activeProfile) return this.state // throw new Error instead? - const coordinate = action.coordinate let path = state.activePath let instr = getCurrentInstruction(path.instructions, coordinate) @@ -188,9 +185,9 @@ export default class TurnNavigationStore extends Store } // reroute only if already in turn navigation mode otherwise UI is not ready - if ((state.showUI && this.distanceToRouteChange(instr.distanceToRoute)) || skipWaypoint) { + if (state.showUI && (instr.distanceToRoute > 50 || skipWaypoint)) { let queriedAPI = false - if (!state.rerouteInProgress) { + if (state.activeProfile && !state.rerouteInProgress) { const toCoordinate = TurnNavigationStore.getWaypoint(path, instr.nextWaypointIndex) const args: RoutingArgs = { points: [ @@ -284,7 +281,6 @@ export default class TurnNavigationStore extends Store distanceToEnd: instr.distanceToEnd, nextWaypointIndex: instr.nextWaypointIndex, distanceToWaypoint: instr.distanceToWaypoint, - distanceToRoute: instr.distanceToRoute, sign: path.instructions[instr.index].sign, text, }, @@ -294,10 +290,11 @@ export default class TurnNavigationStore extends Store const path = action.path // ensure that path and instruction are synced - const instr = getCurrentInstruction(path.instructions, state.coordinate) + const { index, distanceToTurn, timeToEnd, distanceToEnd, nextWaypointIndex, distanceToWaypoint } = + getCurrentInstruction(path.instructions, state.coordinate) // current location is still not close - if (instr.index < 0) { + if (index < 0) { console.log('instruction after rerouting not found') return { ...state, @@ -305,7 +302,7 @@ export default class TurnNavigationStore extends Store } } - const text = path.instructions[instr.index].street_name + const text = path.instructions[index].street_name const [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, state.coordinate, [ path.details.average_speed, path.details.max_speed, @@ -318,14 +315,13 @@ export default class TurnNavigationStore extends Store activePath: path, rerouteInProgress: false, instruction: { - index: instr.index, - distanceToTurn: instr.distanceToTurn, - timeToEnd: instr.timeToEnd, - distanceToEnd: instr.distanceToEnd, - nextWaypointIndex: instr.nextWaypointIndex, - distanceToWaypoint: instr.distanceToWaypoint, - distanceToRoute: instr.distanceToRoute, - sign: path.instructions[instr.index].sign, + index, + distanceToTurn: distanceToTurn, + timeToEnd: timeToEnd, + distanceToEnd: distanceToEnd, + nextWaypointIndex: nextWaypointIndex, + distanceToWaypoint: distanceToWaypoint, + sign: path.instructions[index].sign, text, }, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, @@ -334,12 +330,6 @@ export default class TurnNavigationStore extends Store return state } - private distanceToRouteChange(actionDistance: number) { - if (isNaN(this.state.instruction.distanceToRoute)) return actionDistance > 50 - // if we are far away from a route (which is already the result of a rerouting) then a new rerouting shouldn't be triggered - else return Math.abs(this.state.instruction.distanceToRoute - actionDistance) > 50 - } - private synthesize(text: string) { if (this.state.settings.soundEnabled) this.speechSynthesizer.synthesize(text) } diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index d6796e00..f528f7c6 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -101,40 +101,30 @@ describe('TurnNavigationStore', () => { it('should reroute', async () => { // TODO are these ugly numbers like 00000000001 from server-side snapped_waypoints array? const rerouteWaypoints = [ - [14.267587, 51.434226], + [14.266328, 51.434653], [14.267240000000001, 51.43253000000001], ] as [number, number][] const store = createStore(new LocalApi().setRerouteData(reroute1, rerouteWaypoints)) - // no navigation without profile although path is already selected (this ensures that rerouting is based on proper previous states) Dispatcher.dispatch(new SetSelectedPath(reroute1.paths[0])) - Dispatcher.dispatch(new LocationUpdate({ lat: 51.434681, lng: 14.267249 }, 12, 120)) - expect(Math.round(store.state.instruction.distanceToRoute)).toBeNaN() - expect(store.state.showUI).toBeFalsy() - - Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) - Dispatcher.dispatch(new LocationUpdate({ lat: 51.434681, lng: 14.267249 }, 10, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266959, lat: 51.435051 }, 10, 120)) expect(store.state.speed).toEqual(10) - expect(store.state.showUI).toBeTruthy() - expect(Math.round(store.state.instruction.distanceToRoute)).toEqual(59) // usually this would trigger a rerouting but showUI was false before expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) + + // no rerouting without profile + Dispatcher.dispatch(new LocationUpdate({ lng: 14.268302, lat: 51.435232 }, 12, 120)) + expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeFalsy() - Dispatcher.dispatch(new LocationUpdate({ lat: 51.434226, lng: 14.267587 }, 12, 120)) + Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, 12, 120)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() await flushPromises() expect(store.state.rerouteInProgress).toBeFalsy() - expect(Math.round(store.state.instruction.distanceToRoute)).toEqual(5) expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) - - // now try again point which is more than 50m away but change of distanceToRoute is smaller than 50m - Dispatcher.dispatch(new LocationUpdate({ lat: 51.434621, lng: 14.267303 }, 10, 120)) - expect(store.state.speed).toEqual(10) - expect(Math.round(store.state.instruction.distanceToRoute)).toEqual(51) - expect(store.state.rerouteInProgress).toBeFalsy() }) it('should reroute with via point', async () => { From 2673a6a961b0201ba1398ecbcfead244363b72a8 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 15 Dec 2022 20:47:32 +0100 Subject: [PATCH 175/322] avoid too frequent rerouting --- src/App.tsx | 4 +-- src/actions/Actions.ts | 2 +- src/stores/MapActionReceiver.ts | 45 ++++++++++++++----------- src/stores/TurnNavigationStore.ts | 43 ++++++++++++++++------- test/stores/TurnNavigationStore.test.ts | 38 ++++++++++++++++----- 5 files changed, 88 insertions(+), 44 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 6ab9b764..f82910ba 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -188,7 +188,7 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, info, turnNav
    - + ) @@ -276,7 +276,7 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, turnNav )}
    - + ) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index ffb564f3..94cd9216 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -43,7 +43,7 @@ export class TurnNavigationSettingsUpdate implements Action { } export class TurnNavigationReroutingFailed implements Action {} - +export class TurnNavigationReroutingTimeResetForTest implements Action {} export class TurnNavigationRerouting implements Action { readonly path: Path diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 6df29411..9d7d25dc 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -1,6 +1,6 @@ -import {Action, ActionReceiver} from '@/stores/Dispatcher' -import {Map} from 'ol' -import {fromLonLat} from 'ol/proj' +import { Action, ActionReceiver } from '@/stores/Dispatcher' +import { Map } from 'ol' +import { fromLonLat } from 'ol/proj' import { InfoReceived, PathDetailsRangeSelected, @@ -12,9 +12,9 @@ import { ZoomMapToPoint, } from '@/actions/Actions' import RouteStore from '@/stores/RouteStore' -import {Bbox} from '@/api/graphhopper' -import {Zoom} from 'ol/control' -import {toRadians} from "@/turnNavigation/GeoMethods"; +import { Bbox } from '@/api/graphhopper' +import { Zoom } from 'ol/control' +import { toRadians } from '@/turnNavigation/GeoMethods' export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -60,21 +60,26 @@ export default class MapActionReceiver implements ActionReceiver { action.heading === null || Number.isNaN(action.heading) ? this.map.getView().getRotation() : -toRadians(action.heading) - this.map.getView().animate({ - zoom: action.zoom, - center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), - rotation: rotation, - duration: 900, // 1s simulates a smooth location change as we expect a location update every 1s too - }, () => { - // After animation render the arrow i.e. it can be out of synch with the map but only until the next location update and only window resizes. - // Animating the move of the arrow on the map AND keeping the view in sync with it is much more than these 4 lines. - const pixels = this.map.getPixelFromCoordinate(fromLonLat([action.coordinate.lng, action.coordinate.lat])); - const myLayer = document.getElementById("filledNavi") as HTMLElement | null - if(myLayer != null) { - myLayer.style.left = (pixels[0] - 24) + 'px'; - myLayer.style.top = (pixels[1] - 24) + 'px'; + this.map.getView().animate( + { + zoom: action.zoom, + center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), + rotation: rotation, + duration: 900, // 1s simulates a smooth location change as we expect a location update every 1s too + }, + () => { + // After animation render the arrow i.e. it can be out of synch with the map but only until the next location update and only window resizes. + // Animating the move of the arrow on the map AND keeping the view in sync with it is much more than these 4 lines. + const pixels = this.map.getPixelFromCoordinate( + fromLonLat([action.coordinate.lng, action.coordinate.lat]) + ) + const myLayer = document.getElementById('filledNavi') as HTMLElement | null + if (myLayer != null) { + myLayer.style.left = pixels[0] - 24 + 'px' + myLayer.style.top = pixels[1] - 24 + 'px' + } } - }) + ) } else if (action instanceof RouteRequestSuccess) { // this assumes that always the first path is selected as result. One could use the // state of the routeStore as well, but then we would have to make sure that the route diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 8f252eb0..65c0500c 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -1,4 +1,4 @@ -import { Coordinate, CustomModel, QueryStoreState } from '@/stores/QueryStore' +import { Coordinate, CustomModel } from '@/stores/QueryStore' import Store from '@/stores/Store' import { ErrorAction, @@ -9,6 +9,7 @@ import { SetVehicleProfile, TurnNavigationRerouting, TurnNavigationReroutingFailed, + TurnNavigationReroutingTimeResetForTest, TurnNavigationSettingsUpdate, TurnNavigationStart, TurnNavigationStop, @@ -36,6 +37,8 @@ export interface TurnNavigationStoreState { started: boolean oldTiles: string coordinate: Coordinate + lastRerouteTime: number + lastRerouteDistanceToRoute: number speed: number heading: number initialPath: Path | null @@ -91,6 +94,8 @@ export default class TurnNavigationStore extends Store activePath: null, customModel: null, rerouteInProgress: false, + lastRerouteTime: 0, + lastRerouteDistanceToRoute: 0, activeProfile: '', settings: { acceptedRisk: false, fakeGPS: fakeGPS, soundEnabled: !fakeGPS } as TNSettingsState, instruction: {} as TNInstructionState, @@ -185,7 +190,7 @@ export default class TurnNavigationStore extends Store } // reroute only if already in turn navigation mode otherwise UI is not ready - if (state.showUI && (instr.distanceToRoute > 50 || skipWaypoint)) { + if (state.showUI && (skipWaypoint || this.shouldReroute(instr.distanceToRoute))) { let queriedAPI = false if (state.activeProfile && !state.rerouteInProgress) { const toCoordinate = TurnNavigationStore.getWaypoint(path, instr.nextWaypointIndex) @@ -290,11 +295,10 @@ export default class TurnNavigationStore extends Store const path = action.path // ensure that path and instruction are synced - const { index, distanceToTurn, timeToEnd, distanceToEnd, nextWaypointIndex, distanceToWaypoint } = - getCurrentInstruction(path.instructions, state.coordinate) + const instr = getCurrentInstruction(path.instructions, state.coordinate) // current location is still not close - if (index < 0) { + if (instr.index < 0) { console.log('instruction after rerouting not found') return { ...state, @@ -302,7 +306,7 @@ export default class TurnNavigationStore extends Store } } - const text = path.instructions[index].street_name + const text = path.instructions[instr.index].street_name const [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, state.coordinate, [ path.details.average_speed, path.details.max_speed, @@ -314,22 +318,35 @@ export default class TurnNavigationStore extends Store ...state, activePath: path, rerouteInProgress: false, + lastRerouteTime: new Date().getTime(), + lastRerouteDistanceToRoute: instr.distanceToRoute, instruction: { - index, - distanceToTurn: distanceToTurn, - timeToEnd: timeToEnd, - distanceToEnd: distanceToEnd, - nextWaypointIndex: nextWaypointIndex, - distanceToWaypoint: distanceToWaypoint, - sign: path.instructions[index].sign, + index: instr.index, + distanceToTurn: instr.distanceToTurn, + timeToEnd: instr.timeToEnd, + distanceToEnd: instr.distanceToEnd, + nextWaypointIndex: instr.nextWaypointIndex, + distanceToWaypoint: instr.distanceToWaypoint, + sign: path.instructions[instr.index].sign, text, }, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, } + } else if (action instanceof TurnNavigationReroutingTimeResetForTest) { + return { + ...state, + lastRerouteTime: 0, + } } return state } + private shouldReroute(currentDistanceToRoute: number) { + if (currentDistanceToRoute < 50) return false // close to current route + if (new Date().getTime() - this.state.lastRerouteTime < 10_000) return false // avoid frequent rerouting + return this.state.lastRerouteDistanceToRoute < currentDistanceToRoute // skip rerouting if getting closer to route + } + private synthesize(text: string) { if (this.state.settings.soundEnabled) this.speechSynthesizer.synthesize(text) } diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index f528f7c6..b110cfdb 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -1,5 +1,10 @@ import Dispatcher from '@/stores/Dispatcher' -import { LocationUpdate, SetSelectedPath, SetVehicleProfile } from '@/actions/Actions' +import { + LocationUpdate, + SetSelectedPath, + SetVehicleProfile, + TurnNavigationReroutingTimeResetForTest, +} from '@/actions/Actions' import TurnNavigationStore from '@/stores/TurnNavigationStore' import { SpeechSynthesizer } from '@/SpeechSynthesizer' import { ApiInfo, GeocodingResult, RawResult, RoutingArgs, RoutingResult } from '@/api/graphhopper' @@ -100,24 +105,25 @@ describe('TurnNavigationStore', () => { it('should reroute', async () => { // TODO are these ugly numbers like 00000000001 from server-side snapped_waypoints array? - const rerouteWaypoints = [ - [14.266328, 51.434653], + const api = new LocalApi() + api.setRerouteData(reroute1, [ + [14.267238, 51.43475], [14.267240000000001, 51.43253000000001], - ] as [number, number][] - const store = createStore(new LocalApi().setRerouteData(reroute1, rerouteWaypoints)) + ]) + const store = createStore(api) Dispatcher.dispatch(new SetSelectedPath(reroute1.paths[0])) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.266959, lat: 51.435051 }, 10, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.268908, lat: 51.434871 }, 10, 120)) expect(store.state.speed).toEqual(10) expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) // no rerouting without profile - Dispatcher.dispatch(new LocationUpdate({ lng: 14.268302, lat: 51.435232 }, 12, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, 12, 120)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeFalsy() Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, 12, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.267238, lat: 51.43475 }, 12, 120)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() await flushPromises() @@ -125,6 +131,22 @@ describe('TurnNavigationStore', () => { expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) + + // avoid too frequent rerouting + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, 10, 120)) + expect(store.state.speed).toEqual(10) + expect(store.state.rerouteInProgress).toBeFalsy() + + api.setRerouteData(reroute1, [ + [14.266328, 51.434653], + [14.267240000000001, 51.43253000000001], + ]) + Dispatcher.dispatch(new TurnNavigationReroutingTimeResetForTest()) // skip waiting 10 seconds + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, 12, 120)) + expect(store.state.speed).toEqual(12) + expect(store.state.rerouteInProgress).toBeTruthy() + await flushPromises() + expect(store.state.rerouteInProgress).toBeFalsy() }) it('should reroute with via point', async () => { From d90575fdca18b6e51150092cd6ebcf140d83441c Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 20 Dec 2022 12:44:10 +0100 Subject: [PATCH 176/322] initialize profile --- src/stores/TurnNavigationStore.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 65c0500c..d394bee3 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -1,7 +1,7 @@ import { Coordinate, CustomModel } from '@/stores/QueryStore' import Store from '@/stores/Store' import { - ErrorAction, + ErrorAction, InfoReceived, LocationUpdate, SelectMapLayer, SetCustomModel, @@ -135,6 +135,12 @@ export default class TurnNavigationStore extends Store ...state, customModel: action.valid ? action.customModel : null, } + } else if (action instanceof InfoReceived) { + if (state.activeProfile || action.result.profiles.length <= 0) return state + return { + ...state, + activeProfile: action.result.profiles[0].name, + } } else if (action instanceof SetVehicleProfile) { console.log('SetVehicleProfile, profile: ' + action.profile.name) return { From 75fa966896f4c1b1eee8836a985f77bcd3e16288 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 20 Dec 2022 12:44:36 +0100 Subject: [PATCH 177/322] cleanup SpeechSynthesizer --- src/SpeechSynthesizer.ts | 48 +------------------------------ src/stores/TurnNavigationStore.ts | 3 +- 2 files changed, 3 insertions(+), 48 deletions(-) diff --git a/src/SpeechSynthesizer.ts b/src/SpeechSynthesizer.ts index 981ead64..576d253d 100644 --- a/src/SpeechSynthesizer.ts +++ b/src/SpeechSynthesizer.ts @@ -5,15 +5,10 @@ export interface SpeechSynthesizer { export class SpeechSynthesizerImpl implements SpeechSynthesizer { private readonly locale: string private readonly speechSynthesisAPIAvailable: boolean - private audioCtx: AudioContext - private source?: AudioBufferSourceNode constructor(locale: string) { this.locale = locale - // this is a bit funny: the comma is required and prettier moves it to the next line this.speechSynthesisAPIAvailable = 'speechSynthesis' in window - ;(window as any).AudioContext = (window as any).AudioContext || (window as any).webkitAudioContext - this.audioCtx = new AudioContext() } synthesize(text: string) { @@ -23,48 +18,7 @@ export class SpeechSynthesizerImpl implements SpeechSynthesizer { if (speechSynthesis.pending) speechSynthesis.cancel() speechSynthesis.speak(utterance) } else { - this.synthesizeOnline(text) + console.log('no speechSynthesis API available') } } - - synthesizeOnline(text: string) { - // we need a better caching here that does not leak over time and also avoids errors like: - // "Error decoding file DOMException: The buffer passed to decodeAudioData contains an unknown content type." - // because otherwise the audio for this instruction would be broken forever - const url = 'https://navi.graphhopper.org:5002/api/tts?text=' + encodeURIComponent(text) - const xhr = new XMLHttpRequest() - xhr.open('GET', url, true) - xhr.responseType = 'blob' - xhr.onload = () => { - this.initSound(xhr.response) - } - xhr.send() - } - - private async initSound(blob: any) { - const arrayBuffer = await blob.arrayBuffer() - this.audioCtx.decodeAudioData( - arrayBuffer, - (audioData: any) => { - this.playSound(audioData) - }, - function (e: any) { - console.log('Error decoding file', e) - } - ) - } - - private playSound(audioBuffer: any) { - if (this.source) this.source.stop() - - // this would skip too many stuff - // this.source.onended = (event) => { console.log("sound ENDED"); this.playSoundInProgress = false; } - - // the source needs to be freshly created otherwise we get: Cannot set the buffer attribute of an AudioBufferSourceNode with an AudioBuffer more than once - this.source = this.audioCtx.createBufferSource() - this.source.buffer = audioBuffer - this.source.loop = false - this.source.connect(this.audioCtx.destination) - this.source.start() - } } diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index d394bee3..3d851f22 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -1,7 +1,8 @@ import { Coordinate, CustomModel } from '@/stores/QueryStore' import Store from '@/stores/Store' import { - ErrorAction, InfoReceived, + ErrorAction, + InfoReceived, LocationUpdate, SelectMapLayer, SetCustomModel, From 72e8526547c2db51b85490314ba7d66c79c0b204 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 20 Dec 2022 22:50:19 +0100 Subject: [PATCH 178/322] new nice mouse-controlled GPS injection for testing --- src/stores/TurnNavigationStore.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 3d851f22..1fe08afe 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -31,6 +31,9 @@ import * as config from 'config' import { Instruction, Path, RoutingArgs } from '@/api/graphhopper' import { tr } from '@/translation/Translation' import { SpeechSynthesizer } from '@/SpeechSynthesizer' +import { getMapFeatureStore } from '@/stores/Stores' +import { getMap } from '@/map/map' +import { fromLonLat, toLonLat } from 'ol/proj' export interface TurnNavigationStoreState { // TODO replace "showUI" with a composite state depending on activePath, coordinate and instruction @@ -381,6 +384,33 @@ export default class TurnNavigationStore extends Store private async initFake() { console.log('started fake GPS injection') + let mouseControlled = true // control GPS movement via mouse or see below: along a predefined route + if (mouseControlled) { + let pixel = [] as number[] + let prevCoord = { lng: 0, lat: 0 } as Coordinate + addEventListener('mousemove', event => { + pixel[0] = event.x + pixel[1] = event.y + }) + + this.interval = setInterval(() => { + let coord = toLonLat(getMap().getCoordinateFromPixel(pixel)) + let o = calcOrientation(prevCoord.lat, prevCoord.lng, coord[1], coord[0]) + this.locationUpdate({ + coords: { + latitude: coord[1], + longitude: coord[0], + heading: toDegrees(toNorthBased(o)), + speed: 4, + }, + }) + + prevCoord.lng = coord[0] + prevCoord.lat = coord[1] + }, 3000) + return + } + // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car&layer=MapTiler&fake=true let api = new ApiImpl(config.routingApi, config.geocodingApi, config.keys.graphhopper) let response = await api.route({ From aa448607d0249933e08f937f3b86647261df4a77 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 21 Dec 2022 10:05:34 +0100 Subject: [PATCH 179/322] avoid that jest has to parse index.d.ts from ol --- src/index.tsx | 18 ++++++++++++++++-- src/stores/TurnNavigationStore.ts | 22 +++++++++++++++++----- test/stores/TurnNavigationStore.test.ts | 11 +++++++++-- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/index.tsx b/src/index.tsx index 3fc95223..995d4dcc 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -25,12 +25,14 @@ import { setStores, } from '@/stores/Stores' import MapOptionsStore from '@/stores/MapOptionsStore' -import TurnNavigationStore from '@/stores/TurnNavigationStore' +import TurnNavigationStore, { MapCoordinateSystem } from '@/stores/TurnNavigationStore' import PathDetailsStore from '@/stores/PathDetailsStore' import Dispatcher from '@/stores/Dispatcher' import NavBar from '@/NavBar' import App from '@/App' import { ErrorAction, InfoReceived } from '@/actions/Actions' +import { toLonLat } from 'ol/proj' +import { Pixel } from 'ol/pixel' console.log(`Source code: https://github.com/graphhopper/graphhopper-maps/tree/${GIT_SHA}`) @@ -48,6 +50,12 @@ const queryStore = new QueryStore(getApi(), initialCustomModelStr) const routeStore = new RouteStore(queryStore) const speechSynthesizer = new SpeechSynthesizerImpl(navigator.language) +class CoordSysImpl implements MapCoordinateSystem { + getCoordinateFromPixel(pixel: Pixel) { + return toLonLat(getMap().getCoordinateFromPixel(pixel)) + } +} + setStores({ settingsStore: new SettingsStore(), queryStore: queryStore, @@ -55,7 +63,13 @@ setStores({ infoStore: new ApiInfoStore(), errorStore: new ErrorStore(), mapOptionsStore: new MapOptionsStore(), - turnNavigationStore: new TurnNavigationStore(getApi(), speechSynthesizer, fake != null, config.defaultTiles), + turnNavigationStore: new TurnNavigationStore( + getApi(), + speechSynthesizer, + new CoordSysImpl(), + fake != null, + config.defaultTiles + ), pathDetailsStore: new PathDetailsStore(), mapFeatureStore: new MapFeatureStore(), }) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 1fe08afe..2eb91965 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -31,9 +31,9 @@ import * as config from 'config' import { Instruction, Path, RoutingArgs } from '@/api/graphhopper' import { tr } from '@/translation/Translation' import { SpeechSynthesizer } from '@/SpeechSynthesizer' -import { getMapFeatureStore } from '@/stores/Stores' import { getMap } from '@/map/map' -import { fromLonLat, toLonLat } from 'ol/proj' +import { toLonLat } from 'ol/proj' +import { Pixel } from 'ol/pixel' export interface TurnNavigationStoreState { // TODO replace "showUI" with a composite state depending on activePath, coordinate and instruction @@ -79,14 +79,25 @@ export interface TNSettingsState { soundEnabled: boolean } +export interface MapCoordinateSystem { + getCoordinateFromPixel(pixel: Pixel): number[] +} + export default class TurnNavigationStore extends Store { private readonly api: Api private watchId: any = undefined private interval: any private noSleep: any private readonly speechSynthesizer: SpeechSynthesizer - - constructor(api: Api, speechSynthesizer: SpeechSynthesizer, fakeGPS: boolean, tiles: string) { + private readonly cs: MapCoordinateSystem + + constructor( + api: Api, + speechSynthesizer: SpeechSynthesizer, + cs: MapCoordinateSystem, + fakeGPS: boolean, + tiles: string + ) { super({ showUI: false, started: false, @@ -105,6 +116,7 @@ export default class TurnNavigationStore extends Store instruction: {} as TNInstructionState, pathDetails: {} as TNPathDetailsState, }) + this.cs = cs this.api = api this.speechSynthesizer = speechSynthesizer } @@ -394,7 +406,7 @@ export default class TurnNavigationStore extends Store }) this.interval = setInterval(() => { - let coord = toLonLat(getMap().getCoordinateFromPixel(pixel)) + let coord = this.cs.getCoordinateFromPixel(pixel) let o = calcOrientation(prevCoord.lat, prevCoord.lng, coord[1], coord[0]) this.locationUpdate({ coords: { diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index b110cfdb..6de57b3c 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -5,12 +5,13 @@ import { SetVehicleProfile, TurnNavigationReroutingTimeResetForTest, } from '@/actions/Actions' -import TurnNavigationStore from '@/stores/TurnNavigationStore' +import TurnNavigationStore, { MapCoordinateSystem } from '@/stores/TurnNavigationStore' import { SpeechSynthesizer } from '@/SpeechSynthesizer' import { ApiInfo, GeocodingResult, RawResult, RoutingArgs, RoutingResult } from '@/api/graphhopper' import Api, { ApiImpl } from '@/api/Api' import { setTranslation } from '@/translation/Translation' import { Coordinate } from '@/stores/QueryStore' +import { Pixel } from 'ol/pixel' let routeWithVia = toRoutingResult(require('../turnNavigation/response-hoyerswerda2.json')) let reroute1 = toRoutingResult(require('../turnNavigation/reroute1.json')) @@ -240,7 +241,7 @@ describe('TurnNavigationStore', () => { }) function createStore(api: Api) { - const store = new TurnNavigationStore(api, new DummySpeech(), true, '') + const store = new TurnNavigationStore(api, new DummySpeech(), new DummyCS(), true, '') Dispatcher.register(store) return store } @@ -251,6 +252,12 @@ describe('TurnNavigationStore', () => { } } + class DummyCS implements MapCoordinateSystem { + getCoordinateFromPixel(pixel: Pixel): number[] { + return [0, 0] + } + } + class LocalApi implements Api { private resultOnReroute?: RoutingResult private waypointsInQuery?: [number, number][] From a4bbad86db075e128b8f6835ae2eee120ff128f0 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 23 Dec 2022 11:54:31 +0100 Subject: [PATCH 180/322] create NoSleep only once --- src/stores/TurnNavigationStore.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 2eb91965..81f4e285 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -87,7 +87,7 @@ export default class TurnNavigationStore extends Store private readonly api: Api private watchId: any = undefined private interval: any - private noSleep: any + private noSleep = new NoSleep() private readonly speechSynthesizer: SpeechSynthesizer private readonly cs: MapCoordinateSystem @@ -487,7 +487,6 @@ export default class TurnNavigationStore extends Store } private initReal(doFullscreen: boolean) { - if (!this.noSleep) this.noSleep = new NoSleep() this.noSleep.enable() if (!navigator.geolocation) { console.log('location not supported. In firefox I had to set geo.enabled=true in about:config') From 63bb24dd2b46c648d3a90acad5b5ff39dff58057 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 23 Dec 2022 12:06:51 +0100 Subject: [PATCH 181/322] test nosleep w/o fullscreen --- src/sidebar/RoutingResults.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index f33a0ac8..06824f8e 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -298,7 +298,7 @@ function createSingletonListContent(props: RoutingResultsProps) { path={props.selectedPath} isSelected={true} profile={props.profile} - fullscreenForTN={true} + fullscreenForTN={false} turnNavigation={props.turnNavigation} /> ) From 2d4d102235958b565a370f6aee658471e6e3e35e Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 23 Dec 2022 12:35:03 +0100 Subject: [PATCH 182/322] move NoSleep into TN state --- src/App.tsx | 7 ++++++- src/sidebar/RoutingResults.tsx | 2 +- src/stores/TurnNavigationStore.ts | 9 ++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index f82910ba..fb841576 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -252,6 +252,9 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, turnNav if (turnNavigation.showUI) return ( <> +
    + {turnNavigation.noSleep.isEnabled ? "locked" : "NoSleep" } +
    @@ -293,7 +296,9 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, turnNav
    - +
    + {turnNavigation.noSleep.isEnabled ? "locked" : "NoSleep" } +
    ) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 81f4e285..3956383e 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -31,8 +31,6 @@ import * as config from 'config' import { Instruction, Path, RoutingArgs } from '@/api/graphhopper' import { tr } from '@/translation/Translation' import { SpeechSynthesizer } from '@/SpeechSynthesizer' -import { getMap } from '@/map/map' -import { toLonLat } from 'ol/proj' import { Pixel } from 'ol/pixel' export interface TurnNavigationStoreState { @@ -50,6 +48,7 @@ export interface TurnNavigationStoreState { activeProfile: string customModel: CustomModel | null rerouteInProgress: boolean + noSleep: NoSleep settings: TNSettingsState instruction: TNInstructionState pathDetails: TNPathDetailsState @@ -87,7 +86,6 @@ export default class TurnNavigationStore extends Store private readonly api: Api private watchId: any = undefined private interval: any - private noSleep = new NoSleep() private readonly speechSynthesizer: SpeechSynthesizer private readonly cs: MapCoordinateSystem @@ -112,6 +110,7 @@ export default class TurnNavigationStore extends Store lastRerouteTime: 0, lastRerouteDistanceToRoute: 0, activeProfile: '', + noSleep: new NoSleep(), settings: { acceptedRisk: false, fakeGPS: fakeGPS, soundEnabled: !fakeGPS } as TNSettingsState, instruction: {} as TNInstructionState, pathDetails: {} as TNPathDetailsState, @@ -487,7 +486,7 @@ export default class TurnNavigationStore extends Store } private initReal(doFullscreen: boolean) { - this.noSleep.enable() + this.state.noSleep.enable() if (!navigator.geolocation) { console.log('location not supported. In firefox I had to set geo.enabled=true in about:config') } else { @@ -528,6 +527,6 @@ export default class TurnNavigationStore extends Store if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) - if (this.noSleep) this.noSleep.disable() + this.state.noSleep.disable() } } From 2fa622b014a9477a1a313af9e92ea98b124ea2fa Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 23 Dec 2022 12:54:46 +0100 Subject: [PATCH 183/322] remove nosleep text --- src/App.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index fb841576..82132d75 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -252,9 +252,6 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, turnNav if (turnNavigation.showUI) return ( <> -
    - {turnNavigation.noSleep.isEnabled ? "locked" : "NoSleep" } -
    @@ -296,9 +293,6 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, info, turnNav
    -
    - {turnNavigation.noSleep.isEnabled ? "locked" : "NoSleep" } -
    Date: Sun, 1 Jan 2023 13:25:15 +0100 Subject: [PATCH 184/322] proper arrow animation that requires other features in same layer --- src/actions/Actions.ts | 19 +-- src/layers/UsePathsLayer.tsx | 222 ++++++++++++++++++++++---- src/map/ContextMenuContent.tsx | 2 +- src/stores/MapActionReceiver.ts | 50 ++---- src/stores/TurnNavigationStore.ts | 15 +- src/turnNavigation/TurnNavigation.tsx | 3 +- 6 files changed, 219 insertions(+), 92 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 94cd9216..fde92123 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -25,9 +25,9 @@ export class TurnNavigationStart implements Action { export class LocationUpdate implements Action { readonly coordinate: Coordinate readonly speed: number - readonly heading: number + readonly heading?: number - constructor(coordinate: Coordinate, speed: number, heading: number) { + constructor(coordinate: Coordinate, speed: number, heading?: number) { this.coordinate = coordinate this.speed = speed this.heading = heading @@ -207,22 +207,11 @@ export class ZoomMapToPoint implements Action { readonly coordinate: Coordinate readonly zoom: number readonly pitch: number - // in degrees, if null then map rotation stays - readonly heading: number | null - readonly navigationOffset: boolean - - constructor( - coordinate: Coordinate, - zoom: number, - pitch: number, - navigationOffset: boolean, - heading: number | null - ) { + + constructor(coordinate: Coordinate, zoom: number, pitch: number) { this.coordinate = coordinate this.zoom = zoom this.pitch = pitch - this.heading = heading - this.navigationOffset = navigationOffset } } diff --git a/src/layers/UsePathsLayer.tsx b/src/layers/UsePathsLayer.tsx index ca44fb9c..18a9e5a3 100644 --- a/src/layers/UsePathsLayer.tsx +++ b/src/layers/UsePathsLayer.tsx @@ -1,11 +1,11 @@ -import { Map } from 'ol' +import { Feature, Map } from 'ol' import { Path } from '@/api/graphhopper' import { FeatureCollection } from 'geojson' -import { useEffect } from 'react' +import { useEffect, useState } from 'react' import VectorLayer from 'ol/layer/Vector' import VectorSource from 'ol/source/Vector' import { GeoJSON } from 'ol/format' -import { Stroke, Style } from 'ol/style' +import { Icon, Stroke, Style } from 'ol/style' import { fromLonLat } from 'ol/proj' import { Select } from 'ol/interaction' import { click } from 'ol/events/condition' @@ -14,26 +14,61 @@ import { SetSelectedPath } from '@/actions/Actions' import { SelectEvent } from 'ol/interaction/Select' import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import { RouteStoreState } from '@/stores/RouteStore' +import { Coordinate } from '@/stores/QueryStore' +import { Geometry, LineString, Point } from 'ol/geom' +import Event from 'ol/render/Event' +import { getVectorContext } from 'ol/render' +import { toRadians } from '@/turnNavigation/GeoMethods' const pathsLayerKey = 'pathsLayer' const selectedPathLayerKey = 'selectedPathLayer' +// we need a filled version of navigation.svg +const svgArrowData = + '' + + '' + + '' + + '' + export default function usePathsLayer(map: Map, route: RouteStoreState, turnNavigation: TurnNavigationStoreState) { + const [oldCoordinate, setOldCoordinate] = useState(turnNavigation.coordinate) + const [oldRotation, setOldRotation] = useState(toRotation(map, turnNavigation.heading)) + useEffect(() => { removeCurrentPathLayers(map) if (turnNavigation.showUI && turnNavigation.activePath != null) { - addSelectedPathsLayer(map, turnNavigation.activePath) + addSelectedPathsLayer(map, turnNavigation.activePath, turnNavigation) } else { addUnselectedPathsLayer( map, route.routingResult.paths.filter(p => p != route.selectedPath) ) - addSelectedPathsLayer(map, route.selectedPath) + addSelectedPathsLayer(map, route.selectedPath, turnNavigation) } return () => { removeCurrentPathLayers(map) } }, [map, route.routingResult.paths, route.selectedPath, turnNavigation.showUI, turnNavigation.activePath]) + + useEffect(() => { + let animation: InBetweenArrowAnimation | null = null + const layer = findSelectedPathLayer(map) + const rotation = toRotation(map, turnNavigation.heading) + if (oldCoordinate.lat != 0 && oldCoordinate.lng != 0 && layer.getSource().getFeatures().length == 2) { + const feature = layer.getSource().getFeatures()[1] as Feature + animation = new InBetweenArrowAnimation(map, layer, feature) + animation.startAnimation(oldCoordinate, turnNavigation.coordinate, oldRotation, rotation) + } + setOldCoordinate(turnNavigation.coordinate) + setOldRotation(rotation) + return () => { + animation?.stopAnimation() + } + }, [map, turnNavigation.coordinate]) +} + +function toRotation(map: Map, heading?: number) { + return heading && !Number.isNaN(heading) ? -toRadians(heading) : map.getView().getRotation() } function removeCurrentPathLayers(map: Map) { @@ -79,22 +114,38 @@ function addUnselectedPathsLayer(map: Map, paths: Path[]) { map.addInteraction(select) } -function addSelectedPathsLayer(map: Map, selectedPath: Path) { - const layer = new VectorLayer({ - source: new VectorSource({ - features: new GeoJSON().readFeatures(createSelectedPath(selectedPath)), +function addSelectedPathsLayer(map: Map, selectedPath: Path, turnNavigation: TurnNavigationStoreState) { + const styles = { + LineString: new Style({ + stroke: new Stroke({ + color: '#275DAD', + width: 6, + lineCap: 'round', + lineJoin: 'round', + }), }), - style: () => - new Style({ - stroke: new Stroke({ - color: '#275DAD', - width: 6, - lineCap: 'round', - lineJoin: 'round', - }), + Point: new Style({ + image: new Icon({ + displacement: [0, 0], + src: 'data:image/svg+xml;utf8,' + svgArrowData, }), + }), + } as { [key: string]: Style } + const features = [ + new Feature({ + properties: { type: 'LineString' }, + geometry: new LineString(selectedPath.points.coordinates.map(c => fromLonLat(c))), + }), + ] as Feature[] + const coord = turnNavigation.coordinate + if (coord != null) features.push(new Feature({ geometry: new Point(fromLonLat([coord.lng, coord.lat])) })) + + const layer = new VectorLayer({ + source: new VectorSource({ features: features }), + style: feature => styles[(feature.getGeometry() as Geometry).getType()], opacity: 0.8, }) + layer.set(selectedPathLayerKey, true) layer.setZIndex(2) map.addLayer(layer) @@ -119,26 +170,129 @@ function createUnselectedPaths(paths: Path[]) { return featureCollection } -function createSelectedPath(path: Path) { - const featureCollection: FeatureCollection = { - type: 'FeatureCollection', - features: [ - { - type: 'Feature', - properties: {}, - geometry: { - ...path.points, - coordinates: path.points.coordinates.map(c => fromLonLat(c)), - }, - }, - ], - } - return featureCollection -} - function removeSelectPathInteractions(map: Map) { map.getInteractions() .getArray() .filter(i => i.get('gh:select_path_interaction')) .forEach(i => map.removeInteraction(i)) } + +function findSelectedPathLayer(map: Map): any { + const layers = map + .getLayers() + .getArray() + .filter(l => l.get(selectedPathLayerKey)) + return layers.length > 0 && layers[0] instanceof VectorLayer && layers[0].getSource() instanceof VectorSource + ? layers[0] + : null +} + +class InBetweenArrowAnimation { + animating: boolean = false + lastTime: number = 0.0 + progress: number = 0.0 + startCoord: Coordinate = { lat: 0, lng: 0 } + endCoord: Coordinate = { lat: 0, lng: 0 } + startRotation: number = 0 + deltaRot: number = 0 + + private readonly map: Map + private readonly mf + private readonly vectorLayer: VectorLayer + private readonly feature: Feature + private readonly arrowStyle = new Style({ + image: new Icon({ + displacement: [0, 0], + src: 'data:image/svg+xml;utf8,' + svgArrowData, + }), + }) + + constructor(map: Map, vectorLayer: VectorLayer, feature: Feature) { + this.map = map + // ensure that we call "on" and "un" with the same function + this.mf = this.moveFeature.bind(this) + this.feature = feature + this.vectorLayer = vectorLayer + } + + startAnimation(startCoord: Coordinate, endCoord: Coordinate, startRotation: number, endRotation: number) { + if (this.animating) { + console.log('Ignore startAnimation') + return + } + + console.log('startAnimation') + this.animating = true + this.progress = 0 + this.lastTime = Date.now() + this.startCoord.lat = startCoord.lat + this.startCoord.lng = startCoord.lng + this.endCoord.lat = endCoord.lat + this.endCoord.lng = endCoord.lng + this.startRotation = startRotation + // ensure that it uses the smallest rotation. E.g. from 0.1 to 6.2 is is only ~0.18 [rad] but it would rotate nearly 2*pi [rad] + let deltaRot = endRotation - this.startRotation + if (deltaRot > Math.PI) deltaRot = deltaRot - 2 * Math.PI + else if (deltaRot < -Math.PI) deltaRot = deltaRot + 2 * Math.PI + this.deltaRot = deltaRot + this.vectorLayer.on('postrender', this.mf) + + // We have to remove the image before we move it but this only works if there is another feature like the line. + // If not, then the postrender method is never triggered. + this.feature.setGeometry(undefined) + } + + stopAnimation() { + if (!this.animating) { + console.log('Ignore stopAnimation') + return + } + console.log('stopAnimation') + this.animating = false + this.progress = 0 + this.lastTime = -1 + + this.feature.setGeometry(new Point(fromLonLat([this.endCoord.lng, this.endCoord.lat]))) + this.feature.setStyle(this.arrowStyle) + this.vectorLayer.un('postrender', this.mf) + } + + moveFeature(event: Event) { + if (!this.animating) { + console.log('Ignored moveFeature') + return + } + + if (event.frameState == undefined) { + console.log('event.frameState undefined') + return + } + + const time = event.frameState.time + const elapsedTime = time - this.lastTime + this.progress = this.progress + elapsedTime / 1000.0 + this.lastTime = time + if (this.progress > 1) { + // make end coordinate permanent + this.stopAnimation() + return + } + let coord = { lat: this.startCoord.lat, lng: this.startCoord.lng } + coord.lat = this.startCoord.lat + (this.endCoord.lat - this.startCoord.lat) * this.progress + coord.lng = this.startCoord.lng + (this.endCoord.lng - this.startCoord.lng) * this.progress + const vectorContext = getVectorContext(event) + vectorContext.setStyle(this.arrowStyle) + vectorContext.drawGeometry(new Point(fromLonLat([coord.lng, coord.lat]))) + // better? vectorContext.drawFeature(this.feature, this.arrowStyle) + + // this does not work as animation is triggered only after + // this.map.getView().cancelAnimations() + // this.map.getView().animate({center: fromLonLat([coord.lng, coord.lat])}) + + this.map.getView().setCenter(fromLonLat([coord.lng, coord.lat])) + this.map.getView().setRotation(this.startRotation + this.deltaRot * this.progress) + + // tell OpenLayers to continue the postrender animation + this.map.render() + } +} diff --git a/src/map/ContextMenuContent.tsx b/src/map/ContextMenuContent.tsx index 4c4c31d3..3c16b113 100644 --- a/src/map/ContextMenuContent.tsx +++ b/src/map/ContextMenuContent.tsx @@ -112,7 +112,7 @@ export function ContextMenuContent({ className={styles.entry} onClick={() => { onSelect() - Dispatcher.dispatch(new ZoomMapToPoint(coordinate, 8, 0, false, null)) + Dispatcher.dispatch(new ZoomMapToPoint(coordinate, 8, 0)) }} > {tr('center_map')} diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 9d7d25dc..09d91ef4 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -14,7 +14,6 @@ import { import RouteStore from '@/stores/RouteStore' import { Bbox } from '@/api/graphhopper' import { Zoom } from 'ol/control' -import { toRadians } from '@/turnNavigation/GeoMethods' export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -38,6 +37,10 @@ export default class MapActionReceiver implements ActionReceiver { } else if (action instanceof TurnNavigationStop) { if (this.zoomCtrl !== null) this.map.getControls().insertAt(this.map.getControls().getLength() - 1, this.zoomCtrl) + + // reset padding + this.map.getView().padding = [0, 0, 0, 0] + this.map.getView().animate({ rotation: 0, zoom: 12, duration: 600 }) } else if (action instanceof TurnNavigationStart) { const arr = this.map.getControls() for (let i = 0; i < arr.getLength(); i++) { @@ -47,39 +50,20 @@ export default class MapActionReceiver implements ActionReceiver { break } } + // move center a bit down + const size = this.map.getSize() // [width, height] + this.map.getView().padding = [size ? size[1] / 2 : 0, 0, 0, 0] + this.map.getView().animate({ + zoom: 15, + duration: 600, + }) } else if (action instanceof ZoomMapToPoint) { - // if navigating then move icon (in center) to the lower half - if (action.navigationOffset) { - const size = this.map.getSize() // [width, height] - this.map.getView().padding = [size ? size[1] / 2 : 0, 0, 0, 0] - } - - // The heading is in degrees and shows direction into which device is going. - // And although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. - const rotation = - action.heading === null || Number.isNaN(action.heading) - ? this.map.getView().getRotation() - : -toRadians(action.heading) - this.map.getView().animate( - { - zoom: action.zoom, - center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), - rotation: rotation, - duration: 900, // 1s simulates a smooth location change as we expect a location update every 1s too - }, - () => { - // After animation render the arrow i.e. it can be out of synch with the map but only until the next location update and only window resizes. - // Animating the move of the arrow on the map AND keeping the view in sync with it is much more than these 4 lines. - const pixels = this.map.getPixelFromCoordinate( - fromLonLat([action.coordinate.lng, action.coordinate.lat]) - ) - const myLayer = document.getElementById('filledNavi') as HTMLElement | null - if (myLayer != null) { - myLayer.style.left = pixels[0] - 24 + 'px' - myLayer.style.top = pixels[1] - 24 + 'px' - } - } - ) + // TODO use action.pitch + this.map.getView().animate({ + zoom: action.zoom, + center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), + duration: 600, + }) } else if (action instanceof RouteRequestSuccess) { // this assumes that always the first path is selected as result. One could use the // state of the routeStore as well, but then we would have to make sure that the route diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 3956383e..fcfca44f 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -42,7 +42,7 @@ export interface TurnNavigationStoreState { lastRerouteTime: number lastRerouteDistanceToRoute: number speed: number - heading: number + heading?: number initialPath: Path | null activePath: Path | null activeProfile: string @@ -102,7 +102,6 @@ export default class TurnNavigationStore extends Store oldTiles: tiles, coordinate: { lat: 0, lng: 0 }, speed: 0, - heading: 0, initialPath: null, activePath: null, customModel: null, @@ -215,7 +214,7 @@ export default class TurnNavigationStore extends Store let queriedAPI = false if (state.activeProfile && !state.rerouteInProgress) { const toCoordinate = TurnNavigationStore.getWaypoint(path, instr.nextWaypointIndex) - const args: RoutingArgs = { + let args: RoutingArgs = { points: [ [coordinate.lng, coordinate.lat], [toCoordinate.lng, toCoordinate.lat], @@ -256,7 +255,10 @@ export default class TurnNavigationStore extends Store } } - if (instr.index < 0) throw new Error('Instruction should be valid if distanceToRoute is small') + if (instr.index < 0) { + console.error('Instruction cannot be determined. Current location too far away? ' + coordinate) + return state + } const [estimatedAvgSpeed, maxSpeed, surface, roadClass] = getCurrentDetails(path, coordinate, [ path.details.average_speed, @@ -418,7 +420,7 @@ export default class TurnNavigationStore extends Store prevCoord.lng = coord[0] prevCoord.lat = coord[1] - }, 3000) + }, 1100) return } @@ -481,8 +483,7 @@ export default class TurnNavigationStore extends Store private locationUpdate(pos: any) { let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } - Dispatcher.dispatch(new ZoomMapToPoint(c, 17, 50, true, pos.coords.heading)) - Dispatcher.dispatch(new LocationUpdate(c, pos.coords.speed, pos.coords.heading ? pos.coords.heading : 0)) + Dispatcher.dispatch(new LocationUpdate(c, pos.coords.speed, pos.coords.heading)) } private initReal(doFullscreen: boolean) { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 6bf7c165..4fbdb8b6 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -5,7 +5,7 @@ import styles from '@/turnNavigation/TurnNavigation.module.css' import EndNavigation from '@/sidebar/times-solid.svg' import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import Dispatcher from '@/stores/Dispatcher' -import { SelectMapLayer, TurnNavigationStop, ZoomMapToPoint } from '@/actions/Actions' +import { SelectMapLayer, TurnNavigationStop } from '@/actions/Actions' import PlainButton from '@/PlainButton' export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { @@ -70,7 +70,6 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto onClick={() => { Dispatcher.dispatch(new SelectMapLayer(turnNavigation.oldTiles)) Dispatcher.dispatch(new TurnNavigationStop()) - Dispatcher.dispatch(new ZoomMapToPoint(turnNavigation.coordinate, 15, 0, false, 0)) }} > From 9f8778479ca3bd8ca2bd9057ee3d6c9722450c50 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 7 Jan 2023 14:07:44 +0100 Subject: [PATCH 185/322] move back to simpler view-animation-synchronization, see https://stackoverflow.com/q/75004551/194609 --- src/actions/Actions.ts | 4 +- src/layers/UsePathsLayer.tsx | 166 +----------------------------- src/map/ContextMenuContent.tsx | 2 +- src/stores/MapActionReceiver.ts | 22 +++- src/stores/TurnNavigationStore.ts | 3 +- 5 files changed, 29 insertions(+), 168 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index fde92123..95bb76cc 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -207,11 +207,13 @@ export class ZoomMapToPoint implements Action { readonly coordinate: Coordinate readonly zoom: number readonly pitch: number + readonly heading: number - constructor(coordinate: Coordinate, zoom: number, pitch: number) { + constructor(coordinate: Coordinate, zoom: number, pitch: number, heading: number) { this.coordinate = coordinate this.zoom = zoom this.pitch = pitch + this.heading = heading } } diff --git a/src/layers/UsePathsLayer.tsx b/src/layers/UsePathsLayer.tsx index 18a9e5a3..ad52eeb9 100644 --- a/src/layers/UsePathsLayer.tsx +++ b/src/layers/UsePathsLayer.tsx @@ -1,11 +1,11 @@ import { Feature, Map } from 'ol' import { Path } from '@/api/graphhopper' import { FeatureCollection } from 'geojson' -import { useEffect, useState } from 'react' +import { useEffect } from 'react' import VectorLayer from 'ol/layer/Vector' import VectorSource from 'ol/source/Vector' import { GeoJSON } from 'ol/format' -import { Icon, Stroke, Style } from 'ol/style' +import { Stroke, Style } from 'ol/style' import { fromLonLat } from 'ol/proj' import { Select } from 'ol/interaction' import { click } from 'ol/events/condition' @@ -14,26 +14,12 @@ import { SetSelectedPath } from '@/actions/Actions' import { SelectEvent } from 'ol/interaction/Select' import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import { RouteStoreState } from '@/stores/RouteStore' -import { Coordinate } from '@/stores/QueryStore' import { Geometry, LineString, Point } from 'ol/geom' -import Event from 'ol/render/Event' -import { getVectorContext } from 'ol/render' -import { toRadians } from '@/turnNavigation/GeoMethods' const pathsLayerKey = 'pathsLayer' const selectedPathLayerKey = 'selectedPathLayer' -// we need a filled version of navigation.svg -const svgArrowData = - '' + - '' + - '' + - '' - export default function usePathsLayer(map: Map, route: RouteStoreState, turnNavigation: TurnNavigationStoreState) { - const [oldCoordinate, setOldCoordinate] = useState(turnNavigation.coordinate) - const [oldRotation, setOldRotation] = useState(toRotation(map, turnNavigation.heading)) - useEffect(() => { removeCurrentPathLayers(map) if (turnNavigation.showUI && turnNavigation.activePath != null) { @@ -49,26 +35,6 @@ export default function usePathsLayer(map: Map, route: RouteStoreState, turnNavi removeCurrentPathLayers(map) } }, [map, route.routingResult.paths, route.selectedPath, turnNavigation.showUI, turnNavigation.activePath]) - - useEffect(() => { - let animation: InBetweenArrowAnimation | null = null - const layer = findSelectedPathLayer(map) - const rotation = toRotation(map, turnNavigation.heading) - if (oldCoordinate.lat != 0 && oldCoordinate.lng != 0 && layer.getSource().getFeatures().length == 2) { - const feature = layer.getSource().getFeatures()[1] as Feature - animation = new InBetweenArrowAnimation(map, layer, feature) - animation.startAnimation(oldCoordinate, turnNavigation.coordinate, oldRotation, rotation) - } - setOldCoordinate(turnNavigation.coordinate) - setOldRotation(rotation) - return () => { - animation?.stopAnimation() - } - }, [map, turnNavigation.coordinate]) -} - -function toRotation(map: Map, heading?: number) { - return heading && !Number.isNaN(heading) ? -toRadians(heading) : map.getView().getRotation() } function removeCurrentPathLayers(map: Map) { @@ -123,13 +89,7 @@ function addSelectedPathsLayer(map: Map, selectedPath: Path, turnNavigation: Tur lineCap: 'round', lineJoin: 'round', }), - }), - Point: new Style({ - image: new Icon({ - displacement: [0, 0], - src: 'data:image/svg+xml;utf8,' + svgArrowData, - }), - }), + }) } as { [key: string]: Style } const features = [ new Feature({ @@ -176,123 +136,3 @@ function removeSelectPathInteractions(map: Map) { .filter(i => i.get('gh:select_path_interaction')) .forEach(i => map.removeInteraction(i)) } - -function findSelectedPathLayer(map: Map): any { - const layers = map - .getLayers() - .getArray() - .filter(l => l.get(selectedPathLayerKey)) - return layers.length > 0 && layers[0] instanceof VectorLayer && layers[0].getSource() instanceof VectorSource - ? layers[0] - : null -} - -class InBetweenArrowAnimation { - animating: boolean = false - lastTime: number = 0.0 - progress: number = 0.0 - startCoord: Coordinate = { lat: 0, lng: 0 } - endCoord: Coordinate = { lat: 0, lng: 0 } - startRotation: number = 0 - deltaRot: number = 0 - - private readonly map: Map - private readonly mf - private readonly vectorLayer: VectorLayer - private readonly feature: Feature - private readonly arrowStyle = new Style({ - image: new Icon({ - displacement: [0, 0], - src: 'data:image/svg+xml;utf8,' + svgArrowData, - }), - }) - - constructor(map: Map, vectorLayer: VectorLayer, feature: Feature) { - this.map = map - // ensure that we call "on" and "un" with the same function - this.mf = this.moveFeature.bind(this) - this.feature = feature - this.vectorLayer = vectorLayer - } - - startAnimation(startCoord: Coordinate, endCoord: Coordinate, startRotation: number, endRotation: number) { - if (this.animating) { - console.log('Ignore startAnimation') - return - } - - console.log('startAnimation') - this.animating = true - this.progress = 0 - this.lastTime = Date.now() - this.startCoord.lat = startCoord.lat - this.startCoord.lng = startCoord.lng - this.endCoord.lat = endCoord.lat - this.endCoord.lng = endCoord.lng - this.startRotation = startRotation - // ensure that it uses the smallest rotation. E.g. from 0.1 to 6.2 is is only ~0.18 [rad] but it would rotate nearly 2*pi [rad] - let deltaRot = endRotation - this.startRotation - if (deltaRot > Math.PI) deltaRot = deltaRot - 2 * Math.PI - else if (deltaRot < -Math.PI) deltaRot = deltaRot + 2 * Math.PI - this.deltaRot = deltaRot - this.vectorLayer.on('postrender', this.mf) - - // We have to remove the image before we move it but this only works if there is another feature like the line. - // If not, then the postrender method is never triggered. - this.feature.setGeometry(undefined) - } - - stopAnimation() { - if (!this.animating) { - console.log('Ignore stopAnimation') - return - } - console.log('stopAnimation') - this.animating = false - this.progress = 0 - this.lastTime = -1 - - this.feature.setGeometry(new Point(fromLonLat([this.endCoord.lng, this.endCoord.lat]))) - this.feature.setStyle(this.arrowStyle) - this.vectorLayer.un('postrender', this.mf) - } - - moveFeature(event: Event) { - if (!this.animating) { - console.log('Ignored moveFeature') - return - } - - if (event.frameState == undefined) { - console.log('event.frameState undefined') - return - } - - const time = event.frameState.time - const elapsedTime = time - this.lastTime - this.progress = this.progress + elapsedTime / 1000.0 - this.lastTime = time - if (this.progress > 1) { - // make end coordinate permanent - this.stopAnimation() - return - } - let coord = { lat: this.startCoord.lat, lng: this.startCoord.lng } - coord.lat = this.startCoord.lat + (this.endCoord.lat - this.startCoord.lat) * this.progress - coord.lng = this.startCoord.lng + (this.endCoord.lng - this.startCoord.lng) * this.progress - const vectorContext = getVectorContext(event) - vectorContext.setStyle(this.arrowStyle) - vectorContext.drawGeometry(new Point(fromLonLat([coord.lng, coord.lat]))) - // better? vectorContext.drawFeature(this.feature, this.arrowStyle) - - // this does not work as animation is triggered only after - // this.map.getView().cancelAnimations() - // this.map.getView().animate({center: fromLonLat([coord.lng, coord.lat])}) - - this.map.getView().setCenter(fromLonLat([coord.lng, coord.lat])) - this.map.getView().setRotation(this.startRotation + this.deltaRot * this.progress) - - // tell OpenLayers to continue the postrender animation - this.map.render() - } -} diff --git a/src/map/ContextMenuContent.tsx b/src/map/ContextMenuContent.tsx index 3c16b113..ab635b2d 100644 --- a/src/map/ContextMenuContent.tsx +++ b/src/map/ContextMenuContent.tsx @@ -112,7 +112,7 @@ export function ContextMenuContent({ className={styles.entry} onClick={() => { onSelect() - Dispatcher.dispatch(new ZoomMapToPoint(coordinate, 8, 0)) + Dispatcher.dispatch(new ZoomMapToPoint(coordinate, 8, 0, 0)) }} > {tr('center_map')} diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 09d91ef4..286b42eb 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -14,6 +14,7 @@ import { import RouteStore from '@/stores/RouteStore' import { Bbox } from '@/api/graphhopper' import { Zoom } from 'ol/control' +import {toRadians} from "@/turnNavigation/GeoMethods"; export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -58,11 +59,28 @@ export default class MapActionReceiver implements ActionReceiver { duration: 600, }) } else if (action instanceof ZoomMapToPoint) { - // TODO use action.pitch + // The heading is in degrees and shows direction into which device is going. + // And although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. + const rotation = + action.heading === null || Number.isNaN(action.heading) + ? this.map.getView().getRotation() + : -toRadians(action.heading) + + this.map.getView().cancelAnimations() this.map.getView().animate({ zoom: action.zoom, center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), - duration: 600, + rotation: rotation, + duration: 950, // 1s simulates a smooth location change as we expect a location update every 1s too + }, () => { + // After animation render the arrow i.e. it can be out of synch with the map but only until the next location update and only window resizes. + // Animating the move of the arrow on the map AND keeping the view in sync with it is much more than these 4 lines. + const pixels = this.map.getPixelFromCoordinate(fromLonLat([action.coordinate.lng, action.coordinate.lat])); + const myLayer = document.getElementById("filledNavi") as HTMLElement | null + if(myLayer != null) { + myLayer.style.left = (pixels[0] - 24) + 'px'; + myLayer.style.top = (pixels[1] - 24) + 'px'; + } }) } else if (action instanceof RouteRequestSuccess) { // this assumes that always the first path is selected as result. One could use the diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index fcfca44f..d3aff5d3 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -478,11 +478,12 @@ export default class TurnNavigationStore extends Store speed: latlon[currentIndex][3], }, }) - }, 3000) + }, 1000) } private locationUpdate(pos: any) { let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } + Dispatcher.dispatch(new ZoomMapToPoint(c, 16, 0, pos.coords.heading)) Dispatcher.dispatch(new LocationUpdate(c, pos.coords.speed, pos.coords.heading)) } From b7988b5ae7061bda196c8d7f8ff4bdc6191bb920 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 7 Jan 2023 16:33:30 +0100 Subject: [PATCH 186/322] use linear easing to make transition smoother --- src/stores/MapActionReceiver.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 286b42eb..13366df5 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -15,6 +15,7 @@ import RouteStore from '@/stores/RouteStore' import { Bbox } from '@/api/graphhopper' import { Zoom } from 'ol/control' import {toRadians} from "@/turnNavigation/GeoMethods"; +import {linear} from "ol/easing"; export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -71,6 +72,7 @@ export default class MapActionReceiver implements ActionReceiver { zoom: action.zoom, center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), rotation: rotation, + easing: linear, duration: 950, // 1s simulates a smooth location change as we expect a location update every 1s too }, () => { // After animation render the arrow i.e. it can be out of synch with the map but only until the next location update and only window resizes. From a06359070f3b9bfae699279ab87a13c977c359f0 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 7 Jan 2023 16:50:42 +0100 Subject: [PATCH 187/322] show real speed and ignore mouse out of map --- src/layers/UsePathsLayer.tsx | 2 +- src/stores/MapActionReceiver.ts | 39 +++++++++++++++++-------------- src/stores/TurnNavigationStore.ts | 23 ++++++++++++++---- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/layers/UsePathsLayer.tsx b/src/layers/UsePathsLayer.tsx index ad52eeb9..b96cf707 100644 --- a/src/layers/UsePathsLayer.tsx +++ b/src/layers/UsePathsLayer.tsx @@ -89,7 +89,7 @@ function addSelectedPathsLayer(map: Map, selectedPath: Path, turnNavigation: Tur lineCap: 'round', lineJoin: 'round', }), - }) + }), } as { [key: string]: Style } const features = [ new Feature({ diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 13366df5..bce89073 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -14,8 +14,8 @@ import { import RouteStore from '@/stores/RouteStore' import { Bbox } from '@/api/graphhopper' import { Zoom } from 'ol/control' -import {toRadians} from "@/turnNavigation/GeoMethods"; -import {linear} from "ol/easing"; +import { toRadians } from '@/turnNavigation/GeoMethods' +import { linear } from 'ol/easing' export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -68,22 +68,27 @@ export default class MapActionReceiver implements ActionReceiver { : -toRadians(action.heading) this.map.getView().cancelAnimations() - this.map.getView().animate({ - zoom: action.zoom, - center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), - rotation: rotation, - easing: linear, - duration: 950, // 1s simulates a smooth location change as we expect a location update every 1s too - }, () => { - // After animation render the arrow i.e. it can be out of synch with the map but only until the next location update and only window resizes. - // Animating the move of the arrow on the map AND keeping the view in sync with it is much more than these 4 lines. - const pixels = this.map.getPixelFromCoordinate(fromLonLat([action.coordinate.lng, action.coordinate.lat])); - const myLayer = document.getElementById("filledNavi") as HTMLElement | null - if(myLayer != null) { - myLayer.style.left = (pixels[0] - 24) + 'px'; - myLayer.style.top = (pixels[1] - 24) + 'px'; + this.map.getView().animate( + { + zoom: action.zoom, + center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), + rotation: rotation, + easing: linear, + duration: 950, // 1s simulates a smooth location change as we expect a location update every 1s too + }, + () => { + // After animation render the arrow i.e. it can be out of synch with the map but only until the next location update and only window resizes. + // Animating the move of the arrow on the map AND keeping the view in sync with it is much more than these 4 lines. + const pixels = this.map.getPixelFromCoordinate( + fromLonLat([action.coordinate.lng, action.coordinate.lat]) + ) + const myLayer = document.getElementById('filledNavi') as HTMLElement | null + if (myLayer != null) { + myLayer.style.left = pixels[0] - 24 + 'px' + myLayer.style.top = pixels[1] - 24 + 'px' + } } - }) + ) } else if (action instanceof RouteRequestSuccess) { // this assumes that always the first path is selected as result. One could use the // state of the routeStore as well, but then we would have to make sure that the route diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index d3aff5d3..547caaa3 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -256,7 +256,9 @@ export default class TurnNavigationStore extends Store } if (instr.index < 0) { - console.error('Instruction cannot be determined. Current location too far away? ' + coordinate) + console.error( + 'Instruction cannot be determined. Current location too far away? ' + JSON.stringify(coordinate) + ) return state } @@ -399,28 +401,39 @@ export default class TurnNavigationStore extends Store let mouseControlled = true // control GPS movement via mouse or see below: along a predefined route if (mouseControlled) { - let pixel = [] as number[] + const pixel = [] as number[] let prevCoord = { lng: 0, lat: 0 } as Coordinate + let prevTime = Date.now() addEventListener('mousemove', event => { pixel[0] = event.x pixel[1] = event.y }) this.interval = setInterval(() => { + const time = Date.now() / 1000.0 let coord = this.cs.getCoordinateFromPixel(pixel) - let o = calcOrientation(prevCoord.lat, prevCoord.lng, coord[1], coord[0]) + if(!coord[0] || !coord[1]) { + console.warn("mouse out of screen") + return + } + const o = calcOrientation(prevCoord.lat, prevCoord.lng, coord[1], coord[0]) + const distanceInM = calcDist( + { lat: prevCoord.lat, lng: prevCoord.lng }, + { lat: coord[1], lng: coord[0] } + ) this.locationUpdate({ coords: { latitude: coord[1], longitude: coord[0], heading: toDegrees(toNorthBased(o)), - speed: 4, + speed: time - prevTime < 1 ? 0 : distanceInM / (time - prevTime), }, }) prevCoord.lng = coord[0] prevCoord.lat = coord[1] - }, 1100) + prevTime = time + }, 1000) return } From 10479bcc0d1f734d14326d9d4b0a1de34ec5d90d Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 7 Jan 2023 19:13:55 +0100 Subject: [PATCH 188/322] optimize for smaller screen --- src/stores/MapActionReceiver.ts | 21 +++++++++++--------- src/stores/TurnNavigationStore.ts | 4 ++-- src/turnNavigation/TurnNavigation.module.css | 5 +++++ src/turnNavigation/TurnNavigation.tsx | 2 +- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index bce89073..256a3bf6 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -13,7 +13,7 @@ import { } from '@/actions/Actions' import RouteStore from '@/stores/RouteStore' import { Bbox } from '@/api/graphhopper' -import { Zoom } from 'ol/control' +import { Attribution, Zoom } from 'ol/control' import { toRadians } from '@/turnNavigation/GeoMethods' import { linear } from 'ol/easing' @@ -22,6 +22,7 @@ export default class MapActionReceiver implements ActionReceiver { private readonly routeStore: RouteStore private readonly isSmallScreenQuery: () => boolean private zoomCtrl: Zoom | null = null + private attributionCtrl: Attribution | null = null constructor(map: Map, routeStore: RouteStore, isSmallScreenQuery: () => boolean) { this.map = map @@ -37,23 +38,25 @@ export default class MapActionReceiver implements ActionReceiver { // the map has not been rendered for the first time yet fitBounds(this.map, action.bbox, isSmallScreen, [window.innerWidth, window.innerHeight]) } else if (action instanceof TurnNavigationStop) { - if (this.zoomCtrl !== null) - this.map.getControls().insertAt(this.map.getControls().getLength() - 1, this.zoomCtrl) + if (this.zoomCtrl !== null) this.map.getControls().insertAt(0, this.zoomCtrl) + if (this.attributionCtrl !== null) this.map.getControls().insertAt(0, this.attributionCtrl) // reset padding this.map.getView().padding = [0, 0, 0, 0] this.map.getView().animate({ rotation: 0, zoom: 12, duration: 600 }) } else if (action instanceof TurnNavigationStart) { + const size = this.map.getSize() // [width, height] const arr = this.map.getControls() for (let i = 0; i < arr.getLength(); i++) { - if (arr.item(i) instanceof Zoom) { - this.zoomCtrl = arr.item(i) as Zoom - arr.remove(this.zoomCtrl) - break - } + if (arr.item(i) instanceof Zoom) this.zoomCtrl = arr.item(i) as Zoom + else if (arr.item(i) instanceof Attribution && size && size[1] < 840) + // remove attribution if height too small + this.attributionCtrl = arr.item(i) as Attribution } + if (this.zoomCtrl) arr.remove(this.zoomCtrl) + if (this.attributionCtrl) arr.remove(this.attributionCtrl) + // move center a bit down - const size = this.map.getSize() // [width, height] this.map.getView().padding = [size ? size[1] / 2 : 0, 0, 0, 0] this.map.getView().animate({ zoom: 15, diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 547caaa3..d0cdaab9 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -412,8 +412,8 @@ export default class TurnNavigationStore extends Store this.interval = setInterval(() => { const time = Date.now() / 1000.0 let coord = this.cs.getCoordinateFromPixel(pixel) - if(!coord[0] || !coord[1]) { - console.warn("mouse out of screen") + if (!coord[0] || !coord[1]) { + console.warn('mouse out of screen') return } const o = calcOrientation(prevCoord.lat, prevCoord.lng, coord[1], coord[0]) diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 6a3b90d6..eb32cfb6 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -10,6 +10,11 @@ flex-direction: column; justify-content: space-between; } +.instructionText { + font-size: smaller; + overflow: hidden; + height: 20px; +} .turnSign img { padding-top: 0.4rem; diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 4fbdb8b6..bf3c31a8 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -75,7 +75,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
    -
    {instruction.text}
    +
    {instruction.text}
    From 4d3f1552bb3067c19c85776d6c8df77f3ef928e6 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 7 Jan 2023 22:13:23 +0100 Subject: [PATCH 189/322] workaround for Safari --- src/stores/TurnNavigationStore.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index d0cdaab9..42d28513 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -129,6 +129,9 @@ export default class TurnNavigationStore extends Store } else if (action instanceof TurnNavigationSettingsUpdate) { return { ...state, settings: { ...state.settings, ...action.settings } } } else if (action instanceof TurnNavigationStart) { + // Make sound work for Safari 16.1.2. Otherwise, it probably thinks that the LocationUpdates are NOT user-triggered. + this.speechSynthesizer.synthesize('') + if (state.settings.fakeGPS) this.initFake() else this.initReal(action.enableFullscreen) return { ...state, started: true } From 4c8c09c30c352a36fcb15e373f69c06ddff7934f Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 8 Jan 2023 15:38:04 +0100 Subject: [PATCH 190/322] more recent NoSleep.js (include directly) --- package-lock.json | 11 -- package.json | 3 +- src/App.tsx | 1 + src/stores/TurnNavigationStore.ts | 10 +- src/turnNavigation/nosleep.d.ts | 18 +++ src/turnNavigation/nosleep.js | 187 ++++++++++++++++++++++++++++++ 6 files changed, 212 insertions(+), 18 deletions(-) create mode 100644 src/turnNavigation/nosleep.d.ts create mode 100644 src/turnNavigation/nosleep.js diff --git a/package-lock.json b/package-lock.json index 37b0f388..f734ab8d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,6 @@ "custom-model-editor": "github:graphhopper/custom-model-editor#a8c97e4ef8e76c963be375984a3c08ff3c1e8288", "geojson": "^0.5.0", "heightgraph": "github:easbar/Leaflet.Heightgraph#a1014641c35c43490b31cb25d3072e6c1237ed0e", - "nosleep.js": "^0.12.0", "ol": "7.1.0", "ol-mapbox-style": "9.2.0", "react": "^18.2.0", @@ -10243,11 +10242,6 @@ "node": ">=0.10.0" } }, - "node_modules/nosleep.js": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.12.0.tgz", - "integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==" - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -22366,11 +22360,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "nosleep.js": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.12.0.tgz", - "integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==" - }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", diff --git a/package.json b/package.json index 60f6054e..0d3bc7a4 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,7 @@ "ol-mapbox-style": "9.2.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-responsive": "^9.0.0", - "nosleep.js": "^0.12.0" + "react-responsive": "^9.0.0" }, "devDependencies": { "@svgr/webpack": "^6.4.0", diff --git a/src/App.tsx b/src/App.tsx index 82132d75..5ddbf3f8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -124,6 +124,7 @@ export default function App() {
    +
    + ) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx deleted file mode 100644 index dd76ce82..00000000 --- a/src/layers/CurrentLocationLayer.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import React, {useEffect} from 'react' -import {Feature, Map} from 'ol' -import {Point} from 'ol/geom' -import {fromLonLat} from 'ol/proj' -import VectorLayer from 'ol/layer/Vector' -import VectorSource from 'ol/source/Vector' -import {Icon, Style} from 'ol/style' -import {getCenter} from 'ol/extent' -import {TurnNavigationStoreState} from "@/stores/TurnNavigationStore"; - -export default function useCurrentLocationLayer(map: Map, turnNavigation: TurnNavigationStoreState) { - const point = new Point(fromLonLat([turnNavigation.coordinate.lng, turnNavigation.coordinate.lat])) - const feature = new Feature({geometry: point}) - // Synchronize the position of the view animation (see MapActionReceiver) with the arrow via postrender event. - // Note that updateWhileAnimating = true for currentLocationLayer is necessary. - const onPostrender = () => point.setCoordinates(getCenter(map.getView().calculateExtent())) - - useEffect(() => { - if(!turnNavigation.showUI) return - const currentLocationLayer = addCurrentLocation(map, feature) - currentLocationLayer.on('postrender', onPostrender) - - return () => { - if(!turnNavigation.showUI) return - currentLocationLayer.un('postrender', onPostrender) - map.removeLayer(currentLocationLayer) - } - }, [turnNavigation.showUI]) -} - -// we need a filled version of navigation.svg -const svgArrowData = - '' + - '' + - '' + - '' - -function addCurrentLocation(map: Map, feature: Feature) { - const currentLocationLayer = new VectorLayer({ - source: new VectorSource({ - features: [feature] - }), - updateWhileAnimating: true, - updateWhileInteracting: true - }) - currentLocationLayer.set('gh:current_location', true) - currentLocationLayer.setZIndex(3) - currentLocationLayer.setStyle( - () => - new Style({ - image: new Icon({ - displacement: [0, 0], - src: 'data:image/svg+xml;utf8,' + svgArrowData, - }), - }) - ) - map.addLayer(currentLocationLayer) - return currentLocationLayer -} diff --git a/src/layers/UsePathsLayer.tsx b/src/layers/UsePathsLayer.tsx index d303e862..b96cf707 100644 --- a/src/layers/UsePathsLayer.tsx +++ b/src/layers/UsePathsLayer.tsx @@ -22,14 +22,14 @@ const selectedPathLayerKey = 'selectedPathLayer' export default function usePathsLayer(map: Map, route: RouteStoreState, turnNavigation: TurnNavigationStoreState) { useEffect(() => { removeCurrentPathLayers(map) - if (turnNavigation.showUI && turnNavigation.activePath) { - addSelectedPathsLayer(map, turnNavigation.activePath, true) + if (turnNavigation.showUI && turnNavigation.activePath != null) { + addSelectedPathsLayer(map, turnNavigation.activePath, turnNavigation) } else { addUnselectedPathsLayer( map, route.routingResult.paths.filter(p => p != route.selectedPath) ) - addSelectedPathsLayer(map, route.selectedPath, false) + addSelectedPathsLayer(map, route.selectedPath, turnNavigation) } return () => { removeCurrentPathLayers(map) @@ -80,7 +80,7 @@ function addUnselectedPathsLayer(map: Map, paths: Path[]) { map.addInteraction(select) } -function addSelectedPathsLayer(map: Map, selectedPath: Path, updateMoreFrequently: boolean) { +function addSelectedPathsLayer(map: Map, selectedPath: Path, turnNavigation: TurnNavigationStoreState) { const styles = { LineString: new Style({ stroke: new Stroke({ @@ -97,14 +97,13 @@ function addSelectedPathsLayer(map: Map, selectedPath: Path, updateMoreFrequentl geometry: new LineString(selectedPath.points.coordinates.map(c => fromLonLat(c))), }), ] as Feature[] + const coord = turnNavigation.coordinate + if (coord != null) features.push(new Feature({ geometry: new Point(fromLonLat([coord.lng, coord.lat])) })) const layer = new VectorLayer({ source: new VectorSource({ features: features }), style: feature => styles[(feature.getGeometry() as Geometry).getType()], opacity: 0.8, - // when navigating we need this for re-routing: - updateWhileAnimating: updateMoreFrequently, - updateWhileInteracting: updateMoreFrequently }) layer.set(selectedPathLayerKey, true) diff --git a/src/sidebar/filled-navigation.svg b/src/sidebar/filled-navigation.svg new file mode 100644 index 00000000..612caa62 --- /dev/null +++ b/src/sidebar/filled-navigation.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index c25a022f..64c78b12 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -68,15 +68,27 @@ export default class MapActionReceiver implements ActionReceiver { : -toRadians(action.heading) this.map.getView().cancelAnimations() // if location updates are sent too fast animations might stack up - this.map.getView().animate({ - zoom: action.zoom, - center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), - rotation: rotation, - easing: linear, - // We could use 1000ms or more but map tiles won't update probably due to missing updateWhileAnimating. - // For now, due to performance reasons, we set this to true only for the layer. - duration: 800, - }) + this.map.getView().animate( + { + zoom: action.zoom, + center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), + rotation: rotation, + easing: linear, + duration: 800, // we could use 1s but other map render work won't be properly done (e.g. the new route when re-routing won't show up) + }, + () => { + // After animation render the arrow i.e. it can be out of synch with the map but only until the next location update and only window resizes. + // Animating the move of the arrow on the map AND keeping the view in sync with it is much more than these 4 lines. + const pixels = this.map.getPixelFromCoordinate( + fromLonLat([action.coordinate.lng, action.coordinate.lat]) + ) + const myLayer = document.getElementById('filledNavi') as HTMLElement | null + if (myLayer != null) { + myLayer.style.left = pixels[0] - 24 + 'px' + myLayer.style.top = pixels[1] - 24 + 'px' + } + } + ) } else if (action instanceof RouteRequestSuccess) { // this assumes that always the first path is selected as result. One could use the // state of the routeStore as well, but then we would have to make sure that the route From 38816f076e3e81f74073355d4c3680105b1b9347 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 13 Mar 2023 17:28:22 +0100 Subject: [PATCH 207/322] i18n update --- src/translation/tr.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/translation/tr.json b/src/translation/tr.json index 071a3e34..af215389 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -82,7 +82,7 @@ "in_mi":"In %1$s miles", "in_ft":"In %1$s feet", "for_mi":"for %1$s miles", -"warning":"WARNING: The turn-by-turn navigation is highly experimental! Use at your own risk!", +"warning":"WARNING: Turn-by-turn navigation is highly experimental! Use them at your own risk and always follow the road signs!", "accept_risks_after_warning":"I understand and agree", "start_navigation":"Navigation" }, @@ -874,8 +874,8 @@ "in_mi":"In %1$s Meilen", "in_ft":"In %1$s Fuß", "for_mi":"für %1$s Meilen", -"warning":"Achtung: die Navigation ist sehr experimentell! Benutzung auf eigene Gefahr!", -"accept_risks_after_warning":"I verstehe und akzeptiere das Risiko", +"warning":"ACHTUNG: Die Navigation ist höchst experimentell! Verwenden Sie diese auf eigene Gefahr und folgen Sie immer den Straßenschildern!", +"accept_risks_after_warning":"I verstehe und akzeptiere", "start_navigation":"Navigation" }, "el":{ @@ -1417,8 +1417,8 @@ "way_contains":"L'itinéraire inclut %1$s", "tracks":"chemins de terre non pavés", "steps":"pas", -"footways":"", -"steep_sections":"", +"footways":"chemin pédestre", +"steep_sections":"section raide", "start_label":"Départ", "intermediate_label":"Point intermédiaire", "end_label":"Arrivée", @@ -1436,7 +1436,7 @@ "apply_custom_model":"Appliquer", "exclude_motorway_example":"Eviter les Autoroutes", "limit_speed_example":"Vitesse Limite", -"cargo_bike_example":"", +"cargo_bike_example":"Vélo cargo", "exclude_area_example":"Exclure Zone", "combined_example":"Exemple Combiné", "examples_custom_model":"Examples", From 9d24b10f5f6dfa3bdab27cc435cc83b6fed0c557 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 13 Mar 2023 17:57:18 +0100 Subject: [PATCH 208/322] wording --- src/translation/tr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/translation/tr.json b/src/translation/tr.json index af215389..3eceb5ea 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -82,7 +82,7 @@ "in_mi":"In %1$s miles", "in_ft":"In %1$s feet", "for_mi":"for %1$s miles", -"warning":"WARNING: Turn-by-turn navigation is highly experimental! Use them at your own risk and always follow the road signs!", +"warning":"WARNING: The turn-by-turn navigation feature is highly experimental. Use it at your own risk, pay attention to the road and do not touch the device while driving!", "accept_risks_after_warning":"I understand and agree", "start_navigation":"Navigation" }, @@ -874,7 +874,7 @@ "in_mi":"In %1$s Meilen", "in_ft":"In %1$s Fuß", "for_mi":"für %1$s Meilen", -"warning":"ACHTUNG: Die Navigation ist höchst experimentell! Verwenden Sie diese auf eigene Gefahr und folgen Sie immer den Straßenschildern!", +"warning":"ACHTUNG: Die Navigation ist höchst experimentell. Verwenden Sie diese auf eigene Gefahr, achten Sie auf den Straßenverkehr und berühren Sie das Gerät nicht während der Fahrt!", "accept_risks_after_warning":"I verstehe und akzeptiere", "start_navigation":"Navigation" }, From 0ee0abdabba4d3e9591a335acaa04f9c7992b20f Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 13 Mar 2023 22:21:25 +0100 Subject: [PATCH 209/322] i18n fix --- src/translation/tr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/translation/tr.json b/src/translation/tr.json index 3eceb5ea..8215342f 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -875,7 +875,7 @@ "in_ft":"In %1$s Fuß", "for_mi":"für %1$s Meilen", "warning":"ACHTUNG: Die Navigation ist höchst experimentell. Verwenden Sie diese auf eigene Gefahr, achten Sie auf den Straßenverkehr und berühren Sie das Gerät nicht während der Fahrt!", -"accept_risks_after_warning":"I verstehe und akzeptiere", +"accept_risks_after_warning":"Ich verstehe und akzeptiere", "start_navigation":"Navigation" }, "el":{ From c6318b5c15d014c866f61f5b3257097167dd5c2b Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 24 Mar 2023 11:10:02 +0100 Subject: [PATCH 210/322] option to avoid using vector tiles for navigation --- src/App.tsx | 17 +++- src/actions/Actions.ts | 2 + src/sidebar/MobileSidebar.tsx | 9 +- src/sidebar/RoutingResults.tsx | 12 ++- src/sidebar/SettingsBox.tsx | 11 +- src/sidebar/search/Search.tsx | 4 +- src/stores/TurnNavigationStore.ts | 21 +++- src/translation/tr.json | 141 +++++++++++++++++--------- src/turnNavigation/TurnNavigation.tsx | 3 +- 9 files changed, 155 insertions(+), 65 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 3eeaa187..a4dd2074 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -222,7 +222,10 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, encodedValues queryOngoing={query.currentRequest.subRequests[0]?.state === RequestState.SENT} /> )} - +
    {!error.isDismissed && }
    @@ -299,6 +311,7 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, encodedValues error={error} encodedValues={encodedValues} settings={settings} + turnNavigation={turnNavigation} />
    diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 012b001e..dcc9ea3a 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -268,3 +268,5 @@ export class InstructionClicked implements Action { } export class ToggleDistanceUnits implements Action {} + +export class ToggleVectorTilesForNavigation implements Action {} diff --git a/src/sidebar/MobileSidebar.tsx b/src/sidebar/MobileSidebar.tsx index c7807619..602dd759 100644 --- a/src/sidebar/MobileSidebar.tsx +++ b/src/sidebar/MobileSidebar.tsx @@ -12,6 +12,7 @@ import OpenInputsIcon from './unfold.svg' import CloseInputsIcon from './unfold_less.svg' import CustomModelBox from '@/sidebar/CustomModelBox' import { Settings } from '@/stores/SettingsStore' +import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' type MobileSidebarProps = { query: QueryStoreState @@ -19,9 +20,10 @@ type MobileSidebarProps = { error: ErrorStoreState encodedValues: object[] settings: Settings + turnNavigation: TurnNavigationStoreState } -export default function ({ query, route, error, encodedValues, settings }: MobileSidebarProps) { +export default function ({ query, route, error, encodedValues, settings, turnNavigation }: MobileSidebarProps) { const [showCustomModelBox, setShowCustomModelBox] = useState(false) // the following three elements control, whether the small search view is displayed const isShortScreen = useMediaQuery({ query: '(max-height: 55rem)' }) @@ -72,7 +74,10 @@ export default function ({ query, route, error, encodedValues, settings }: Mobil queryOngoing={query.currentRequest.subRequests[0]?.state === RequestState.SENT} /> )} - +
    )} {!error.isDismissed && } diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index c471998e..dbceec44 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -99,7 +99,7 @@ function RoutingResult({ Dispatcher.dispatch( new TurnNavigationSettingsUpdate({ acceptedRisk: true } as TNSettingsState) ) - startNavigation(fullscreenForTN) + startNavigation(fullscreenForTN, turnNavigation.settings.forceVectorTiles) }} > {tr('accept_risks_after_warning')} @@ -111,7 +111,8 @@ function RoutingResult({ className={styles.showRiskBack} onClick={() => { setShowBackAndRisk(false) - Dispatcher.dispatch(new SelectMapLayer(turnNavigation.oldTiles)) + if (turnNavigation.settings.forceVectorTiles) + Dispatcher.dispatch(new SelectMapLayer(turnNavigation.oldTiles)) Dispatcher.dispatch(new TurnNavigationStop()) }} > @@ -150,7 +151,8 @@ function RoutingResult({ className={styles.exportButton} onClick={() => { setShowBackAndRisk(true) - if (turnNavigation.settings.acceptedRisk) startNavigation(fullscreenForTN) + if (turnNavigation.settings.acceptedRisk) + startNavigation(fullscreenForTN, turnNavigation.settings.forceVectorTiles) }} > @@ -194,9 +196,9 @@ function RoutingResult({ ) } -function startNavigation(fullscreen: boolean) { +function startNavigation(fullscreen: boolean, forceVectorTiles: boolean) { Dispatcher.dispatch(new TurnNavigationStart(fullscreen)) - Dispatcher.dispatch(new SelectMapLayer(config.navigationTiles)) + if (forceVectorTiles) Dispatcher.dispatch(new SelectMapLayer(config.navigationTiles)) } function containsBadTracks(details: [number, number, string][]) { diff --git a/src/sidebar/SettingsBox.tsx b/src/sidebar/SettingsBox.tsx index d1a08f06..5812aa4c 100644 --- a/src/sidebar/SettingsBox.tsx +++ b/src/sidebar/SettingsBox.tsx @@ -1,4 +1,4 @@ -import { ToggleDistanceUnits } from '@/actions/Actions' +import { ToggleDistanceUnits, ToggleVectorTilesForNavigation } from '@/actions/Actions' import Dispatcher from '@/stores/Dispatcher' import styles from '@/sidebar/SettingsBox.module.css' import { tr } from '@/translation/Translation' @@ -8,7 +8,7 @@ import OffIcon from '@/sidebar/toggle_off.svg' import { useContext } from 'react' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' -export default function SettingsBox() { +export default function SettingsBox({ vectorTilesForNav }: { vectorTilesForNav: boolean }) { const showDistanceInMiles = useContext(ShowDistanceInMilesContext) return (
    @@ -23,6 +23,13 @@ export default function SettingsBox() {
    {tr('distance_unit', [tr(showDistanceInMiles ? 'mi' : 'km')])}
    + Dispatcher.dispatch(new ToggleVectorTilesForNavigation())} + > + {vectorTilesForNav ? : } + +
    {tr('vector_tiles_for_navigation')}
    Info diff --git a/src/sidebar/search/Search.tsx b/src/sidebar/search/Search.tsx index 780d6c09..963ac85d 100644 --- a/src/sidebar/search/Search.tsx +++ b/src/sidebar/search/Search.tsx @@ -14,7 +14,7 @@ import { MarkerComponent } from '@/map/Marker' import { tr } from '@/translation/Translation' import SettingsBox from '@/sidebar/SettingsBox' -export default function Search({ points }: { points: QueryPoint[] }) { +export default function Search({ points, vectorTilesForNav }: { points: QueryPoint[]; vectorTilesForNav: boolean }) { const [showSettings, setShowSettings] = useState(false) const [showTargetIcons, setShowTargetIcons] = useState(true) const [moveStartIndex, onMoveStartSelect] = useState(-1) @@ -61,7 +61,7 @@ export default function Search({ points }: { points: QueryPoint[] }) { {showSettings ? tr('settings_close') : tr('settings')}
    - {showSettings && } + {showSettings && }
    ) } diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 39c4ad3f..68e8c422 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -5,9 +5,11 @@ import { InfoReceived, LocationUpdate, SelectMapLayer, - SetCustomModel, SetCustomModelEnabled, + SetCustomModel, + SetCustomModelEnabled, SetSelectedPath, SetVehicleProfile, + ToggleVectorTilesForNavigation, TurnNavigationRerouting, TurnNavigationReroutingFailed, TurnNavigationReroutingTimeResetForTest, @@ -76,6 +78,7 @@ export interface TNSettingsState { fakeGPS: boolean acceptedRisk: boolean soundEnabled: boolean + forceVectorTiles: boolean } export interface MapCoordinateSystem { @@ -111,7 +114,12 @@ export default class TurnNavigationStore extends Store lastRerouteTime: 0, lastRerouteDistanceToRoute: 0, activeProfile: '', - settings: { acceptedRisk: false, fakeGPS: fakeGPS, soundEnabled: !fakeGPS } as TNSettingsState, + settings: { + acceptedRisk: false, + fakeGPS: fakeGPS, + soundEnabled: !fakeGPS, + forceVectorTiles: true, + } as TNSettingsState, instruction: {} as TNInstructionState, pathDetails: {} as TNPathDetailsState, }) @@ -136,6 +144,11 @@ export default class TurnNavigationStore extends Store if (state.settings.fakeGPS) this.initFake() else this.initReal(action.enableFullscreen) return { ...state, started: true } + } else if (action instanceof ToggleVectorTilesForNavigation) { + return { + ...state, + settings: { ...state.settings, forceVectorTiles: !state.settings.forceVectorTiles }, + } } else if (action instanceof SelectMapLayer) { if (!this.state.started) return { @@ -151,12 +164,12 @@ export default class TurnNavigationStore extends Store } else if (action instanceof SetCustomModelEnabled) { return { ...state, - customModelEnabled: action.enabled + customModelEnabled: action.enabled, } } else if (action instanceof SetCustomModel) { return { ...state, - customModelStr: action.customModelStr + customModelStr: action.customModelStr, } } else if (action instanceof InfoReceived) { if (state.activeProfile || action.result.profiles.length <= 0) return state diff --git a/src/translation/tr.json b/src/translation/tr.json index ac14c1b9..449a4671 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -87,7 +87,8 @@ "for_mi":"for %1$s miles", "warning":"WARNING: The turn-by-turn navigation feature is highly experimental. Use it at your own risk, pay attention to the road and do not touch the device while driving!", "accept_risks_after_warning":"I understand and agree", -"start_navigation":"Navigation" +"start_navigation":"Navigation", +"vector_tiles_for_navigation":"Use vector tiles for turn-by-turn navigation" }, "ar":{ "total_ascend":"%1$s اجمالى صعود", @@ -178,7 +179,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "ast":{ "total_ascend":"%1$s d'ascensu total", @@ -269,7 +271,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "az":{ "total_ascend":"%1$s yüksəliş", @@ -360,7 +363,8 @@ "for_mi":"%1$s mildə", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "bg":{ "total_ascend":"%1$s общо изкачване", @@ -451,7 +455,8 @@ "for_mi":"за %1$s мили", "warning":"Внимание: Приложението е експериментално! Използвайте на свой риск!", "accept_risks_after_warning":"Разбирам и се съгласявам", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "bn_BN":{ "total_ascend":"", @@ -542,7 +547,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "ca":{ "total_ascend":"%1$s de pujada total", @@ -633,7 +639,8 @@ "for_mi":"per %1$s milles", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "cs_CZ":{ "total_ascend":"celkové stoupání %1$s", @@ -724,7 +731,8 @@ "for_mi":"%1$s mil", "warning":"POZOR: Navigace je vysoce experimentální. Použití je na vlastní nebezpečí, soustřeďte se na řízení a věnujte pozornost dopravní situaci. Neovládejte přístroj za jízdy!", "accept_risks_after_warning":"Rozumím a souhlasím", -"start_navigation":"Navigace" +"start_navigation":"Navigace", +"vector_tiles_for_navigation":"" }, "da_DK":{ "total_ascend":"%1$s samlet stigning", @@ -815,7 +823,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "de_DE":{ "total_ascend":"%1$s Gesamtaufstieg", @@ -906,7 +915,8 @@ "for_mi":"für %1$s Meilen", "warning":"ACHTUNG: Die Navigation ist höchst experimentell. Verwenden Sie diese auf eigene Gefahr, achten Sie auf den Straßenverkehr und berühren Sie das Gerät nicht während der Fahrt!", "accept_risks_after_warning":"Ich verstehe und akzeptiere", -"start_navigation":"Navigation" +"start_navigation":"Navigation", +"vector_tiles_for_navigation":"Nutze Vector tiles für die Navigation" }, "el":{ "total_ascend":"%1$s συνολική ανάβαση", @@ -997,7 +1007,8 @@ "for_mi":"για %1$s μίλια", "warning":"ΠΡΟΣΟΧΗ: Αυτή η εφαρμογή είναι πειραματική! Χρησιμοποιήστε την με δική σας ευθύνη!", "accept_risks_after_warning":"Καταλαβαίνω και συμφωνώ", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "eo":{ "total_ascend":"%1$s supreniro tute", @@ -1088,7 +1099,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "es":{ "total_ascend":"Ascender %1$s en total", @@ -1179,7 +1191,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "fa":{ "total_ascend":"مجموع صعود %1$s", @@ -1270,7 +1283,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "fil":{ "total_ascend":"", @@ -1361,7 +1375,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "fi":{ "total_ascend":"nousu yhteensä %1$s", @@ -1452,7 +1467,8 @@ "for_mi":"kulje %1$s mailia", "warning":"VAROITUS: Tämä sovellus on erittäin kokeellinen! Käytä omalla vastuullasi!", "accept_risks_after_warning":"Ymmärrän ja hyväksyn", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "fr_FR":{ "total_ascend":"%1$s de dénivelé positif", @@ -1543,7 +1559,8 @@ "for_mi":"Pendant %1$s miles", "warning":"ATTENTION : Cette application est hautement expérimentale ! À utiliser à vos risques et périls !", "accept_risks_after_warning":"Je comprends et j'accepte", -"start_navigation":"Naviguer" +"start_navigation":"Naviguer", +"vector_tiles_for_navigation":"" }, "fr_CH":{ "total_ascend":"%1$s de dénivelé positif", @@ -1634,7 +1651,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "gl":{ "total_ascend":"", @@ -1725,7 +1743,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "he":{ "total_ascend":"עלייה כוללת של %1$s", @@ -1816,7 +1835,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "hr_HR":{ "total_ascend":"%1$s ukupni uspon", @@ -1907,7 +1927,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "hsb":{ "total_ascend":"", @@ -1998,7 +2019,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "hu_HU":{ "total_ascend":"Összes szintemelkedés: %1$s", @@ -2089,7 +2111,8 @@ "for_mi":"", "warning":"FIGYELEM! Ez az alkalmazás erősen kísérleti jellegű. Használat csak saját felelősségre!", "accept_risks_after_warning":"Megértettem és elfogadom", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "in_ID":{ "total_ascend":"naik dengan jarak %1$s", @@ -2180,7 +2203,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "it":{ "total_ascend":"%1$s di dislivello positivo", @@ -2271,7 +2295,8 @@ "for_mi":"per %1$s miglia", "warning":"ATTENZIONE: Questa applicazione è ancora sperimentale! Utilizzala a tuo rischio e pericolo!", "accept_risks_after_warning":"Ho capito e accetto", -"start_navigation":"Naviga" +"start_navigation":"Naviga", +"vector_tiles_for_navigation":"" }, "ja":{ "total_ascend":"", @@ -2362,7 +2387,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "kk":{ "total_ascend":"%1$s көтерілу", @@ -2453,7 +2479,8 @@ "for_mi":"", "warning":"Ескерту: бұрылыстан бұрылысқа навигация функциясы эксперименталды. Оны өз жауапкершілігіңізбен пайдаланыңыз, жолға назар аударыңыз және қозғалыс кезінде құрылғыға қол тигізбеңіз!", "accept_risks_after_warning":"мен түсіндім және келісемін", -"start_navigation":"навигация" +"start_navigation":"навигация", +"vector_tiles_for_navigation":"" }, "ko":{ "total_ascend":"오르막길 총 %1$s", @@ -2544,7 +2571,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "lt_LT":{ "total_ascend":"", @@ -2635,7 +2663,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "nb_NO":{ "total_ascend":"%1$s totale høydemeter", @@ -2726,7 +2755,8 @@ "for_mi":"", "warning":"VARSEL: Denne appen er svært eksperimentell. Brukes på eget ansvar!", "accept_risks_after_warning":"Jeg forstår og samtykker", -"start_navigation":"Start navigasjon" +"start_navigation":"Start navigasjon", +"vector_tiles_for_navigation":"" }, "ne":{ "total_ascend":"", @@ -2817,7 +2847,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "nl":{ "total_ascend":"%1$s totale klim", @@ -2908,7 +2939,8 @@ "for_mi":"Voor %1$s mijl", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "pl_PL":{ "total_ascend":"%1$s w górę", @@ -2999,7 +3031,8 @@ "for_mi":"przez %1$s mil", "warning":"OSTRZEŻENIE: Ta aplikacja jest wysoce eksperymentalna! Używaj na własne ryzyko!", "accept_risks_after_warning":"Rozumiem i akceptuję", -"start_navigation":"Nawiguj" +"start_navigation":"Nawiguj", +"vector_tiles_for_navigation":"" }, "pt_BR":{ "total_ascend":"subida de %1$s", @@ -3090,7 +3123,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "pt_PT":{ "total_ascend":"subida de %1$s", @@ -3181,7 +3215,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "ro":{ "total_ascend":"urcare %1$s", @@ -3272,7 +3307,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "ru":{ "total_ascend":"подъём на %1$s", @@ -3363,7 +3399,8 @@ "for_mi":"В %1$s милях", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "sk":{ "total_ascend":"%1$s celkové stúpanie", @@ -3454,7 +3491,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "sl_SI":{ "total_ascend":"Skupni vzpon: %1$s", @@ -3545,7 +3583,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "sr_RS":{ "total_ascend":"%1$s ukupni uspon", @@ -3636,7 +3675,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "sv_SE":{ "total_ascend":"%1$s stigning", @@ -3727,7 +3767,8 @@ "for_mi":"i %1$s mil", "warning":"VARNING: Sväng-för-sväng-navigeringen är mycket experimentell! Använd på egen risk!", "accept_risks_after_warning":"Jag förstår och godkänner", -"start_navigation":"Navigera" +"start_navigation":"Navigera", +"vector_tiles_for_navigation":"" }, "tr":{ "total_ascend":"%1$s toplam tırmanış", @@ -3818,7 +3859,8 @@ "for_mi":"%1$s mil boyunca", "warning":"", "accept_risks_after_warning":"Anladım ve kabul ediyorum", -"start_navigation":"Başla" +"start_navigation":"Başla", +"vector_tiles_for_navigation":"" }, "uk":{ "total_ascend":"%1$s загалом підйому", @@ -3909,7 +3951,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "vi_VN":{ "total_ascend":"Đi tiếp %1$s nữa", @@ -4000,7 +4043,8 @@ "for_mi":"Khoảng %1$s dặm", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "zh_CN":{ "total_ascend":"总上升 %1$s", @@ -4091,7 +4135,8 @@ "for_mi":"行驶 %1$s 英里", "warning":"警告:该应用程序处于早期实验阶段,使用时风险自负!", "accept_risks_after_warning":"我理解并同意", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "zh_HK":{ "total_ascend":"總共上昇 %1$s", @@ -4182,7 +4227,8 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }, "zh_TW":{ "total_ascend":"總共上昇 %1$s", @@ -4273,5 +4319,6 @@ "for_mi":"", "warning":"", "accept_risks_after_warning":"", -"start_navigation":"" +"start_navigation":"", +"vector_tiles_for_navigation":"" }} \ No newline at end of file diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index bf3c31a8..074c99d5 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -68,7 +68,8 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto { - Dispatcher.dispatch(new SelectMapLayer(turnNavigation.oldTiles)) + if (turnNavigation.settings.forceVectorTiles) + Dispatcher.dispatch(new SelectMapLayer(turnNavigation.oldTiles)) Dispatcher.dispatch(new TurnNavigationStop()) }} > From 11477b6d0665b7cd0163c7e3c90d017710cd8e1d Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 24 Mar 2023 11:21:16 +0100 Subject: [PATCH 211/322] minor i18n --- src/translation/tr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/translation/tr.json b/src/translation/tr.json index 449a4671..bc912eab 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -916,7 +916,7 @@ "warning":"ACHTUNG: Die Navigation ist höchst experimentell. Verwenden Sie diese auf eigene Gefahr, achten Sie auf den Straßenverkehr und berühren Sie das Gerät nicht während der Fahrt!", "accept_risks_after_warning":"Ich verstehe und akzeptiere", "start_navigation":"Navigation", -"vector_tiles_for_navigation":"Nutze Vector tiles für die Navigation" +"vector_tiles_for_navigation":"Nutze Vector Tiles für die Navigation" }, "el":{ "total_ascend":"%1$s συνολική ανάβαση", From e97e5eff9418855acef63b42ac1ee5cbf45c9a82 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 24 Mar 2023 12:21:47 +0100 Subject: [PATCH 212/322] include full screen as option too --- src/App.tsx | 14 ++- src/actions/Actions.ts | 9 +- src/sidebar/MobileSidebar.tsx | 5 +- src/sidebar/RoutingResults.tsx | 12 +- src/sidebar/SettingsBox.tsx | 22 +++- src/sidebar/search/Search.tsx | 11 +- src/stores/TurnNavigationStore.ts | 10 +- src/translation/tr.json | 188 ++++++++++++++++++++++-------- 8 files changed, 191 insertions(+), 80 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 454f664d..52c04748 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -218,10 +218,7 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, encodedValues queryOngoing={query.currentRequest.subRequests[0]?.state === RequestState.SENT} /> )} - +
    {!error.isDismissed && }
    @@ -293,7 +289,13 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, encodedValues return ( <>
    - +
    diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index dcc9ea3a..f0de712f 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -14,13 +14,7 @@ export class InfoReceived implements Action { export class TurnNavigationStop implements Action {} -export class TurnNavigationStart implements Action { - readonly enableFullscreen: boolean - - constructor(enableFullscreen: boolean) { - this.enableFullscreen = enableFullscreen - } -} +export class TurnNavigationStart implements Action {} export class LocationUpdate implements Action { readonly coordinate: Coordinate @@ -270,3 +264,4 @@ export class InstructionClicked implements Action { export class ToggleDistanceUnits implements Action {} export class ToggleVectorTilesForNavigation implements Action {} +export class ToggleFullScreenForNavigation implements Action {} diff --git a/src/sidebar/MobileSidebar.tsx b/src/sidebar/MobileSidebar.tsx index 889489d6..10524dec 100644 --- a/src/sidebar/MobileSidebar.tsx +++ b/src/sidebar/MobileSidebar.tsx @@ -72,10 +72,7 @@ export default function ({ query, route, error, encodedValues, turnNavigation }: queryOngoing={query.currentRequest.subRequests[0]?.state === RequestState.SENT} /> )} - +
    )} {!error.isDismissed && } diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index dbceec44..6b95d5c1 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -46,13 +46,11 @@ function RoutingResult({ path, isSelected, profile, - fullscreenForTN, turnNavigation, }: { path: Path isSelected: boolean profile: string - fullscreenForTN: boolean turnNavigation: TurnNavigationStoreState }) { const [isExpanded, setExpanded] = useState(false) @@ -99,7 +97,7 @@ function RoutingResult({ Dispatcher.dispatch( new TurnNavigationSettingsUpdate({ acceptedRisk: true } as TNSettingsState) ) - startNavigation(fullscreenForTN, turnNavigation.settings.forceVectorTiles) + startNavigation(turnNavigation.settings.forceVectorTiles) }} > {tr('accept_risks_after_warning')} @@ -152,7 +150,7 @@ function RoutingResult({ onClick={() => { setShowBackAndRisk(true) if (turnNavigation.settings.acceptedRisk) - startNavigation(fullscreenForTN, turnNavigation.settings.forceVectorTiles) + startNavigation(turnNavigation.settings.forceVectorTiles) }} > @@ -196,8 +194,8 @@ function RoutingResult({ ) } -function startNavigation(fullscreen: boolean, forceVectorTiles: boolean) { - Dispatcher.dispatch(new TurnNavigationStart(fullscreen)) +function startNavigation(forceVectorTiles: boolean) { + Dispatcher.dispatch(new TurnNavigationStart()) if (forceVectorTiles) Dispatcher.dispatch(new SelectMapLayer(config.navigationTiles)) } @@ -339,7 +337,6 @@ function createSingletonListContent(props: RoutingResultsProps) { path={props.selectedPath} isSelected={true} profile={props.profile} - fullscreenForTN={true} turnNavigation={props.turnNavigation} /> ) @@ -359,7 +356,6 @@ function createListContent({ paths, currentRequest, selectedPath, profile, turnN path={paths[i]} isSelected={paths[i] === selectedPath} profile={profile} - fullscreenForTN={false} turnNavigation={turnNavigation} /> ) diff --git a/src/sidebar/SettingsBox.tsx b/src/sidebar/SettingsBox.tsx index 5812aa4c..2a39ce06 100644 --- a/src/sidebar/SettingsBox.tsx +++ b/src/sidebar/SettingsBox.tsx @@ -1,4 +1,4 @@ -import { ToggleDistanceUnits, ToggleVectorTilesForNavigation } from '@/actions/Actions' +import { ToggleDistanceUnits, ToggleFullScreenForNavigation, ToggleVectorTilesForNavigation } from '@/actions/Actions' import Dispatcher from '@/stores/Dispatcher' import styles from '@/sidebar/SettingsBox.module.css' import { tr } from '@/translation/Translation' @@ -7,9 +7,11 @@ import OnIcon from '@/sidebar/toggle_on.svg' import OffIcon from '@/sidebar/toggle_off.svg' import { useContext } from 'react' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' +import { TNSettingsState } from '@/stores/TurnNavigationStore' -export default function SettingsBox({ vectorTilesForNav }: { vectorTilesForNav: boolean }) { +export default function SettingsBox({ turnNavSettings }: { turnNavSettings: TNSettingsState }) { const showDistanceInMiles = useContext(ShowDistanceInMilesContext) + const { forceVectorTiles, fullScreen } = turnNavSettings return (
    {tr('settings')}
    @@ -23,13 +25,23 @@ export default function SettingsBox({ vectorTilesForNav }: { vectorTilesForNav:
    {tr('distance_unit', [tr(showDistanceInMiles ? 'mi' : 'km')])}
    +
    +
    {tr('turn_navigation_settings_title')}
    +
    Dispatcher.dispatch(new ToggleVectorTilesForNavigation())} > - {vectorTilesForNav ? : } + {forceVectorTiles ? : } + +
    {tr('vector_tiles_for_navigation')}
    + Dispatcher.dispatch(new ToggleFullScreenForNavigation())} + > + {fullScreen ? : } -
    {tr('vector_tiles_for_navigation')}
    +
    {tr('full_screen_for_navigation')}
    Info diff --git a/src/sidebar/search/Search.tsx b/src/sidebar/search/Search.tsx index 963ac85d..3f41b66d 100644 --- a/src/sidebar/search/Search.tsx +++ b/src/sidebar/search/Search.tsx @@ -13,8 +13,15 @@ import AddressInput from '@/sidebar/search/AddressInput' import { MarkerComponent } from '@/map/Marker' import { tr } from '@/translation/Translation' import SettingsBox from '@/sidebar/SettingsBox' +import { TNSettingsState } from '@/stores/TurnNavigationStore' -export default function Search({ points, vectorTilesForNav }: { points: QueryPoint[]; vectorTilesForNav: boolean }) { +export default function Search({ + points, + turnNavigationSettings, +}: { + points: QueryPoint[] + turnNavigationSettings: TNSettingsState +}) { const [showSettings, setShowSettings] = useState(false) const [showTargetIcons, setShowTargetIcons] = useState(true) const [moveStartIndex, onMoveStartSelect] = useState(-1) @@ -61,7 +68,7 @@ export default function Search({ points, vectorTilesForNav }: { points: QueryPoi {showSettings ? tr('settings_close') : tr('settings')}
    - {showSettings && } + {showSettings && }
    ) } diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 68e8c422..f752fcb6 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -9,6 +9,7 @@ import { SetCustomModelEnabled, SetSelectedPath, SetVehicleProfile, + ToggleFullScreenForNavigation, ToggleVectorTilesForNavigation, TurnNavigationRerouting, TurnNavigationReroutingFailed, @@ -79,6 +80,7 @@ export interface TNSettingsState { acceptedRisk: boolean soundEnabled: boolean forceVectorTiles: boolean + fullScreen: boolean } export interface MapCoordinateSystem { @@ -119,6 +121,7 @@ export default class TurnNavigationStore extends Store fakeGPS: fakeGPS, soundEnabled: !fakeGPS, forceVectorTiles: true, + fullScreen: true, } as TNSettingsState, instruction: {} as TNInstructionState, pathDetails: {} as TNPathDetailsState, @@ -142,13 +145,18 @@ export default class TurnNavigationStore extends Store this.speechSynthesizer.synthesize('') if (state.settings.fakeGPS) this.initFake() - else this.initReal(action.enableFullscreen) + else this.initReal(this.state.settings.fullScreen) return { ...state, started: true } } else if (action instanceof ToggleVectorTilesForNavigation) { return { ...state, settings: { ...state.settings, forceVectorTiles: !state.settings.forceVectorTiles }, } + } else if (action instanceof ToggleFullScreenForNavigation) { + return { + ...state, + settings: { ...state.settings, fullScreen: !state.settings.fullScreen }, + } } else if (action instanceof SelectMapLayer) { if (!this.state.started) return { diff --git a/src/translation/tr.json b/src/translation/tr.json index bc912eab..bf5289ca 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -88,7 +88,9 @@ "warning":"WARNING: The turn-by-turn navigation feature is highly experimental. Use it at your own risk, pay attention to the road and do not touch the device while driving!", "accept_risks_after_warning":"I understand and agree", "start_navigation":"Navigation", -"vector_tiles_for_navigation":"Use vector tiles for turn-by-turn navigation" +"vector_tiles_for_navigation":"Use vector tiles", +"full_screen_for_navigation":"Set full screen", +"turn_navigation_settings_title":"Turn-by-turn navigation" }, "ar":{ "total_ascend":"%1$s اجمالى صعود", @@ -180,7 +182,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "ast":{ "total_ascend":"%1$s d'ascensu total", @@ -272,7 +276,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "az":{ "total_ascend":"%1$s yüksəliş", @@ -364,7 +370,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "bg":{ "total_ascend":"%1$s общо изкачване", @@ -456,7 +464,9 @@ "warning":"Внимание: Приложението е експериментално! Използвайте на свой риск!", "accept_risks_after_warning":"Разбирам и се съгласявам", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "bn_BN":{ "total_ascend":"", @@ -548,7 +558,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "ca":{ "total_ascend":"%1$s de pujada total", @@ -640,7 +652,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "cs_CZ":{ "total_ascend":"celkové stoupání %1$s", @@ -732,7 +746,9 @@ "warning":"POZOR: Navigace je vysoce experimentální. Použití je na vlastní nebezpečí, soustřeďte se na řízení a věnujte pozornost dopravní situaci. Neovládejte přístroj za jízdy!", "accept_risks_after_warning":"Rozumím a souhlasím", "start_navigation":"Navigace", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "da_DK":{ "total_ascend":"%1$s samlet stigning", @@ -824,7 +840,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "de_DE":{ "total_ascend":"%1$s Gesamtaufstieg", @@ -916,7 +934,9 @@ "warning":"ACHTUNG: Die Navigation ist höchst experimentell. Verwenden Sie diese auf eigene Gefahr, achten Sie auf den Straßenverkehr und berühren Sie das Gerät nicht während der Fahrt!", "accept_risks_after_warning":"Ich verstehe und akzeptiere", "start_navigation":"Navigation", -"vector_tiles_for_navigation":"Nutze Vector Tiles für die Navigation" +"vector_tiles_for_navigation":"Nutze Vector Tiles", +"full_screen_for_navigation":"Wechsle zum Vollbild", +"turn_navigation_settings_title":"Navigation" }, "el":{ "total_ascend":"%1$s συνολική ανάβαση", @@ -1008,7 +1028,9 @@ "warning":"ΠΡΟΣΟΧΗ: Αυτή η εφαρμογή είναι πειραματική! Χρησιμοποιήστε την με δική σας ευθύνη!", "accept_risks_after_warning":"Καταλαβαίνω και συμφωνώ", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "eo":{ "total_ascend":"%1$s supreniro tute", @@ -1100,7 +1122,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "es":{ "total_ascend":"Ascender %1$s en total", @@ -1192,7 +1216,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "fa":{ "total_ascend":"مجموع صعود %1$s", @@ -1284,7 +1310,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "fil":{ "total_ascend":"", @@ -1376,7 +1404,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "fi":{ "total_ascend":"nousu yhteensä %1$s", @@ -1468,7 +1498,9 @@ "warning":"VAROITUS: Tämä sovellus on erittäin kokeellinen! Käytä omalla vastuullasi!", "accept_risks_after_warning":"Ymmärrän ja hyväksyn", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "fr_FR":{ "total_ascend":"%1$s de dénivelé positif", @@ -1560,7 +1592,9 @@ "warning":"ATTENTION : Cette application est hautement expérimentale ! À utiliser à vos risques et périls !", "accept_risks_after_warning":"Je comprends et j'accepte", "start_navigation":"Naviguer", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "fr_CH":{ "total_ascend":"%1$s de dénivelé positif", @@ -1652,7 +1686,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "gl":{ "total_ascend":"", @@ -1744,7 +1780,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "he":{ "total_ascend":"עלייה כוללת של %1$s", @@ -1836,7 +1874,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "hr_HR":{ "total_ascend":"%1$s ukupni uspon", @@ -1928,7 +1968,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "hsb":{ "total_ascend":"", @@ -2020,7 +2062,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "hu_HU":{ "total_ascend":"Összes szintemelkedés: %1$s", @@ -2112,7 +2156,9 @@ "warning":"FIGYELEM! Ez az alkalmazás erősen kísérleti jellegű. Használat csak saját felelősségre!", "accept_risks_after_warning":"Megértettem és elfogadom", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "in_ID":{ "total_ascend":"naik dengan jarak %1$s", @@ -2204,7 +2250,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "it":{ "total_ascend":"%1$s di dislivello positivo", @@ -2296,7 +2344,9 @@ "warning":"ATTENZIONE: Questa applicazione è ancora sperimentale! Utilizzala a tuo rischio e pericolo!", "accept_risks_after_warning":"Ho capito e accetto", "start_navigation":"Naviga", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "ja":{ "total_ascend":"", @@ -2388,7 +2438,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "kk":{ "total_ascend":"%1$s көтерілу", @@ -2480,7 +2532,9 @@ "warning":"Ескерту: бұрылыстан бұрылысқа навигация функциясы эксперименталды. Оны өз жауапкершілігіңізбен пайдаланыңыз, жолға назар аударыңыз және қозғалыс кезінде құрылғыға қол тигізбеңіз!", "accept_risks_after_warning":"мен түсіндім және келісемін", "start_navigation":"навигация", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "ko":{ "total_ascend":"오르막길 총 %1$s", @@ -2572,7 +2626,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "lt_LT":{ "total_ascend":"", @@ -2664,7 +2720,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "nb_NO":{ "total_ascend":"%1$s totale høydemeter", @@ -2756,7 +2814,9 @@ "warning":"VARSEL: Denne appen er svært eksperimentell. Brukes på eget ansvar!", "accept_risks_after_warning":"Jeg forstår og samtykker", "start_navigation":"Start navigasjon", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "ne":{ "total_ascend":"", @@ -2848,7 +2908,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "nl":{ "total_ascend":"%1$s totale klim", @@ -2940,7 +3002,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "pl_PL":{ "total_ascend":"%1$s w górę", @@ -3032,7 +3096,9 @@ "warning":"OSTRZEŻENIE: Ta aplikacja jest wysoce eksperymentalna! Używaj na własne ryzyko!", "accept_risks_after_warning":"Rozumiem i akceptuję", "start_navigation":"Nawiguj", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "pt_BR":{ "total_ascend":"subida de %1$s", @@ -3124,7 +3190,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "pt_PT":{ "total_ascend":"subida de %1$s", @@ -3216,7 +3284,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "ro":{ "total_ascend":"urcare %1$s", @@ -3308,7 +3378,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "ru":{ "total_ascend":"подъём на %1$s", @@ -3400,7 +3472,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "sk":{ "total_ascend":"%1$s celkové stúpanie", @@ -3492,7 +3566,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "sl_SI":{ "total_ascend":"Skupni vzpon: %1$s", @@ -3584,7 +3660,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "sr_RS":{ "total_ascend":"%1$s ukupni uspon", @@ -3676,7 +3754,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "sv_SE":{ "total_ascend":"%1$s stigning", @@ -3768,7 +3848,9 @@ "warning":"VARNING: Sväng-för-sväng-navigeringen är mycket experimentell! Använd på egen risk!", "accept_risks_after_warning":"Jag förstår och godkänner", "start_navigation":"Navigera", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "tr":{ "total_ascend":"%1$s toplam tırmanış", @@ -3860,7 +3942,9 @@ "warning":"", "accept_risks_after_warning":"Anladım ve kabul ediyorum", "start_navigation":"Başla", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "uk":{ "total_ascend":"%1$s загалом підйому", @@ -3952,7 +4036,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "vi_VN":{ "total_ascend":"Đi tiếp %1$s nữa", @@ -4044,7 +4130,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "zh_CN":{ "total_ascend":"总上升 %1$s", @@ -4136,7 +4224,9 @@ "warning":"警告:该应用程序处于早期实验阶段,使用时风险自负!", "accept_risks_after_warning":"我理解并同意", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "zh_HK":{ "total_ascend":"總共上昇 %1$s", @@ -4228,7 +4318,9 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }, "zh_TW":{ "total_ascend":"總共上昇 %1$s", @@ -4320,5 +4412,7 @@ "warning":"", "accept_risks_after_warning":"", "start_navigation":"", -"vector_tiles_for_navigation":"" +"vector_tiles_for_navigation":"", +"full_screen_for_navigation":"", +"turn_navigation_settings_title":"" }} \ No newline at end of file From 37818e531973a2b9c96fc331209d3b2eceb04a32 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 6 Apr 2023 15:08:48 +0200 Subject: [PATCH 213/322] highlight arrow with transparent white background --- src/sidebar/filled-navigation.svg | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/sidebar/filled-navigation.svg b/src/sidebar/filled-navigation.svg index 612caa62..45c0c990 100644 --- a/src/sidebar/filled-navigation.svg +++ b/src/sidebar/filled-navigation.svg @@ -1,6 +1,24 @@ - - - - \ No newline at end of file + + + + + + From 6f4270286bde5f0c0dceca2b1400f4d0bfd01e86 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 6 Apr 2023 15:50:18 +0200 Subject: [PATCH 214/322] Revert b9c20d65df834bef4382245e2192c460827eab9f because we want to drag map while updating current location --- src/App.tsx | 6 +-- src/layers/CurrentLocationLayer.tsx | 57 +++++++++++++++++++++++++++++ src/layers/UsePathsLayer.tsx | 15 ++++---- src/sidebar/filled-navigation.svg | 24 ------------ src/stores/MapActionReceiver.ts | 30 +++++---------- 5 files changed, 76 insertions(+), 56 deletions(-) create mode 100644 src/layers/CurrentLocationLayer.tsx delete mode 100644 src/sidebar/filled-navigation.svg diff --git a/src/App.tsx b/src/App.tsx index 523c282a..aaa3fdfd 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -45,11 +45,10 @@ import VolumeOffIcon from '@/turnNavigation/volume_off.svg' import PlainButton from '@/PlainButton' import TurnNavigation from '@/turnNavigation/TurnNavigation' import MapPopups from '@/map/MapPopups' +import useCurrentLocationLayer from '@/layers/CurrentLocationLayer' import Menu from '@/sidebar/menu.svg' import Cross from '@/sidebar/times-solid.svg' -import FilledNaviSVG from '@/sidebar/filled-navigation.svg' import useAreasLayer from '@/layers/UseAreasLayer' - export const POPUP_CONTAINER_ID = 'popup-container' export const SIDEBAR_CONTENT_ID = 'sidebar-content' @@ -118,6 +117,7 @@ export default function App() { usePathsLayer(map, route, query.queryPoints, turnNavigation) useQueryPointsLayer(map, query.queryPoints) usePathDetailsLayer(map, pathDetails) + useCurrentLocationLayer(map, turnNavigation) const isSmallScreen = useMediaQuery({ query: '(max-width: 44rem)' }) return ( @@ -191,7 +191,6 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, encodedValues
    - ) @@ -282,7 +281,6 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, encodedValues )}
    - ) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx new file mode 100644 index 00000000..f75eebcd --- /dev/null +++ b/src/layers/CurrentLocationLayer.tsx @@ -0,0 +1,57 @@ +import React, {useEffect} from 'react' +import {Feature, Map} from 'ol' +import {Point} from 'ol/geom' +import {fromLonLat} from 'ol/proj' +import VectorLayer from 'ol/layer/Vector' +import VectorSource from 'ol/source/Vector' +import {Icon, Style} from 'ol/style' +import {getCenter} from 'ol/extent' +import {TurnNavigationStoreState} from "@/stores/TurnNavigationStore"; + +export default function useCurrentLocationLayer(map: Map, turnNavigation: TurnNavigationStoreState) { + const point = new Point(fromLonLat([turnNavigation.coordinate.lng, turnNavigation.coordinate.lat])) + const feature = new Feature({geometry: point}) + // Synchronize the position of the view animation (see MapActionReceiver) with the arrow via postrender event. + // Note that updateWhileAnimating = true for currentLocationLayer is necessary. + const onPostrender = () => point.setCoordinates(getCenter(map.getView().calculateExtent())) + + useEffect(() => { + if(!turnNavigation.showUI) return + const currentLocationLayer = addCurrentLocation(map, feature) + currentLocationLayer.on('postrender', onPostrender) + + return () => { + if(!turnNavigation.showUI) return + currentLocationLayer.un('postrender', onPostrender) + map.removeLayer(currentLocationLayer) + } + }, [turnNavigation.showUI]) +} + +// we need a filled version of navigation.svg +const svgArrowData = '' + + ' ' + + ' ' + + ' ' + + '' + +function addCurrentLocation(map: Map, feature: Feature) { + const currentLocationLayer = new VectorLayer({ + source: new VectorSource({ + features: [feature] + }), + updateWhileAnimating: true, + updateWhileInteracting: true + }) + currentLocationLayer.set('gh:current_location', true) + currentLocationLayer.setZIndex(3) + const style = new Style({ + image: new Icon({ + displacement: [0, 0], + src: 'data:image/svg+xml;utf8,' + svgArrowData, + }), + }) + currentLocationLayer.setStyle(() => style) + map.addLayer(currentLocationLayer) + return currentLocationLayer +} diff --git a/src/layers/UsePathsLayer.tsx b/src/layers/UsePathsLayer.tsx index 948bc376..580acc45 100644 --- a/src/layers/UsePathsLayer.tsx +++ b/src/layers/UsePathsLayer.tsx @@ -14,7 +14,7 @@ import { SetSelectedPath } from '@/actions/Actions' import { SelectEvent } from 'ol/interaction/Select' import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import { RouteStoreState } from '@/stores/RouteStore' -import { Geometry, LineString, Point } from 'ol/geom' +import { Geometry, LineString } from 'ol/geom' import { QueryPoint } from '@/stores/QueryStore' import { distance } from 'ol/coordinate' @@ -30,14 +30,14 @@ export default function usePathsLayer( ) { useEffect(() => { removeCurrentPathLayers(map) - if (turnNavigation.showUI && turnNavigation.activePath != null) { - addSelectedPathsLayer(map, turnNavigation.activePath, turnNavigation) + if (turnNavigation.showUI && turnNavigation.activePath) { + addSelectedPathsLayer(map, turnNavigation.activePath, true) } else { addUnselectedPathsLayer( map, route.routingResult.paths.filter(p => p != route.selectedPath) ) - addSelectedPathsLayer(map, route.selectedPath, turnNavigation) + addSelectedPathsLayer(map, route.selectedPath, false) addAccessNetworkLayer(map, route.selectedPath, queryPoints) } return () => { @@ -141,7 +141,7 @@ function addAccessNetworkLayer(map: Map, selectedPath: Path, queryPoints: QueryP map.addLayer(layer) } -function addSelectedPathsLayer(map: Map, selectedPath: Path, turnNavigation: TurnNavigationStoreState) { +function addSelectedPathsLayer(map: Map, selectedPath: Path, updateMoreFrequently: boolean) { const styles = { LineString: new Style({ stroke: new Stroke({ @@ -158,13 +158,14 @@ function addSelectedPathsLayer(map: Map, selectedPath: Path, turnNavigation: Tur geometry: new LineString(selectedPath.points.coordinates.map(c => fromLonLat(c))), }), ] as Feature[] - const coord = turnNavigation.coordinate - if (coord != null) features.push(new Feature({ geometry: new Point(fromLonLat([coord.lng, coord.lat])) })) const layer = new VectorLayer({ source: new VectorSource({ features: features }), style: feature => styles[(feature.getGeometry() as Geometry).getType()], opacity: 0.8, + // when navigating we need this for re-routing: + updateWhileAnimating: updateMoreFrequently, + updateWhileInteracting: updateMoreFrequently }) layer.set(selectedPathLayerKey, true) diff --git a/src/sidebar/filled-navigation.svg b/src/sidebar/filled-navigation.svg deleted file mode 100644 index 45c0c990..00000000 --- a/src/sidebar/filled-navigation.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index bce9ca5b..00e84c68 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -68,27 +68,15 @@ export default class MapActionReceiver implements ActionReceiver { : -toRadians(action.heading) this.map.getView().cancelAnimations() // if location updates are sent too fast animations might stack up - this.map.getView().animate( - { - zoom: action.zoom, - center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), - rotation: rotation, - easing: linear, - duration: 800, // we could use 1s but other map render work won't be properly done (e.g. the new route when re-routing won't show up) - }, - () => { - // After animation render the arrow i.e. it can be out of synch with the map but only until the next location update and only window resizes. - // Animating the move of the arrow on the map AND keeping the view in sync with it is much more than these 4 lines. - const pixels = this.map.getPixelFromCoordinate( - fromLonLat([action.coordinate.lng, action.coordinate.lat]) - ) - const myLayer = document.getElementById('filledNavi') as HTMLElement | null - if (myLayer != null) { - myLayer.style.left = pixels[0] - 24 + 'px' - myLayer.style.top = pixels[1] - 24 + 'px' - } - } - ) + this.map.getView().animate({ + zoom: action.zoom, + center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), + rotation: rotation, + easing: linear, + // We could use 1000ms or more but map tiles won't update probably due to missing updateWhileAnimating. + // For now, due to performance reasons, we set this to true only for the layer. + duration: 800, + }) } else if (action instanceof RouteRequestSuccess) { // this assumes that always the first path is selected as result. One could use the // state of the routeStore as well, but then we would have to make sure that the route From a06ec3f428ee4d26c88ccccb8b49fdeeed2abf76 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 6 Apr 2023 21:39:57 +0200 Subject: [PATCH 215/322] allow zoom and pan while navigation via disabling synchronized view --- src/App.module.css | 33 ++++++++++-- src/App.tsx | 20 +++++++- src/actions/Actions.ts | 22 +++++--- src/index.tsx | 29 +++++++---- src/layers/CurrentLocationLayer.tsx | 33 ++++++------ src/layers/UsePathsLayer.tsx | 2 +- src/map/ContextMenuContent.tsx | 2 +- src/map/map.ts | 2 +- src/sidebar/RoutingResults.tsx | 5 +- src/stores/MapActionReceiver.ts | 62 +++++++++++++++-------- src/stores/TurnNavigationStore.ts | 10 +++- src/turnNavigation/location_searching.svg | 3 ++ test/stores/TurnNavigationStore.test.ts | 26 +++++----- 13 files changed, 171 insertions(+), 78 deletions(-) create mode 100644 src/turnNavigation/location_searching.svg diff --git a/src/App.module.css b/src/App.module.css index 4017eab2..37d3ab65 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -91,7 +91,20 @@ .volume { grid-column: 3 / span 1; grid-row: 1 / span 1; - padding: 5px 5px 3px 7px; + margin: 5px 5px; + padding: 7px 7px 2px 7px; + height: 30px; + z-index: 2; + background-color: white; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); + border-radius: 0.5rem; +} + +.syncLocation { + grid-column: 3 / span 1; + grid-row: 1 / span 1; + margin: 50px 5px 5px 5px; + padding: 7px 7px 2px 7px; height: 30px; z-index: 2; background-color: white; @@ -137,14 +150,28 @@ background-color: white; } -.smallScreenVolume svg { +.smallScreenVolume svg, +.smallScreenSyncLocation svg { transform: scale(1.5); } +.smallScreenSyncLocation { + grid-row: 2 / span 1; + grid-column: 1 / span 1; + margin-top: 5px; + padding: 0.9em 0.7em 0.7em 0.9em; + width: 30px; + height: 30px; + z-index: 2; + background-color: white; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); + border-radius: 0.5rem; +} + .smallScreenVolume { grid-row: 1 / span 1; grid-column: 1 / span 1; - padding: 0.9em 0.8em 0.8em 0.9em; + padding: 0.9em 0.7em 0.7em 0.9em; width: 30px; z-index: 2; background-color: white; diff --git a/src/App.tsx b/src/App.tsx index aaa3fdfd..61b5d5db 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -38,10 +38,11 @@ import useUrbanDensityLayer from '@/layers/UseUrbanDensityLayer' import useMapBorderLayer from '@/layers/UseMapBorderLayer' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import RoutingProfiles from '@/sidebar/search/routingProfiles/RoutingProfiles' -import { TurnNavigationSettingsUpdate } from '@/actions/Actions' +import { LocationUpdateSync, TurnNavigationSettingsUpdate } from '@/actions/Actions' import Dispatcher from '@/stores/Dispatcher' import VolumeUpIcon from '@/turnNavigation/volume_up.svg' import VolumeOffIcon from '@/turnNavigation/volume_off.svg' +import SyncLocationIcon from '@/turnNavigation/location_searching.svg' import PlainButton from '@/PlainButton' import TurnNavigation from '@/turnNavigation/TurnNavigation' import MapPopups from '@/map/MapPopups' @@ -188,6 +189,13 @@ function LargeScreenLayout({ query, route, map, error, mapOptions, encodedValues )}
    + {!turnNavigation.settings.syncView && ( +
    + Dispatcher.dispatch(new LocationUpdateSync(true))}> + + +
    + )}
    @@ -281,6 +289,16 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, encodedValues )}
    + {!turnNavigation.settings.syncView && ( +
    Dispatcher.dispatch(new LocationUpdateSync(true))} + > + + + +
    + )} ) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 4ed50bf0..944caa0c 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -16,15 +16,27 @@ export class TurnNavigationStop implements Action {} export class TurnNavigationStart implements Action {} +export class LocationUpdateSync implements Action { + readonly enableViewSync: boolean + + constructor(enableViewSync: boolean) { + this.enableViewSync = enableViewSync + } +} + export class LocationUpdate implements Action { readonly coordinate: Coordinate readonly speed: number - readonly heading?: number + readonly heading: number + readonly zoom: number + readonly syncView: boolean - constructor(coordinate: Coordinate, speed: number, heading?: number) { + constructor(coordinate: Coordinate, syncView: boolean, speed: number, heading: number, zoom: number) { this.coordinate = coordinate this.speed = speed + this.syncView = syncView this.heading = heading + this.zoom = zoom } } @@ -206,14 +218,10 @@ export class MapIsLoaded implements Action {} export class ZoomMapToPoint implements Action { readonly coordinate: Coordinate readonly zoom: number - readonly pitch: number - readonly heading: number - constructor(coordinate: Coordinate, zoom: number, pitch: number, heading: number) { + constructor(coordinate: Coordinate, zoom: number) { this.coordinate = coordinate this.zoom = zoom - this.pitch = pitch - this.heading = heading } } diff --git a/src/index.tsx b/src/index.tsx index 995d4dcc..2e52e6aa 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -30,9 +30,10 @@ import PathDetailsStore from '@/stores/PathDetailsStore' import Dispatcher from '@/stores/Dispatcher' import NavBar from '@/NavBar' import App from '@/App' -import { ErrorAction, InfoReceived } from '@/actions/Actions' +import { ErrorAction, InfoReceived, LocationUpdateSync } from '@/actions/Actions' import { toLonLat } from 'ol/proj' import { Pixel } from 'ol/pixel' +import turnNavigation from '@/turnNavigation/TurnNavigation' console.log(`Source code: https://github.com/graphhopper/graphhopper-maps/tree/${GIT_SHA}`) @@ -55,7 +56,13 @@ class CoordSysImpl implements MapCoordinateSystem { return toLonLat(getMap().getCoordinateFromPixel(pixel)) } } - +const turnNavigationStore = new TurnNavigationStore( + getApi(), + speechSynthesizer, + new CoordSysImpl(), + fake != null, + config.defaultTiles +) setStores({ settingsStore: new SettingsStore(), queryStore: queryStore, @@ -63,13 +70,7 @@ setStores({ infoStore: new ApiInfoStore(), errorStore: new ErrorStore(), mapOptionsStore: new MapOptionsStore(), - turnNavigationStore: new TurnNavigationStore( - getApi(), - speechSynthesizer, - new CoordSysImpl(), - fake != null, - config.defaultTiles - ), + turnNavigationStore: turnNavigationStore, pathDetailsStore: new PathDetailsStore(), mapFeatureStore: new MapFeatureStore(), }) @@ -89,7 +90,15 @@ Dispatcher.register(getMapFeatureStore()) // register map action receiver const smallScreenMediaQuery = window.matchMedia('(max-width: 44rem)') -const mapActionReceiver = new MapActionReceiver(getMap(), routeStore, () => smallScreenMediaQuery.matches) +const mapActionReceiver = new MapActionReceiver( + getMap(), + routeStore, + () => smallScreenMediaQuery.matches, + () => { + if (turnNavigationStore.state.settings.syncView) Dispatcher.dispatch(new LocationUpdateSync(false)) + return true + } +) Dispatcher.register(mapActionReceiver) const navBar = new NavBar(getQueryStore(), getMapOptionsStore()) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index f75eebcd..a4585697 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -1,35 +1,36 @@ -import React, {useEffect} from 'react' -import {Feature, Map} from 'ol' -import {Point} from 'ol/geom' -import {fromLonLat} from 'ol/proj' +import React, { useEffect } from 'react' +import { Feature, Map } from 'ol' +import { Point } from 'ol/geom' +import { fromLonLat } from 'ol/proj' import VectorLayer from 'ol/layer/Vector' import VectorSource from 'ol/source/Vector' -import {Icon, Style} from 'ol/style' -import {getCenter} from 'ol/extent' -import {TurnNavigationStoreState} from "@/stores/TurnNavigationStore"; +import { Icon, Style } from 'ol/style' +import { getCenter } from 'ol/extent' +import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' export default function useCurrentLocationLayer(map: Map, turnNavigation: TurnNavigationStoreState) { const point = new Point(fromLonLat([turnNavigation.coordinate.lng, turnNavigation.coordinate.lat])) - const feature = new Feature({geometry: point}) + const feature = new Feature({ geometry: point }) // Synchronize the position of the view animation (see MapActionReceiver) with the arrow via postrender event. // Note that updateWhileAnimating = true for currentLocationLayer is necessary. const onPostrender = () => point.setCoordinates(getCenter(map.getView().calculateExtent())) useEffect(() => { - if(!turnNavigation.showUI) return + if (!turnNavigation.showUI) return const currentLocationLayer = addCurrentLocation(map, feature) - currentLocationLayer.on('postrender', onPostrender) + if (turnNavigation.settings.syncView) currentLocationLayer.on('postrender', onPostrender) return () => { - if(!turnNavigation.showUI) return - currentLocationLayer.un('postrender', onPostrender) + if (!turnNavigation.showUI) return + if (turnNavigation.settings.syncView) currentLocationLayer.un('postrender', onPostrender) map.removeLayer(currentLocationLayer) } - }, [turnNavigation.showUI]) + }, [turnNavigation.showUI, turnNavigation.settings.syncView]) } // we need a filled version of navigation.svg -const svgArrowData = '' + +const svgArrowData = + '' + ' ' + ' ' + ' ' + @@ -38,10 +39,10 @@ const svgArrowData = ' { onSelect() - Dispatcher.dispatch(new ZoomMapToPoint(coordinate, 8, 0, 0)) + Dispatcher.dispatch(new ZoomMapToPoint(coordinate, 8)) }} > {tr('center_map')} diff --git a/src/map/map.ts b/src/map/map.ts index 1772c4bb..ac34e183 100644 --- a/src/map/map.ts +++ b/src/map/map.ts @@ -4,7 +4,7 @@ import { fromLonLat } from 'ol/proj' import { MapIsLoaded } from '@/actions/Actions' import { defaults as defaultControls } from 'ol/control' import styles from '@/map/Map.module.css' -import { defaults } from 'ol/interaction' +import { defaults, DragPan } from 'ol/interaction' let map: Map | undefined diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index ac72adc7..09bd2a6b 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -3,13 +3,14 @@ import { CurrentRequest, RequestState, SubRequest } from '@/stores/QueryStore' import styles from './RoutingResult.module.css' import React, { ReactNode, useContext, useEffect, useState } from 'react' import { - SelectMapLayer, SetSelectedPath, + SelectMapLayer, + SetSelectedPath, TurnNavigationSettingsUpdate, TurnNavigationStart, TurnNavigationStop, } from '@/actions/Actions' import Dispatcher from '@/stores/Dispatcher' -import {metersToShortText, metersToTextForFile, milliSecondsToText} from '@/Converters' +import { metersToShortText, metersToTextForFile, milliSecondsToText } from '@/Converters' import PlainButton from '@/PlainButton' import Details from '@/sidebar/list.svg' import NaviSVG from '@/sidebar/navigation.svg' diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 00e84c68..2b3eb340 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -1,33 +1,37 @@ -import { Action, ActionReceiver } from '@/stores/Dispatcher' +import Dispatcher, { Action, ActionReceiver } from '@/stores/Dispatcher' import { Map } from 'ol' import { fromLonLat } from 'ol/proj' import { InfoReceived, + LocationUpdate, + LocationUpdateSync, PathDetailsRangeSelected, RouteRequestSuccess, SetInitialBBox, SetSelectedPath, TurnNavigationStart, TurnNavigationStop, - ZoomMapToPoint, } from '@/actions/Actions' import RouteStore from '@/stores/RouteStore' import { Bbox } from '@/api/graphhopper' import { Attribution, Zoom } from 'ol/control' import { toRadians } from '@/turnNavigation/GeoMethods' import { linear } from 'ol/easing' +import VectorLayer from 'ol/layer/Vector' export default class MapActionReceiver implements ActionReceiver { readonly map: Map private readonly routeStore: RouteStore private readonly isSmallScreenQuery: () => boolean + private readonly onMove: () => boolean private zoomCtrl: Zoom | null = null private attributionCtrl: Attribution | null = null - constructor(map: Map, routeStore: RouteStore, isSmallScreenQuery: () => boolean) { + constructor(map: Map, routeStore: RouteStore, isSmallScreenQuery: () => boolean, onMove: () => boolean) { this.map = map this.routeStore = routeStore this.isSmallScreenQuery = isSmallScreenQuery + this.onMove = onMove } receive(action: Action) { @@ -44,6 +48,8 @@ export default class MapActionReceiver implements ActionReceiver { // reset padding this.map.getView().padding = [0, 0, 0, 0] this.map.getView().animate({ rotation: 0, zoom: 12, duration: 600 }) + this.map.un('pointerdrag', this.onMove) + this.map.getView().un('change:resolution', this.onMove) } else if (action instanceof TurnNavigationStart) { const size = this.map.getSize() // [width, height] const arr = this.map.getControls() @@ -55,28 +61,42 @@ export default class MapActionReceiver implements ActionReceiver { } if (this.zoomCtrl) arr.remove(this.zoomCtrl) if (this.attributionCtrl) arr.remove(this.attributionCtrl) - } else if (action instanceof ZoomMapToPoint) { + this.map.on('pointerdrag', this.onMove) // disable auto moving&zooming the map if *moving* the map + this.map.getView().on('change:resolution', this.onMove) // disable auto moving&zooming the map if *zooming* the map + } else if (action instanceof LocationUpdate) { const size = this.map.getSize() // [width, height] // move center a bit down this.map.getView().padding = [size ? size[1] / 2 : 0, 0, 0, 0] - - // The heading is in degrees and shows direction into which device is going. - // And although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. - const rotation = - action.heading === null || Number.isNaN(action.heading) - ? this.map.getView().getRotation() - : -toRadians(action.heading) - this.map.getView().cancelAnimations() // if location updates are sent too fast animations might stack up - this.map.getView().animate({ - zoom: action.zoom, - center: fromLonLat([action.coordinate.lng, action.coordinate.lat]), - rotation: rotation, - easing: linear, - // We could use 1000ms or more but map tiles won't update probably due to missing updateWhileAnimating. - // For now, due to performance reasons, we set this to true only for the layer. - duration: 800, - }) + + const center = fromLonLat([action.coordinate.lng, action.coordinate.lat]) + if (action.syncView) { + // The heading is in degrees and shows direction into which device is going. + // And although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. + const rotation = + action.heading === null || Number.isNaN(action.heading) + ? this.map.getView().getRotation() + : -toRadians(action.heading) + this.map.getView().animate({ + zoom: action.zoom, + center: center, + rotation: rotation, + easing: linear, + // We could use 1000ms or more but map tiles won't update probably due to missing updateWhileAnimating. + // For now, due to performance reasons, we set this to true only for the layer. + duration: 800, + }) + } else { + // TODO why does this layer not yet exist in the constructor + const layer = this.map + .getLayers() + .getArray() + .find(layer => layer.get('gh:current_location')) + if (layer && (layer as VectorLayer).getSource()) { + const currentPoint = (layer as VectorLayer).getSource().getFeatures()[0].getGeometry() + if (currentPoint) currentPoint.setCoordinates(center) + } + } } else if (action instanceof RouteRequestSuccess) { // this assumes that always the first path is selected as result. One could use the // state of the routeStore as well, but then we would have to make sure that the route diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 19731fbf..ac33de08 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -4,6 +4,7 @@ import { ErrorAction, InfoReceived, LocationUpdate, + LocationUpdateSync, SelectMapLayer, SetCustomModel, SetCustomModelEnabled, @@ -77,6 +78,7 @@ export interface TNPathDetailsState { export interface TNSettingsState { fakeGPS: boolean + syncView: boolean acceptedRisk: boolean soundEnabled: boolean forceVectorTiles: boolean @@ -119,6 +121,7 @@ export default class TurnNavigationStore extends Store settings: { acceptedRisk: false, fakeGPS: fakeGPS, + syncView: true, soundEnabled: !fakeGPS, forceVectorTiles: true, fullScreen: true, @@ -191,6 +194,8 @@ export default class TurnNavigationStore extends Store ...state, activeProfile: action.profile.name, } + } else if (action instanceof LocationUpdateSync) { + return { ...state, settings: { ...state.settings, syncView: action.enableViewSync } } } else if (action instanceof SetSelectedPath) { // no need to update instruction as changing the path should happen only outside of the navigation if (state.showUI) throw new Error('Changing path while turn navigation should not happen') @@ -543,8 +548,9 @@ export default class TurnNavigationStore extends Store private locationUpdate(pos: any) { let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } - Dispatcher.dispatch(new ZoomMapToPoint(c, 16, 0, pos.coords.heading)) - Dispatcher.dispatch(new LocationUpdate(c, pos.coords.speed, pos.coords.heading)) + Dispatcher.dispatch( + new LocationUpdate(c, this.state.settings.syncView, pos.coords.speed, pos.coords.heading, 16) + ) } private initReal(doFullscreen: boolean) { diff --git a/src/turnNavigation/location_searching.svg b/src/turnNavigation/location_searching.svg new file mode 100644 index 00000000..87191e17 --- /dev/null +++ b/src/turnNavigation/location_searching.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index 84014f98..45782975 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -116,18 +116,18 @@ describe('TurnNavigationStore', () => { ]) const store = createStore(api) Dispatcher.dispatch(new SetSelectedPath(reroute1.paths[0])) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.268908, lat: 51.434871 }, 10, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.268908, lat: 51.434871 }, true, 10, 120, 16)) expect(store.state.speed).toEqual(10) expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) // no rerouting without profile - Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, 12, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, true, 12, 120, 16)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeFalsy() Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.267238, lat: 51.43475 }, 12, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.267238, lat: 51.43475 }, true, 12, 120, 16)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() await flushPromises() @@ -137,7 +137,7 @@ describe('TurnNavigationStore', () => { expect(store.state.instruction.index).toEqual(1) // avoid too frequent rerouting - Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, 10, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, true, 10, 120, 16)) expect(store.state.speed).toEqual(10) expect(store.state.rerouteInProgress).toBeFalsy() @@ -146,7 +146,7 @@ describe('TurnNavigationStore', () => { [14.267240000000001, 51.43253000000001], ]) Dispatcher.dispatch(new TurnNavigationReroutingTimeResetForTest()) // skip waiting 10 seconds - Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, 12, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, true, 12, 120, 16)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() await flushPromises() @@ -161,13 +161,13 @@ describe('TurnNavigationStore', () => { const store = createStore(new LocalApi().setRerouteData(reroute1, rerouteWaypoints)) Dispatcher.dispatch(new SetSelectedPath(routeWithVia.paths[0])) Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.266959, lat: 51.435051 }, 10, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266959, lat: 51.435051 }, true, 10, 120, 16)) expect(store.state.speed).toEqual(10) expect(store.state.instruction.index).toEqual(1) expect(store.state.activePath).toEqual(routeWithVia.paths[0]) // close to via point it should force rerouting to avoid potential interferences with overlapping edges - Dispatcher.dispatch(new LocationUpdate({ lng: 14.269289, lat: 51.434764 }, 12, 70)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.269289, lat: 51.434764 }, true, 12, 70, 16)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() @@ -186,15 +186,15 @@ describe('TurnNavigationStore', () => { const store = createStore(new LocalApi().setRerouteData(reroute1, rerouteWaypoints)) Dispatcher.dispatch(new SetSelectedPath(routeWithSimpleVia.paths[0])) Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.2727, lat: 51.436269 }, 10, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.2727, lat: 51.436269 }, true, 10, 120, 16)) expect(store.state.activePath).toEqual(routeWithSimpleVia.paths[0]) // close to middle waypoint but not within 50m - Dispatcher.dispatch(new LocationUpdate({ lng: 14.27109, lat: 51.435472 }, 12, 70)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.27109, lat: 51.435472 }, true, 12, 70, 16)) expect(store.state.speed).toEqual(12) // close to middle waypoint but again not within 50m but still rerouting as skipWaypoint was true - Dispatcher.dispatch(new LocationUpdate({ lng: 14.271099, lat: 51.435433 }, 14, 70)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.271099, lat: 51.435433 }, true, 14, 70, 16)) expect(store.state.speed).toEqual(14) expect(store.state.rerouteInProgress).toBeTruthy() @@ -216,11 +216,11 @@ describe('TurnNavigationStore', () => { const store = createStore(api) Dispatcher.dispatch(new SetSelectedPath(routeWithSimpleVia.paths[0])) Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.2727, lat: 51.436269 }, 10, 120)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.2727, lat: 51.436269 }, true, 10, 120, 16)) expect(store.state.activePath).toEqual(routeWithSimpleVia.paths[0]) // force reroute - Dispatcher.dispatch(new LocationUpdate({ lng: 14.273946, lat: 51.436422 }, 12, 70)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.273946, lat: 51.436422 }, true, 12, 70, 16)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() await flushPromises() @@ -233,7 +233,7 @@ describe('TurnNavigationStore', () => { [14.267240000000001, 51.43253000000001], ] as [number, number][] api.setRerouteData(reroute1, newWaypoints) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.270589, lat: 51.435272 }, 16, 70)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.270589, lat: 51.435272 }, true, 16, 70, 16)) expect(store.state.speed).toEqual(16) expect(store.state.rerouteInProgress).toBeTruthy() From 3cfe5aa13d255d016daf3ef163d5d8183ebd5fe1 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 6 Apr 2023 23:00:19 +0200 Subject: [PATCH 216/322] for now zooming will not disable synced view as it is not easy to differentiate between user zoom vs. animation zoom --- src/stores/MapActionReceiver.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 2b3eb340..ad222604 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -1,10 +1,9 @@ -import Dispatcher, { Action, ActionReceiver } from '@/stores/Dispatcher' +import { Action, ActionReceiver } from '@/stores/Dispatcher' import { Map } from 'ol' import { fromLonLat } from 'ol/proj' import { InfoReceived, LocationUpdate, - LocationUpdateSync, PathDetailsRangeSelected, RouteRequestSuccess, SetInitialBBox, @@ -49,7 +48,7 @@ export default class MapActionReceiver implements ActionReceiver { this.map.getView().padding = [0, 0, 0, 0] this.map.getView().animate({ rotation: 0, zoom: 12, duration: 600 }) this.map.un('pointerdrag', this.onMove) - this.map.getView().un('change:resolution', this.onMove) + // this.map.getView().un('change:resolution', this.onMove) } else if (action instanceof TurnNavigationStart) { const size = this.map.getSize() // [width, height] const arr = this.map.getControls() @@ -62,7 +61,8 @@ export default class MapActionReceiver implements ActionReceiver { if (this.zoomCtrl) arr.remove(this.zoomCtrl) if (this.attributionCtrl) arr.remove(this.attributionCtrl) this.map.on('pointerdrag', this.onMove) // disable auto moving&zooming the map if *moving* the map - this.map.getView().on('change:resolution', this.onMove) // disable auto moving&zooming the map if *zooming* the map + // TODO this interferes with zooming from inside the application + // this.map.getView().on('change:resolution', this.onMove) // disable auto moving&zooming the map if *zooming* the map } else if (action instanceof LocationUpdate) { const size = this.map.getSize() // [width, height] // move center a bit down From 52fcae7fe07cef1fc5a56592119af56421ac2096 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 7 Apr 2023 12:19:53 +0200 Subject: [PATCH 217/322] bind to this for locationUpdate --- src/stores/TurnNavigationStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index ac33de08..eb12206d 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -571,7 +571,7 @@ export default class TurnNavigationStore extends Store } this.watchId = navigator.geolocation.watchPosition( - this.locationUpdate, + this.locationUpdate.bind(this), err => { // TODO exit fullscreen does not work // Dispatcher.dispatch(new TurnNavigationStop()) From 01f39ea0ae9bdf3c31d3fa99b1cbbbbfcfbf8810 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 9 Apr 2023 11:07:27 +0200 Subject: [PATCH 218/322] increase zoom --- src/stores/MapActionReceiver.ts | 2 +- src/stores/TurnNavigationStore.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index ad222604..b50f6699 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -46,7 +46,7 @@ export default class MapActionReceiver implements ActionReceiver { // reset padding this.map.getView().padding = [0, 0, 0, 0] - this.map.getView().animate({ rotation: 0, zoom: 12, duration: 600 }) + this.map.getView().animate({ rotation: 0, zoom: 14, duration: 600 }) this.map.un('pointerdrag', this.onMove) // this.map.getView().un('change:resolution', this.onMove) } else if (action instanceof TurnNavigationStart) { diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index eb12206d..dc0fd91f 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -18,7 +18,6 @@ import { TurnNavigationSettingsUpdate, TurnNavigationStart, TurnNavigationStop, - ZoomMapToPoint, } from '@/actions/Actions' import Dispatcher, { Action } from '@/stores/Dispatcher' import NoSleep from '@/turnNavigation/nosleep.js' @@ -549,7 +548,7 @@ export default class TurnNavigationStore extends Store private locationUpdate(pos: any) { let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } Dispatcher.dispatch( - new LocationUpdate(c, this.state.settings.syncView, pos.coords.speed, pos.coords.heading, 16) + new LocationUpdate(c, this.state.settings.syncView, pos.coords.speed, pos.coords.heading, 17) ) } From 3c443974a1256442a5ba4b01f9d5167af15c8ba4 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 10 Apr 2023 21:38:05 +0200 Subject: [PATCH 219/322] optimize css and make buttons a bit bigger --- src/App.module.css | 46 ++++++++------- src/App.tsx | 60 ++++++++++---------- src/sidebar/MobileSidebar.tsx | 8 +-- src/sidebar/instructions/Instructions.tsx | 4 +- src/sidebar/times-solid.svg | 15 ++++- src/turnNavigation/TurnNavigation.module.css | 14 ++--- src/turnNavigation/location_searching.svg | 2 +- src/turnNavigation/volume_off.svg | 2 +- src/turnNavigation/volume_up.svg | 2 +- 9 files changed, 80 insertions(+), 73 deletions(-) diff --git a/src/App.module.css b/src/App.module.css index 37d3ab65..5dbf1b7d 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -93,19 +93,23 @@ grid-row: 1 / span 1; margin: 5px 5px; padding: 7px 7px 2px 7px; - height: 30px; + height: 53px; z-index: 2; background-color: white; box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); border-radius: 0.5rem; } +.syncLocation svg { + scale: 0.8; +} + .syncLocation { grid-column: 3 / span 1; grid-row: 1 / span 1; - margin: 50px 5px 5px 5px; + margin: 75px 5px 5px 5px; padding: 7px 7px 2px 7px; - height: 30px; + height: 53px; z-index: 2; background-color: white; box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); @@ -150,30 +154,28 @@ background-color: white; } -.smallScreenVolume svg, -.smallScreenSyncLocation svg { - transform: scale(1.5); -} - -.smallScreenSyncLocation { - grid-row: 2 / span 1; +.smallScreenFirstRow { + grid-row: 1 / span 1; grid-column: 1 / span 1; - margin-top: 5px; - padding: 0.9em 0.7em 0.7em 0.9em; - width: 30px; - height: 30px; + + display: flex; + justify-content: space-between; z-index: 2; +} + +.smallScreenVolume { + align-self: flex-start; + width: 48px; + padding: 5px; background-color: white; box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); border-radius: 0.5rem; } -.smallScreenVolume { - grid-row: 1 / span 1; - grid-column: 1 / span 1; - padding: 0.9em 0.7em 0.7em 0.9em; - width: 30px; - z-index: 2; +.smallScreenSyncLocation { + align-self: flex-end; + width: 48px; + padding: 5px; background-color: white; box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); border-radius: 0.5rem; @@ -221,8 +223,8 @@ fill: lightgray; - height: 14px; - width: 14px; + height: 12px; + width: 12px; right: 6px; top: 5px; diff --git a/src/App.tsx b/src/App.tsx index 61b5d5db..87893823 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -265,40 +265,42 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, encodedValues if (turnNavigation.showUI) return ( <> +
    +
    + Dispatcher.dispatch( + new TurnNavigationSettingsUpdate({ + soundEnabled: !turnNavigation.settings.soundEnabled, + } as TNSettingsState) + ) + } + > + + {turnNavigation.settings.soundEnabled ? ( + + ) : ( + + )} + +
    + {!turnNavigation.settings.syncView && ( +
    Dispatcher.dispatch(new LocationUpdateSync(true))} + > + + + +
    + )} +
    -
    - Dispatcher.dispatch( - new TurnNavigationSettingsUpdate({ - soundEnabled: !turnNavigation.settings.soundEnabled, - } as TNSettingsState) - ) - } - > - - {turnNavigation.settings.soundEnabled ? ( - - ) : ( - - )} - -
    - {!turnNavigation.settings.syncView && ( -
    Dispatcher.dispatch(new LocationUpdateSync(true))} - > - - - -
    - )} ) @@ -310,7 +312,7 @@ function SmallScreenLayout({ query, route, map, error, mapOptions, encodedValues route={route} error={error} encodedValues={encodedValues} - turnNavigation={turnNavigation} + turnNavigationSettings={turnNavigation.settings} />
    diff --git a/src/sidebar/MobileSidebar.tsx b/src/sidebar/MobileSidebar.tsx index 10524dec..1af0fb6d 100644 --- a/src/sidebar/MobileSidebar.tsx +++ b/src/sidebar/MobileSidebar.tsx @@ -11,17 +11,17 @@ import RoutingProfiles from '@/sidebar/search/routingProfiles/RoutingProfiles' import OpenInputsIcon from './unfold.svg' import CloseInputsIcon from './unfold_less.svg' import CustomModelBox from '@/sidebar/CustomModelBox' -import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' +import {TNSettingsState, TurnNavigationStoreState} from '@/stores/TurnNavigationStore' type MobileSidebarProps = { query: QueryStoreState route: RouteStoreState error: ErrorStoreState encodedValues: object[] - turnNavigation: TurnNavigationStoreState + turnNavigationSettings: TNSettingsState } -export default function ({ query, route, error, encodedValues, turnNavigation }: MobileSidebarProps) { +export default function ({ query, route, error, encodedValues, turnNavigationSettings }: MobileSidebarProps) { const [showCustomModelBox, setShowCustomModelBox] = useState(false) // the following three elements control, whether the small search view is displayed const isShortScreen = useMediaQuery({ query: '(max-height: 55rem)' }) @@ -72,7 +72,7 @@ export default function ({ query, route, error, encodedValues, turnNavigation }: queryOngoing={query.currentRequest.subRequests[0]?.state === RequestState.SENT} /> )} - +
    )} {!error.isDismissed && } diff --git a/src/sidebar/instructions/Instructions.tsx b/src/sidebar/instructions/Instructions.tsx index 493f9bfe..8a7836e3 100644 --- a/src/sidebar/instructions/Instructions.tsx +++ b/src/sidebar/instructions/Instructions.tsx @@ -74,10 +74,10 @@ export function getTurnSign(sign: number, index: number, waypointIndex?: number)
    ) } - return {'turn + return {'turn } -export function getSignName(sign: number, index: number) { +export function getSignName(sign: number) { switch (sign) { case -98: return uTurn diff --git a/src/sidebar/times-solid.svg b/src/sidebar/times-solid.svg index 35ed5779..e4327320 100644 --- a/src/sidebar/times-solid.svg +++ b/src/sidebar/times-solid.svg @@ -1,3 +1,12 @@ - - - \ No newline at end of file + + + + diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index eb32cfb6..c4c9a0b1 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -56,21 +56,15 @@ } .thirdCol { - width: 30px; - height: 30px; + height: 0; } .thirdCol svg { - width: 30px; - height: 30px; - padding-left: 0; - padding-right: 0; + width: 20px; + height: 20px; + padding: 0; } -.thirdCol svg path { - fill: black; - stroke: black; -} .maxSpeed { padding: 7px; diff --git a/src/turnNavigation/location_searching.svg b/src/turnNavigation/location_searching.svg index 87191e17..9679f21b 100644 --- a/src/turnNavigation/location_searching.svg +++ b/src/turnNavigation/location_searching.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/src/turnNavigation/volume_off.svg b/src/turnNavigation/volume_off.svg index 85e11a55..119780d7 100644 --- a/src/turnNavigation/volume_off.svg +++ b/src/turnNavigation/volume_off.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/turnNavigation/volume_up.svg b/src/turnNavigation/volume_up.svg index cb56f655..b846b33e 100644 --- a/src/turnNavigation/volume_up.svg +++ b/src/turnNavigation/volume_up.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 487c9ed11af70630b9e441d73aa7bf690436f0f3 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 10 Apr 2023 21:40:16 +0200 Subject: [PATCH 220/322] sync view if 2nd navigation --- src/sidebar/MobileSidebar.tsx | 2 +- src/stores/TurnNavigationStore.ts | 9 ++++++++- src/turnNavigation/TurnNavigation.module.css | 1 - 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/sidebar/MobileSidebar.tsx b/src/sidebar/MobileSidebar.tsx index 1af0fb6d..36a3e748 100644 --- a/src/sidebar/MobileSidebar.tsx +++ b/src/sidebar/MobileSidebar.tsx @@ -11,7 +11,7 @@ import RoutingProfiles from '@/sidebar/search/routingProfiles/RoutingProfiles' import OpenInputsIcon from './unfold.svg' import CloseInputsIcon from './unfold_less.svg' import CustomModelBox from '@/sidebar/CustomModelBox' -import {TNSettingsState, TurnNavigationStoreState} from '@/stores/TurnNavigationStore' +import { TNSettingsState, TurnNavigationStoreState } from '@/stores/TurnNavigationStore' type MobileSidebarProps = { query: QueryStoreState diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index dc0fd91f..12864ee9 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -139,7 +139,14 @@ export default class TurnNavigationStore extends Store // and so we collect this from different actions if (action instanceof TurnNavigationStop) { this.stop() - return { ...state, showUI: false, started: false, speed: 0, heading: 0 } + return { + ...state, + showUI: false, + started: false, + speed: 0, + heading: 0, + settings: { ...state.settings, syncView: true }, + } } else if (action instanceof TurnNavigationSettingsUpdate) { return { ...state, settings: { ...state.settings, ...action.settings } } } else if (action instanceof TurnNavigationStart) { diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index c4c9a0b1..5f9af5e4 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -65,7 +65,6 @@ padding: 0; } - .maxSpeed { padding: 7px; margin-left: 15px; From 3e1fe9d558d68696c309372b05222aeb792b3cda Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 11 Apr 2023 13:48:48 +0200 Subject: [PATCH 221/322] currentLocationLayer can somehow get empty (for longer zoom durations) => postrender won't be called => register postrender to background layer ensures that postrender will always be triggered --- src/layers/CurrentLocationLayer.tsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index a4585697..307a3005 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -7,6 +7,7 @@ import VectorSource from 'ol/source/Vector' import { Icon, Style } from 'ol/style' import { getCenter } from 'ol/extent' import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' +import { Tile } from 'ol/layer' export default function useCurrentLocationLayer(map: Map, turnNavigation: TurnNavigationStoreState) { const point = new Point(fromLonLat([turnNavigation.coordinate.lng, turnNavigation.coordinate.lat])) @@ -18,11 +19,24 @@ export default function useCurrentLocationLayer(map: Map, turnNavigation: TurnNa useEffect(() => { if (!turnNavigation.showUI) return const currentLocationLayer = addCurrentLocation(map, feature) - if (turnNavigation.settings.syncView) currentLocationLayer.on('postrender', onPostrender) + + // attach postrender to current background layer, because for currentLocationLayer it might not be triggered if empty + // (somehow it will be empty for longer zoom durations e.g. here point=51.438901%2C14.245252&point=53.550341%2C10.000654&fake ) + // (if background would be a VectorLayer we could just add the arrow as feature there but we allow rasters and so we need a separate currentLocationLayer) + const layers = map + .getLayers() + .getArray() + .filter(l => { + return l.get('mapbox-source') || l.get('background-raster-layer') + }) + const backgroundLayer = layers.length > 0 ? (layers[0] as Tile) : null + if (backgroundLayer == null) console.error('Cannot find background layer ' + JSON.stringify(layers)) + else if (turnNavigation.settings.syncView) backgroundLayer.on('postrender', onPostrender) return () => { if (!turnNavigation.showUI) return - if (turnNavigation.settings.syncView) currentLocationLayer.un('postrender', onPostrender) + if (backgroundLayer == null) console.error('Cannot find background layer ' + JSON.stringify(layers)) + else if (turnNavigation.settings.syncView) backgroundLayer.un('postrender', onPostrender) map.removeLayer(currentLocationLayer) } }, [turnNavigation.showUI, turnNavigation.settings.syncView]) From 2419a04a363a1d770bb4f31c762136e06b3233e3 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 11 Apr 2023 13:53:27 +0200 Subject: [PATCH 222/322] minor cleanup --- src/layers/CurrentLocationLayer.tsx | 8 ++------ src/layers/UseBackgroundLayer.tsx | 9 ++++++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index 307a3005..5e76fe98 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -8,6 +8,7 @@ import { Icon, Style } from 'ol/style' import { getCenter } from 'ol/extent' import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import { Tile } from 'ol/layer' +import { getCurrentBackgroundLayers } from '@/layers/UseBackgroundLayer' export default function useCurrentLocationLayer(map: Map, turnNavigation: TurnNavigationStoreState) { const point = new Point(fromLonLat([turnNavigation.coordinate.lng, turnNavigation.coordinate.lat])) @@ -23,12 +24,7 @@ export default function useCurrentLocationLayer(map: Map, turnNavigation: TurnNa // attach postrender to current background layer, because for currentLocationLayer it might not be triggered if empty // (somehow it will be empty for longer zoom durations e.g. here point=51.438901%2C14.245252&point=53.550341%2C10.000654&fake ) // (if background would be a VectorLayer we could just add the arrow as feature there but we allow rasters and so we need a separate currentLocationLayer) - const layers = map - .getLayers() - .getArray() - .filter(l => { - return l.get('mapbox-source') || l.get('background-raster-layer') - }) + const layers = getCurrentBackgroundLayers(map) const backgroundLayer = layers.length > 0 ? (layers[0] as Tile) : null if (backgroundLayer == null) console.error('Cannot find background layer ' + JSON.stringify(layers)) else if (turnNavigation.settings.syncView) backgroundLayer.on('postrender', onPostrender) diff --git a/src/layers/UseBackgroundLayer.tsx b/src/layers/UseBackgroundLayer.tsx index 43237ad4..037db4ac 100644 --- a/src/layers/UseBackgroundLayer.tsx +++ b/src/layers/UseBackgroundLayer.tsx @@ -16,15 +16,18 @@ export default function useBackgroundLayer(map: Map, styleOption: StyleOption) { }, [map, styleOption]) } -function removeCurrentBackgroundLayers(map: Map) { - const backgroundLayers = map +export function getCurrentBackgroundLayers(map: Map) { + return map .getLayers() .getArray() .filter(l => { // vector layers added via olms#addLayers have the mapbox-source key return l.get('mapbox-source') || l.get('background-raster-layer') }) - backgroundLayers.forEach(l => map.removeLayer(l)) +} + +function removeCurrentBackgroundLayers(map: Map) { + getCurrentBackgroundLayers(map).forEach(l => map.removeLayer(l)) } function addNewBackgroundLayers(map: Map, styleOption: StyleOption) { From 55b5e5864d2508753e3c17964e4af3ef7898a8e3 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 11 Apr 2023 14:41:56 +0200 Subject: [PATCH 223/322] make max speed 'sign' look fine for >= 100 --- src/turnNavigation/TurnNavigation.module.css | 10 ---------- src/turnNavigation/TurnNavigation.tsx | 12 ++++++++++-- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 5f9af5e4..0290008f 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -64,13 +64,3 @@ height: 20px; padding: 0; } - -.maxSpeed { - padding: 7px; - margin-left: 15px; - text-align: center; - height: 30px; - width: 30px; - border-radius: 50%; - border: 4px solid rgba(255, 0, 0, 0.6); /* red */ -} diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 074c99d5..c2a1a3f0 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -7,6 +7,7 @@ import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import Dispatcher from '@/stores/Dispatcher' import { SelectMapLayer, TurnNavigationStop } from '@/actions/Actions' import PlainButton from '@/PlainButton' +import {ApiImpl} from "@/api/Api"; export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { if (turnNavigation.activePath == null) new Error('activePath cannot be null if TurnNavigation is enabled') @@ -54,9 +55,16 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
    setShowDebug(!showDebug)}>
    {currentSpeed} km/h
    - {pd.maxSpeed != null ? ( -
    {Math.round(pd.maxSpeed)}
    +
    + {pd.maxSpeed != null && (ApiImpl.isMotorVehicle(turnNavigation.activeProfile) || pd.maxSpeed > 50) ? ( + + + + {Math.round(pd.maxSpeed)} + + ) : null} +
    {showDebug ? (
    {pd.estimatedAvgSpeed}
    From f50286868b938ff1b4c86770e4510d8fcc653da1 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 17 Apr 2023 16:08:55 +0200 Subject: [PATCH 224/322] init customModelStr for TurnNavigationStore too --- src/index.tsx | 3 ++- src/stores/TurnNavigationStore.ts | 12 +++++++++--- test/stores/TurnNavigationStore.test.ts | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/index.tsx b/src/index.tsx index 2e52e6aa..bc31d4d0 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -61,7 +61,8 @@ const turnNavigationStore = new TurnNavigationStore( speechSynthesizer, new CoordSysImpl(), fake != null, - config.defaultTiles + config.defaultTiles, + queryStore.state.customModelEnabled ? queryStore.state.customModelStr : '' ) setStores({ settingsStore: new SettingsStore(), diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 12864ee9..e3330533 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -101,7 +101,8 @@ export default class TurnNavigationStore extends Store speechSynthesizer: SpeechSynthesizer, cs: MapCoordinateSystem, fakeGPS: boolean, - tiles: string + tiles: string, + customModelStr: string, ) { super({ showUI: false, @@ -111,8 +112,8 @@ export default class TurnNavigationStore extends Store speed: 0, initialPath: null, activePath: null, - customModelEnabled: false, - customModelStr: '', + customModelEnabled: !!customModelStr, + customModelStr: customModelStr, rerouteInProgress: false, lastRerouteTime: 0, lastRerouteDistanceToRoute: 0, @@ -184,6 +185,7 @@ export default class TurnNavigationStore extends Store customModelEnabled: action.enabled, } } else if (action instanceof SetCustomModel) { + console.log("SetCustomModel " + action.customModelStr) return { ...state, customModelStr: action.customModelStr, @@ -260,6 +262,10 @@ export default class TurnNavigationStore extends Store if (nextWaypoints.length == 0) throw Error('rerouting needs a destination but was empty ' + JSON.stringify(path)) const customModel = TurnNavigationStore.getCustomModel(state) + + if(customModel) console.log("custom model areas " + customModel.areas.length) + else console.log("no custom model") + let args: RoutingArgs = { points: [[coordinate.lng, coordinate.lat] as [number, number]].concat(nextWaypoints), maxAlternativeRoutes: 0, diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index 45782975..92dbbd84 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -245,7 +245,7 @@ describe('TurnNavigationStore', () => { }) function createStore(api: Api) { - const store = new TurnNavigationStore(api, new DummySpeech(), new DummyCS(), true, '') + const store = new TurnNavigationStore(api, new DummySpeech(), new DummyCS(), true, '', '') Dispatcher.register(store) return store } From ec6aae654289869ade030d125c407ef2af2e610b Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 25 Apr 2023 14:32:59 +0200 Subject: [PATCH 225/322] test for custom model navigation --- src/layers/CurrentLocationLayer.tsx | 7 ++++-- src/stores/TurnNavigationStore.ts | 3 --- test/stores/TurnNavigationStore.test.ts | 32 ++++++++++++++++++++++++- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index 5e76fe98..02d5c72b 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -26,8 +26,11 @@ export default function useCurrentLocationLayer(map: Map, turnNavigation: TurnNa // (if background would be a VectorLayer we could just add the arrow as feature there but we allow rasters and so we need a separate currentLocationLayer) const layers = getCurrentBackgroundLayers(map) const backgroundLayer = layers.length > 0 ? (layers[0] as Tile) : null - if (backgroundLayer == null) console.error('Cannot find background layer ' + JSON.stringify(layers)) - else if (turnNavigation.settings.syncView) backgroundLayer.on('postrender', onPostrender) + if (backgroundLayer == null) console.error('Cannot find background layer ' + layers.length) + else if (turnNavigation.settings.syncView) { + console.info('Found background layer ' + layers.length) + backgroundLayer.on('postrender', onPostrender) + } return () => { if (!turnNavigation.showUI) return diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index e3330533..e1001069 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -263,9 +263,6 @@ export default class TurnNavigationStore extends Store throw Error('rerouting needs a destination but was empty ' + JSON.stringify(path)) const customModel = TurnNavigationStore.getCustomModel(state) - if(customModel) console.log("custom model areas " + customModel.areas.length) - else console.log("no custom model") - let args: RoutingArgs = { points: [[coordinate.lng, coordinate.lat] as [number, number]].concat(nextWaypoints), maxAlternativeRoutes: 0, diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index 92dbbd84..e470e258 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -3,7 +3,7 @@ */ import Dispatcher from '@/stores/Dispatcher' import { - LocationUpdate, + LocationUpdate, SetCustomModel, SetCustomModelEnabled, SetSelectedPath, SetVehicleProfile, TurnNavigationReroutingTimeResetForTest, @@ -242,6 +242,36 @@ describe('TurnNavigationStore', () => { expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) }) + + it('should reroute with custom model', async () => { + const customModelStr = "{\"distance_influence\": 60, \"speed\":[{ \"if\": \"road_class == PRIMARY\", \"multiply_by\": \"0.9\"}]}" + const api = new LocalApi() + api.setRerouteData(reroute1, [ + [14.267238, 51.43475], + [14.267240000000001, 51.43253000000001], + ]) + const store = createStore(api) + Dispatcher.dispatch(new SetCustomModel(customModelStr, false)) + Dispatcher.dispatch(new SetCustomModelEnabled(true)) + Dispatcher.dispatch(new SetSelectedPath(reroute1.paths[0])) + Dispatcher.dispatch(new LocationUpdate({lng: 14.268908, lat: 51.434871}, true, 10, 120, 16)) + expect(store.state.customModelStr).toEqual(customModelStr) + expect(store.state.speed).toEqual(10) + expect(store.state.activePath).toEqual(reroute1.paths[0]) + expect(store.state.instruction.index).toEqual(1) + + Dispatcher.dispatch(new SetVehicleProfile({name: 'car'})) + Dispatcher.dispatch(new LocationUpdate({lng: 14.267238, lat: 51.43475}, true, 12, 120, 16)) + expect(store.state.customModelStr).toEqual(customModelStr) + expect(store.state.speed).toEqual(12) + expect(store.state.rerouteInProgress).toBeTruthy() + await flushPromises() + expect(store.state.rerouteInProgress).toBeFalsy() + + expect(store.state.customModelStr).toEqual(customModelStr) + expect(store.state.activePath).toEqual(reroute1.paths[0]) + expect(store.state.instruction.index).toEqual(1) + }) }) function createStore(api: Api) { From 690032b47f8cb0007b72b481c6e45fdeb86c5e1c Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 25 Apr 2023 14:35:09 +0200 Subject: [PATCH 226/322] formatting --- src/stores/TurnNavigationStore.ts | 4 ++-- test/stores/TurnNavigationStore.test.ts | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index e1001069..1ccb561a 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -102,7 +102,7 @@ export default class TurnNavigationStore extends Store cs: MapCoordinateSystem, fakeGPS: boolean, tiles: string, - customModelStr: string, + customModelStr: string ) { super({ showUI: false, @@ -185,7 +185,7 @@ export default class TurnNavigationStore extends Store customModelEnabled: action.enabled, } } else if (action instanceof SetCustomModel) { - console.log("SetCustomModel " + action.customModelStr) + console.log('SetCustomModel ' + action.customModelStr) return { ...state, customModelStr: action.customModelStr, diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index e470e258..300e2362 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -3,7 +3,9 @@ */ import Dispatcher from '@/stores/Dispatcher' import { - LocationUpdate, SetCustomModel, SetCustomModelEnabled, + LocationUpdate, + SetCustomModel, + SetCustomModelEnabled, SetSelectedPath, SetVehicleProfile, TurnNavigationReroutingTimeResetForTest, @@ -244,7 +246,8 @@ describe('TurnNavigationStore', () => { }) it('should reroute with custom model', async () => { - const customModelStr = "{\"distance_influence\": 60, \"speed\":[{ \"if\": \"road_class == PRIMARY\", \"multiply_by\": \"0.9\"}]}" + const customModelStr = + '{"distance_influence": 60, "speed":[{ "if": "road_class == PRIMARY", "multiply_by": "0.9"}]}' const api = new LocalApi() api.setRerouteData(reroute1, [ [14.267238, 51.43475], @@ -254,14 +257,14 @@ describe('TurnNavigationStore', () => { Dispatcher.dispatch(new SetCustomModel(customModelStr, false)) Dispatcher.dispatch(new SetCustomModelEnabled(true)) Dispatcher.dispatch(new SetSelectedPath(reroute1.paths[0])) - Dispatcher.dispatch(new LocationUpdate({lng: 14.268908, lat: 51.434871}, true, 10, 120, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.268908, lat: 51.434871 }, true, 10, 120, 16)) expect(store.state.customModelStr).toEqual(customModelStr) expect(store.state.speed).toEqual(10) expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) - Dispatcher.dispatch(new SetVehicleProfile({name: 'car'})) - Dispatcher.dispatch(new LocationUpdate({lng: 14.267238, lat: 51.43475}, true, 12, 120, 16)) + Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.267238, lat: 51.43475 }, true, 12, 120, 16)) expect(store.state.customModelStr).toEqual(customModelStr) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() From 59212faf217d6ca1235893256dfacdce820b820a Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 25 Apr 2023 15:10:44 +0200 Subject: [PATCH 227/322] make it less likely that rm+add background layer causes empty layers in CurrentLocationLayer --- src/sidebar/RoutingResults.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index 962838b6..b28b67c1 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -332,8 +332,8 @@ function RoutingResult({ } function startNavigation(forceVectorTiles: boolean) { - Dispatcher.dispatch(new TurnNavigationStart()) if (forceVectorTiles) Dispatcher.dispatch(new SelectMapLayer(config.navigationTiles)) + Dispatcher.dispatch(new TurnNavigationStart()) } function RHButton(p: { From 0bed7d9a19a7321a5077abad66b9f4a6ebe0e6a5 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 25 Apr 2023 15:12:18 +0200 Subject: [PATCH 228/322] remove less common .info --- src/layers/CurrentLocationLayer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index 02d5c72b..a6b61c0f 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -28,7 +28,7 @@ export default function useCurrentLocationLayer(map: Map, turnNavigation: TurnNa const backgroundLayer = layers.length > 0 ? (layers[0] as Tile) : null if (backgroundLayer == null) console.error('Cannot find background layer ' + layers.length) else if (turnNavigation.settings.syncView) { - console.info('Found background layer ' + layers.length) + console.log('Found background layer ' + layers.length) backgroundLayer.on('postrender', onPostrender) } From 1dda08710f84d88fc8b328f24c2ce32d01d24f1c Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 25 Apr 2023 16:01:15 +0200 Subject: [PATCH 229/322] fix background layer switching for navigation --- src/actions/Actions.ts | 4 +++- src/sidebar/RoutingResults.tsx | 2 +- src/stores/TurnNavigationStore.ts | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index ebfcae33..ec9a13e2 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -191,9 +191,11 @@ export class DismissLastError implements Action {} export class SelectMapLayer implements Action { readonly layer: string + readonly forNavigation: boolean - constructor(layer: string) { + constructor(layer: string, forNavigation: boolean = false) { this.layer = layer + this.forNavigation = forNavigation } } diff --git a/src/sidebar/RoutingResults.tsx b/src/sidebar/RoutingResults.tsx index b28b67c1..b397f85c 100644 --- a/src/sidebar/RoutingResults.tsx +++ b/src/sidebar/RoutingResults.tsx @@ -332,7 +332,7 @@ function RoutingResult({ } function startNavigation(forceVectorTiles: boolean) { - if (forceVectorTiles) Dispatcher.dispatch(new SelectMapLayer(config.navigationTiles)) + if (forceVectorTiles) Dispatcher.dispatch(new SelectMapLayer(config.navigationTiles, true)) Dispatcher.dispatch(new TurnNavigationStart()) } diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 1ccb561a..4a123e61 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -168,7 +168,7 @@ export default class TurnNavigationStore extends Store settings: { ...state.settings, fullScreen: !state.settings.fullScreen }, } } else if (action instanceof SelectMapLayer) { - if (!this.state.started) + if (!this.state.started && !action.forNavigation) return { ...state, oldTiles: action.layer, From 31b3e538f837275c754afce4d39b5fcc3084f50c Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 25 Apr 2023 16:41:43 +0200 Subject: [PATCH 230/322] better simulation with fake= parameter --- src/index.tsx | 5 +- src/stores/TurnNavigationStore.ts | 76 ++++++++++++------------- test/stores/TurnNavigationStore.test.ts | 2 +- 3 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/index.tsx b/src/index.tsx index bc31d4d0..39d4212f 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -39,7 +39,8 @@ console.log(`Source code: https://github.com/graphhopper/graphhopper-maps/tree/$ const url = new URL(window.location.href) const locale = url.searchParams.get('locale') -const fake = url.searchParams.get('fake') +const fakeParam = url.searchParams.get('fake') +const fakeGPSDelta = fakeParam ? parseFloat(fakeParam) : NaN setTranslation(locale || navigator.language) // use graphhopper api key from url or try using one from the config @@ -60,7 +61,7 @@ const turnNavigationStore = new TurnNavigationStore( getApi(), speechSynthesizer, new CoordSysImpl(), - fake != null, + fakeGPSDelta, config.defaultTiles, queryStore.state.customModelEnabled ? queryStore.state.customModelStr : '' ) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 4a123e61..d0fd8ca4 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -30,7 +30,6 @@ import { toDegrees, toNorthBased, } from '@/turnNavigation/GeoMethods' -import * as config from 'config' import { Instruction, Path, RoutingArgs } from '@/api/graphhopper' import { tr } from '@/translation/Translation' import { SpeechSynthesizer } from '@/SpeechSynthesizer' @@ -76,7 +75,7 @@ export interface TNPathDetailsState { } export interface TNSettingsState { - fakeGPS: boolean + fakeGPSDelta: number syncView: boolean acceptedRisk: boolean soundEnabled: boolean @@ -100,7 +99,7 @@ export default class TurnNavigationStore extends Store api: Api, speechSynthesizer: SpeechSynthesizer, cs: MapCoordinateSystem, - fakeGPS: boolean, + fakeGPSDelta: number, tiles: string, customModelStr: string ) { @@ -120,9 +119,9 @@ export default class TurnNavigationStore extends Store activeProfile: '', settings: { acceptedRisk: false, - fakeGPS: fakeGPS, + fakeGPSDelta: fakeGPSDelta, syncView: true, - soundEnabled: !fakeGPS, + soundEnabled: Number.isNaN(fakeGPSDelta), forceVectorTiles: true, fullScreen: true, } as TNSettingsState, @@ -154,8 +153,8 @@ export default class TurnNavigationStore extends Store // Make sound work for Safari 16.1.2. Otherwise, it probably thinks that the LocationUpdates are NOT user-triggered. this.speechSynthesizer.synthesize('') - if (state.settings.fakeGPS) this.initFake() - else this.initReal(this.state.settings.fullScreen) + if (Number.isNaN(state.settings.fakeGPSDelta)) this.initReal() + else this.initFake() return { ...state, started: true } } else if (action instanceof ToggleVectorTilesForNavigation) { return { @@ -165,7 +164,7 @@ export default class TurnNavigationStore extends Store } else if (action instanceof ToggleFullScreenForNavigation) { return { ...state, - settings: { ...state.settings, fullScreen: !state.settings.fullScreen }, + settings: {...state.settings, fullScreen: !state.settings.fullScreen}, } } else if (action instanceof SelectMapLayer) { if (!this.state.started && !action.forNavigation) @@ -216,8 +215,12 @@ export default class TurnNavigationStore extends Store pathDetails: {} as TNPathDetailsState, } } else if (action instanceof LocationUpdate) { - if (state.initialPath == null) throw new Error('initialPath must not be null') - if (state.activePath == null) throw new Error('activePath must not be null') + if (state.initialPath == null || state.activePath == null) { + // this can happen e.g. if the turn navigation was stopped before a location update came in + console.log("LocationUpdate skipped due to activePath or initialPath being null") + return state + } + const coordinate = action.coordinate let path = state.activePath let instr = getCurrentInstruction(path.instructions, coordinate) @@ -490,27 +493,17 @@ export default class TurnNavigationStore extends Store return } - // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car&layer=MapTiler&fake=true - let api = new ApiImpl(config.routingApi, config.geocodingApi, config.keys.graphhopper) - let response = await api.route({ - points: [ - [14.245254, 51.439291], - [14.234999, 51.43322], - ], - heading: 0, - profile: 'car', - maxAlternativeRoutes: 0, - customModel: null, - }) + const path = this.state.initialPath ? this.state.initialPath : await this.createFixedPathFromAPICall() // TODO: skip too close points and interpolate if too big distance - let coords: number[][] = response.paths[0].points.coordinates + let coords: number[][] = path.points.coordinates let latlon: number[][] = new Array(coords.length) + const delta = this.state.settings.fakeGPSDelta for (let idx = 0; idx < coords.length; idx++) { // very ugly: in JS the random object cannot be initialed with a seed - const lat = coords[idx][1] + 0.0001 * Math.random() // approx +-5m ? - const lon = coords[idx][0] + 0.0001 * Math.random() + const lat = coords[idx][1] + delta * Math.random() // add randomness + const lon = coords[idx][0] + delta * Math.random() let heading = 0 if (idx > 0) { const prevLat = coords[idx - 1][1] @@ -522,19 +515,8 @@ export default class TurnNavigationStore extends Store } let currentIndex: number = 0 - this.locationUpdate({ - coords: { - latitude: latlon[currentIndex][0], - longitude: latlon[currentIndex][1], - heading: latlon[currentIndex][2], - speed: latlon[currentIndex][3], - }, - }) - this.interval = setInterval(() => { - currentIndex++ currentIndex %= latlon.length - // console.log(currentIndex) this.locationUpdate({ coords: { latitude: latlon[currentIndex][0], @@ -543,11 +525,28 @@ export default class TurnNavigationStore extends Store speed: latlon[currentIndex][3], }, }) + currentIndex++ }, 1000) this.doNoSleep() } + private async createFixedPathFromAPICall() { + // http://localhost:3000/?point=51.439291%2C14.245254&point=51.43322%2C14.234999&profile=car&layer=MapTiler&fake=true + let response = await this.api.route({ + points: [ + [14.245254, 51.439291], + [14.234999, 51.43322], + ], + heading: 0, + profile: 'car', + maxAlternativeRoutes: 0, + customModel: null, + }) + + return response.paths[0] + } + private doNoSleep() { if (!this.noSleep) this.noSleep = new NoSleep() this.noSleep.enable().catch(err => { @@ -557,12 +556,13 @@ export default class TurnNavigationStore extends Store private locationUpdate(pos: any) { let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } + console.log(c) Dispatcher.dispatch( new LocationUpdate(c, this.state.settings.syncView, pos.coords.speed, pos.coords.heading, 17) ) } - private initReal(doFullscreen: boolean) { + private initReal() { if (!navigator.geolocation) { console.log('location not supported. In firefox I had to set geo.enabled=true in about:config') } else { @@ -570,7 +570,7 @@ export default class TurnNavigationStore extends Store // force calling clearWatch can help to find GPS fix more reliable in android firefox if (this.watchId !== undefined) navigator.geolocation.clearWatch(this.watchId) - if (doFullscreen) + if (this.state.settings.fullScreen) try { let el = document.documentElement let requestFullscreenFct = el.requestFullscreen diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index 300e2362..225709a0 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -278,7 +278,7 @@ describe('TurnNavigationStore', () => { }) function createStore(api: Api) { - const store = new TurnNavigationStore(api, new DummySpeech(), new DummyCS(), true, '', '') + const store = new TurnNavigationStore(api, new DummySpeech(), new DummyCS(), 0, '', '') Dispatcher.register(store) return store } From a957cc7a71247f7e08aa9ac819cb8a29dd11c85a Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 25 Apr 2023 16:42:22 +0200 Subject: [PATCH 231/322] formatting --- src/stores/TurnNavigationStore.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index d0fd8ca4..d8dc24a1 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -164,7 +164,7 @@ export default class TurnNavigationStore extends Store } else if (action instanceof ToggleFullScreenForNavigation) { return { ...state, - settings: {...state.settings, fullScreen: !state.settings.fullScreen}, + settings: { ...state.settings, fullScreen: !state.settings.fullScreen }, } } else if (action instanceof SelectMapLayer) { if (!this.state.started && !action.forNavigation) @@ -217,7 +217,7 @@ export default class TurnNavigationStore extends Store } else if (action instanceof LocationUpdate) { if (state.initialPath == null || state.activePath == null) { // this can happen e.g. if the turn navigation was stopped before a location update came in - console.log("LocationUpdate skipped due to activePath or initialPath being null") + console.log('LocationUpdate skipped due to activePath or initialPath being null') return state } From b313b6dc72373bb4cd42a11aee0543f9f6a2c1ba Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 25 Apr 2023 19:08:06 +0200 Subject: [PATCH 232/322] ignore heavy rotation when nearly standstill e.g. often happens at a junction --- src/stores/MapActionReceiver.ts | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index cf636eb6..d33ec1e6 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -17,6 +17,7 @@ import { Attribution, Zoom } from 'ol/control' import { toRadians } from '@/turnNavigation/GeoMethods' import { linear } from 'ol/easing' import VectorLayer from 'ol/layer/Vector' +import { LineString } from 'ol/geom' export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -64,20 +65,25 @@ export default class MapActionReceiver implements ActionReceiver { // TODO this interferes with zooming from inside the application // this.map.getView().on('change:resolution', this.onMove) // disable auto moving&zooming the map if *zooming* the map } else if (action instanceof LocationUpdate) { + const mapView = this.map.getView() const size = this.map.getSize() // [width, height] // move center a bit down - this.map.getView().padding = [size ? size[1] / 2 : 0, 0, 0, 0] - this.map.getView().cancelAnimations() // if location updates are sent too fast animations might stack up + mapView.padding = [size ? size[1] / 2 : 0, 0, 0, 0] + mapView.cancelAnimations() // if location updates are sent too fast animations might stack up const center = fromLonLat([action.coordinate.lng, action.coordinate.lat]) if (action.syncView) { // The heading is in degrees and shows direction into which device is going. - // And although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. - const rotation = - action.heading === null || Number.isNaN(action.heading) - ? this.map.getView().getRotation() - : -toRadians(action.heading) - this.map.getView().animate({ + // Although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. + let rotation = Number.isNaN(action.heading) ? mapView.getRotation() : -toRadians(action.heading) + + // Ignore heavy rotation when nearly no movement. + const arr = mapView.getCenter() + const rotDelta = Math.abs(mapView.getRotation() - rotation) + if (arr && new LineString([arr, center]).getLength() < 1 && rotDelta > Math.PI / 2) + rotation = mapView.getRotation() + + mapView.animate({ zoom: action.zoom, center: center, rotation: rotation, From c87b0f80d8a4636f1c1706588ac6c5237df4be72 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 25 Apr 2023 19:09:31 +0200 Subject: [PATCH 233/322] do not say reroute if waypoint is just skipped --- src/stores/TurnNavigationStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index d8dc24a1..5f197294 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -279,7 +279,7 @@ export default class TurnNavigationStore extends Store if (result.paths.length > 0) { console.log('rerouted:' + state.activePath?.distance + '->' + result.paths[0].distance) Dispatcher.dispatch(new TurnNavigationRerouting(result.paths[0])) - this.synthesize(tr('reroute')) + if (!skipWaypoint) this.synthesize(tr('reroute')) } else { console.log('rerouting found no path: {}', result) Dispatcher.dispatch(new TurnNavigationReroutingFailed()) From dbcea702a5e35ebd5ffca602314f5dcf83102049 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 25 Apr 2023 23:09:03 +0200 Subject: [PATCH 234/322] add missing steps in simulation to better know when turn is announced --- src/stores/TurnNavigationStore.ts | 39 +++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 5f197294..d1afe307 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -495,15 +495,35 @@ export default class TurnNavigationStore extends Store const path = this.state.initialPath ? this.state.initialPath : await this.createFixedPathFromAPICall() - // TODO: skip too close points and interpolate if too big distance - let coords: number[][] = path.points.coordinates - let latlon: number[][] = new Array(coords.length) + // TODO: skip too close points + let origCoords: number[][] = path.points.coordinates + if(origCoords.length == 0) return + let coords : number[][] = [] + + // interpolate if too big distance + for(let idx = 0; idx < origCoords.length - 1; idx++) { + const currC = origCoords[idx] + const nextC = origCoords[idx + 1] + const dist = calcDist({ lng: currC[0], lat: currC[1] }, { lng: nextC[0], lat: nextC[1] }) + const count = Math.round(dist / 15) + coords.push(currC) + for (let i = 1; i < count; i++) { + const lng = currC[0] + i / count * (nextC[0] - currC[0]) + const lat = currC[1] + i / count * (nextC[1] - currC[1]) + coords.push([lng, lat]) + } + if(idx == origCoords.length - 1) + coords.push(nextC) + } + let latLngHeadSpeed: number[][] = new Array(coords.length) const delta = this.state.settings.fakeGPSDelta for (let idx = 0; idx < coords.length; idx++) { // very ugly: in JS the random object cannot be initialed with a seed const lat = coords[idx][1] + delta * Math.random() // add randomness const lon = coords[idx][0] + delta * Math.random() + console.log(idx + " " + lat + "," + lon) + let heading = 0 if (idx > 0) { const prevLat = coords[idx - 1][1] @@ -511,18 +531,18 @@ export default class TurnNavigationStore extends Store let o = calcOrientation(prevLat, prevLon, lat, lon) heading = toDegrees(toNorthBased(o)) } - latlon[idx] = [lat, lon, heading, 4] + latLngHeadSpeed[idx] = [lat, lon, heading, 4] } let currentIndex: number = 0 this.interval = setInterval(() => { - currentIndex %= latlon.length + currentIndex %= latLngHeadSpeed.length this.locationUpdate({ coords: { - latitude: latlon[currentIndex][0], - longitude: latlon[currentIndex][1], - heading: latlon[currentIndex][2], - speed: latlon[currentIndex][3], + latitude: latLngHeadSpeed[currentIndex][0], + longitude: latLngHeadSpeed[currentIndex][1], + heading: latLngHeadSpeed[currentIndex][2], + speed: latLngHeadSpeed[currentIndex][3], }, }) currentIndex++ @@ -556,7 +576,6 @@ export default class TurnNavigationStore extends Store private locationUpdate(pos: any) { let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } - console.log(c) Dispatcher.dispatch( new LocationUpdate(c, this.state.settings.syncView, pos.coords.speed, pos.coords.heading, 17) ) From 1d8620bde57a6d40e4f9b3062ed923f86d921003 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 26 Apr 2023 00:06:52 +0200 Subject: [PATCH 235/322] tweak turn announcements --- src/stores/TurnNavigationStore.ts | 32 +++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index d1afe307..1b873bcd 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -321,8 +321,10 @@ export default class TurnNavigationStore extends Store const nextInstruction: Instruction = path.instructions[instr.index] const text = nextInstruction.street_name if (state.settings.soundEnabled) { - // making lastAnnounceDistance dependent on location.speed is tricky because then it can change while driving, so pick the constant average speed - let lastAnnounceDistance = 10 + 2 * Math.round(estimatedAvgSpeed / 5) * 5 + // announce proportional earlier if faster + const factor = estimatedAvgSpeed < 40 ? 2 : estimatedAvgSpeed < 80 ? 4 : 8 + // prefer nearly constant average speed because location.speed changes more often while driving + const lastAnnounceDistance = 10 + factor * estimatedAvgSpeed if ( instr.distanceToTurn <= lastAnnounceDistance && @@ -331,7 +333,8 @@ export default class TurnNavigationStore extends Store this.synthesize(nextInstruction.text) } - const firstAnnounceDistance = 1150 + const firstAnnounceDistance = 1150 + factor * estimatedAvgSpeed + console.log('first announce: ' + firstAnnounceDistance + ' last: ' + lastAnnounceDistance) if ( estimatedAvgSpeed > 15 && // two announcements only if faster speed instr.distanceToTurn > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) @@ -339,7 +342,9 @@ export default class TurnNavigationStore extends Store (instructionState.distanceToTurn > firstAnnounceDistance || instr.index != instructionState.index) ) { let inString = - instr.distanceToTurn > 800 + instr.distanceToTurn > 1200 + ? tr('in_km', [(instr.distanceToTurn / 1000).toFixed(1)]) + : instr.distanceToTurn > 900 ? tr('in_km_singular') : tr('in_m', ['' + Math.round(instr.distanceToTurn / 100) * 100]) this.synthesize(inString + ' ' + nextInstruction.text) @@ -429,6 +434,7 @@ export default class TurnNavigationStore extends Store } private synthesize(text: string) { + console.log('speak: ' + text) if (this.state.settings.soundEnabled) this.speechSynthesizer.synthesize(text) } @@ -497,32 +503,30 @@ export default class TurnNavigationStore extends Store // TODO: skip too close points let origCoords: number[][] = path.points.coordinates - if(origCoords.length == 0) return - let coords : number[][] = [] + if (origCoords.length == 0) return + let coords: number[][] = [] // interpolate if too big distance - for(let idx = 0; idx < origCoords.length - 1; idx++) { + for (let idx = 0; idx < origCoords.length - 1; idx++) { const currC = origCoords[idx] const nextC = origCoords[idx + 1] const dist = calcDist({ lng: currC[0], lat: currC[1] }, { lng: nextC[0], lat: nextC[1] }) - const count = Math.round(dist / 15) + const count = Math.round(dist / this.state.settings.fakeGPSDelta) coords.push(currC) for (let i = 1; i < count; i++) { - const lng = currC[0] + i / count * (nextC[0] - currC[0]) - const lat = currC[1] + i / count * (nextC[1] - currC[1]) + const lng = currC[0] + (i / count) * (nextC[0] - currC[0]) + const lat = currC[1] + (i / count) * (nextC[1] - currC[1]) coords.push([lng, lat]) } - if(idx == origCoords.length - 1) - coords.push(nextC) + if (idx == origCoords.length - 1) coords.push(nextC) } let latLngHeadSpeed: number[][] = new Array(coords.length) - const delta = this.state.settings.fakeGPSDelta + const delta = 0 for (let idx = 0; idx < coords.length; idx++) { // very ugly: in JS the random object cannot be initialed with a seed const lat = coords[idx][1] + delta * Math.random() // add randomness const lon = coords[idx][0] + delta * Math.random() - console.log(idx + " " + lat + "," + lon) let heading = 0 if (idx > 0) { From e338c26eee641529bd1edf5d40a0e14fe51a523a Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 29 Apr 2023 13:39:29 +0200 Subject: [PATCH 236/322] earlier instruction text and factor=8 only for selected road classes --- src/stores/TurnNavigationStore.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 1b873bcd..f2e3e750 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -322,7 +322,7 @@ export default class TurnNavigationStore extends Store const text = nextInstruction.street_name if (state.settings.soundEnabled) { // announce proportional earlier if faster - const factor = estimatedAvgSpeed < 40 ? 2 : estimatedAvgSpeed < 80 ? 4 : 8 + const factor = estimatedAvgSpeed < 70 ? 2 : (roadClass == "trunk" || roadClass == "motorway" ? 7 : 4) // prefer nearly constant average speed because location.speed changes more often while driving const lastAnnounceDistance = 10 + factor * estimatedAvgSpeed @@ -337,7 +337,7 @@ export default class TurnNavigationStore extends Store console.log('first announce: ' + firstAnnounceDistance + ' last: ' + lastAnnounceDistance) if ( estimatedAvgSpeed > 15 && // two announcements only if faster speed - instr.distanceToTurn > lastAnnounceDistance + 50 && // do not interfere with last announcement. also "1 km" should stay valid (approximately) + instr.distanceToTurn > lastAnnounceDistance * 1.2 + 50 && // do not interfere with last announcement instr.distanceToTurn <= firstAnnounceDistance && (instructionState.distanceToTurn > firstAnnounceDistance || instr.index != instructionState.index) ) { From c993d9b01459499beb4727f1fd0a7a8ca96dfa2f Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 2 May 2023 10:36:49 +0200 Subject: [PATCH 237/322] less random rotation at standstill --- src/stores/MapActionReceiver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index d33ec1e6..357ea068 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -80,7 +80,7 @@ export default class MapActionReceiver implements ActionReceiver { // Ignore heavy rotation when nearly no movement. const arr = mapView.getCenter() const rotDelta = Math.abs(mapView.getRotation() - rotation) - if (arr && new LineString([arr, center]).getLength() < 1 && rotDelta > Math.PI / 2) + if (arr && (new LineString([arr, center]).getLength() < 1 || action.speed < 3) && rotDelta > Math.PI / 4) rotation = mapView.getRotation() mapView.animate({ From a8c7042a9bd54f6a02759a30823e054b545c9211 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 17 May 2023 18:29:37 +0200 Subject: [PATCH 238/322] announce earlier for slower speeds --- src/stores/TurnNavigationStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index f2e3e750..b900d804 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -324,7 +324,7 @@ export default class TurnNavigationStore extends Store // announce proportional earlier if faster const factor = estimatedAvgSpeed < 70 ? 2 : (roadClass == "trunk" || roadClass == "motorway" ? 7 : 4) // prefer nearly constant average speed because location.speed changes more often while driving - const lastAnnounceDistance = 10 + factor * estimatedAvgSpeed + const lastAnnounceDistance = Math.max(30, 20 + factor * estimatedAvgSpeed) if ( instr.distanceToTurn <= lastAnnounceDistance && From 46015e8e9b35015ae78f25cfc7488d799f141fc9 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 18 May 2023 13:46:37 +0200 Subject: [PATCH 239/322] reduce 'ignore'-speed to 1m/s and ignore without big angle change if speed is 0 --- src/actions/Actions.ts | 2 +- src/stores/MapActionReceiver.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index ec9a13e2..47120ea7 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -26,7 +26,7 @@ export class LocationUpdateSync implements Action { export class LocationUpdate implements Action { readonly coordinate: Coordinate - readonly speed: number + readonly speed: number // in meter/sec readonly heading: number readonly zoom: number readonly syncView: boolean diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 357ea068..967ffc4d 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -80,7 +80,7 @@ export default class MapActionReceiver implements ActionReceiver { // Ignore heavy rotation when nearly no movement. const arr = mapView.getCenter() const rotDelta = Math.abs(mapView.getRotation() - rotation) - if (arr && (new LineString([arr, center]).getLength() < 1 || action.speed < 3) && rotDelta > Math.PI / 4) + if (arr && ((new LineString([arr, center]).getLength() < 1 || action.speed <= 1) && rotDelta > Math.PI / 4 || action.speed == 0)) rotation = mapView.getRotation() mapView.animate({ From b7cf225b31ce2816a6f68d02617dd062e6557055 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 18 May 2023 18:15:39 +0200 Subject: [PATCH 240/322] for walking it is still too fast --- src/stores/MapActionReceiver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 967ffc4d..c80a8916 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -80,7 +80,7 @@ export default class MapActionReceiver implements ActionReceiver { // Ignore heavy rotation when nearly no movement. const arr = mapView.getCenter() const rotDelta = Math.abs(mapView.getRotation() - rotation) - if (arr && ((new LineString([arr, center]).getLength() < 1 || action.speed <= 1) && rotDelta > Math.PI / 4 || action.speed == 0)) + if (arr && ((new LineString([arr, center]).getLength() < 1 || action.speed <= 0.5) && rotDelta > Math.PI / 4 || action.speed == 0)) rotation = mapView.getRotation() mapView.animate({ From 16ba67857465fc84c1c361967e5c8f46ff59f496 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 21 May 2023 12:33:20 +0200 Subject: [PATCH 241/322] heading only for motor vehicles --- src/stores/TurnNavigationStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index b900d804..4d6255c9 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -269,7 +269,7 @@ export default class TurnNavigationStore extends Store let args: RoutingArgs = { points: [[coordinate.lng, coordinate.lat] as [number, number]].concat(nextWaypoints), maxAlternativeRoutes: 0, - heading: action.heading, + heading: ApiImpl.isMotorVehicle(state.activeProfile) ? action.heading : undefined, profile: state.activeProfile, customModel: customModel, } From f09123a5bd1dd0c8a54784269b7074caa0b8e95e Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 21 May 2023 12:42:31 +0200 Subject: [PATCH 242/322] i18n: reroute --- src/translation/tr.json | 705 +++++++++++++++++++++------------------- 1 file changed, 376 insertions(+), 329 deletions(-) diff --git a/src/translation/tr.json b/src/translation/tr.json index a28562a4..cf7ab9c5 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -81,21 +81,22 @@ "back_to_map":"Back", "distance_unit":"Distances are in %1$s", "waiting_for_gps":"Waiting for the GPS signal...", +"accept_risks_after_warning":"I understand and agree", +"for_km":"for %1$s kilometers", +"for_mi":"for %1$s miles", +"full_screen_for_navigation":"Set full screen", "in_km_singular":"In 1 kilometer", "in_km":"In %1$s kilometers", "in_m":"In %1$s meters", -"for_km":"for %1$s kilometers", -"then":"then", "in_mi_singular":"In 1 mile", "in_mi":"In %1$s miles", "in_ft":"In %1$s feet", -"for_mi":"for %1$s miles", -"warning":"WARNING: The turn-by-turn navigation feature is highly experimental. Use it at your own risk, pay attention to the road and do not touch the device while driving!", -"accept_risks_after_warning":"I understand and agree", +"reroute":"reroute", "start_navigation":"Navigation", +"then":"then", +"turn_navigation_settings_title":"Turn-by-turn navigation", "vector_tiles_for_navigation":"Use vector tiles", -"full_screen_for_navigation":"Set full screen", -"turn_navigation_settings_title":"Turn-by-turn navigation" +"warning":"WARNING: The turn-by-turn navigation feature is highly experimental. Use it at your own risk, pay attention to the road and do not touch the device while driving!" }, "ar":{ "total_ascend":"%1$s اجمالى صعود", @@ -180,21 +181,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "ast":{ "total_ascend":"%1$s d'ascensu total", @@ -279,21 +281,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "az":{ "total_ascend":"%1$s yüksəliş", @@ -378,21 +381,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"%1$s kilometrdə", +"for_mi":"%1$s mildə", +"full_screen_for_navigation":"", "in_km_singular":"1 kilometrdə", "in_km":"%1$s kilometrdə", "in_m":"%1$s metrdə", -"for_km":"%1$s kilometrdə", -"then":"sonra", "in_mi_singular":"1 mildə", "in_mi":"%1$s mildə", "in_ft":"%1$s futda", -"for_mi":"%1$s mildə", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"sonra", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "bg":{ "total_ascend":"%1$s общо изкачване", @@ -477,21 +481,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"Разбирам и се съгласявам", +"for_km":"за %1$s километра", +"for_mi":"за %1$s мили", +"full_screen_for_navigation":"", "in_km_singular":"След 1 километър", "in_km":"След %1$s километра", "in_m":"След %1$s метра", -"for_km":"за %1$s километра", -"then":"след това", "in_mi_singular":"След 1 миля", "in_mi":"След %1$s мили", "in_ft":"След %1$s фута", -"for_mi":"за %1$s мили", -"warning":"Внимание: Приложението е експериментално! Използвайте на свой риск!", -"accept_risks_after_warning":"Разбирам и се съгласявам", +"reroute":"", "start_navigation":"", +"then":"след това", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"Внимание: Приложението е експериментално! Използвайте на свой риск!" }, "bn_BN":{ "total_ascend":"", @@ -576,21 +581,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "ca":{ "total_ascend":"%1$s de pujada total", @@ -675,21 +681,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"per %1$s quilòmetres", +"for_mi":"per %1$s milles", +"full_screen_for_navigation":"", "in_km_singular":"En un quilòmetre", "in_km":"En %1$s quilòmetres", "in_m":"En %1$s metres", -"for_km":"per %1$s quilòmetres", -"then":"després", "in_mi_singular":"En una milla", "in_mi":"En %1$s milles", "in_ft":"En %1$s peus", -"for_mi":"per %1$s milles", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"després", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "cs_CZ":{ "total_ascend":"celkové stoupání %1$s", @@ -774,21 +781,22 @@ "back_to_map":"Zpět", "distance_unit":"Vzdálenosti jsou uváděny v %1$s", "waiting_for_gps":"Čekání na signál GPS…", +"accept_risks_after_warning":"Rozumím a souhlasím", +"for_km":"%1$s kilometrů", +"for_mi":"%1$s mil", +"full_screen_for_navigation":"Použít celou obrazovku", "in_km_singular":"Po jednom kilometru", "in_km":"Po %1$s kilometech", "in_m":"Po %1$s metrech", -"for_km":"%1$s kilometrů", -"then":"a poté", "in_mi_singular":"Po jedné míli", "in_mi":"Po %1$s mílích", "in_ft":"Po %1$s stopách", -"for_mi":"%1$s mil", -"warning":"POZOR: Navigace je vysoce experimentální. Použití je na vlastní nebezpečí, soustřeďte se na řízení a věnujte pozornost dopravní situaci. Neovládejte přístroj za jízdy!", -"accept_risks_after_warning":"Rozumím a souhlasím", +"reroute":"", "start_navigation":"Navigace", +"then":"a poté", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"Použít vektorové dlaždice", -"full_screen_for_navigation":"Použít celou obrazovku", -"turn_navigation_settings_title":"" +"warning":"POZOR: Navigace je vysoce experimentální. Použití je na vlastní nebezpečí, soustřeďte se na řízení a věnujte pozornost dopravní situaci. Neovládejte přístroj za jízdy!" }, "da_DK":{ "total_ascend":"%1$s samlet stigning", @@ -873,21 +881,22 @@ "back_to_map":"Tilbage", "distance_unit":"Distance er i %1$s", "waiting_for_gps":"Venter på GPS signal", +"accept_risks_after_warning":"", +"for_km":"i %1$s kilometer", +"for_mi":"i %1$s mil", +"full_screen_for_navigation":"", "in_km_singular":"Om 1 kilometer", "in_km":"Om %1$s kilometer", "in_m":"Om %1$s meter", -"for_km":"i %1$s kilometer", -"then":"så", "in_mi_singular":"Om 1 mil", "in_mi":"Om %1$s mil", "in_ft":"Om %1$s fod", -"for_mi":"i %1$s mil", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"så", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "de_DE":{ "total_ascend":"%1$s Gesamtaufstieg", @@ -972,21 +981,22 @@ "back_to_map":"Zurück", "distance_unit":"Distanzen sind in %1$s", "waiting_for_gps":"Warten auf das GPS Signal...", +"accept_risks_after_warning":"Ich verstehe und akzeptiere", +"for_km":"für %1$s Kilometer", +"for_mi":"für %1$s Meilen", +"full_screen_for_navigation":"Wechsle zum Vollbild", "in_km_singular":"In 1 Kilometer", "in_km":"In %1$s Kilometern", "in_m":"In %1$s Metern", -"for_km":"für %1$s Kilometer", -"then":"dann", "in_mi_singular":"In 1 Meile", "in_mi":"In %1$s Meilen", "in_ft":"In %1$s Fuß", -"for_mi":"für %1$s Meilen", -"warning":"ACHTUNG: Die Navigation ist höchst experimentell. Verwenden Sie diese auf eigene Gefahr, achten Sie auf den Straßenverkehr und berühren Sie das Gerät nicht während der Fahrt!", -"accept_risks_after_warning":"Ich verstehe und akzeptiere", +"reroute":"Neue Route", "start_navigation":"Navigation", +"then":"dann", +"turn_navigation_settings_title":"Navigation", "vector_tiles_for_navigation":"Nutze Vector Tiles", -"full_screen_for_navigation":"Wechsle zum Vollbild", -"turn_navigation_settings_title":"Navigation" +"warning":"ACHTUNG: Die Navigation ist höchst experimentell. Verwenden Sie diese auf eigene Gefahr, achten Sie auf den Straßenverkehr und berühren Sie das Gerät nicht während der Fahrt!" }, "el":{ "total_ascend":"%1$s συνολική ανάβαση", @@ -1071,21 +1081,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"Καταλαβαίνω και συμφωνώ", +"for_km":"Για %1$s χιλιόμετρα", +"for_mi":"για %1$s μίλια", +"full_screen_for_navigation":"", "in_km_singular":"Σε 1 χιλιόμετρο", "in_km":"Σε %1$s χιλιόμετρα", "in_m":"Σε %1$s μέτρα", -"for_km":"Για %1$s χιλιόμετρα", -"then":"τότε", "in_mi_singular":"Σε 1 μίλη", "in_mi":"Σε %1$s μίλια", "in_ft":"Σε %1$s πόδια", -"for_mi":"για %1$s μίλια", -"warning":"ΠΡΟΣΟΧΗ: Αυτή η εφαρμογή είναι πειραματική! Χρησιμοποιήστε την με δική σας ευθύνη!", -"accept_risks_after_warning":"Καταλαβαίνω και συμφωνώ", +"reroute":"", "start_navigation":"", +"then":"τότε", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"ΠΡΟΣΟΧΗ: Αυτή η εφαρμογή είναι πειραματική! Χρησιμοποιήστε την με δική σας ευθύνη!" }, "eo":{ "total_ascend":"%1$s supreniro tute", @@ -1170,21 +1181,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "es":{ "total_ascend":"Ascender %1$s en total", @@ -1269,21 +1281,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"por %1$s kilómetros", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"En un kilómetro", "in_km":"En %1$s kilómetros", "in_m":"En %1$s metros", -"for_km":"por %1$s kilómetros", -"then":"luego", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"luego", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "fa":{ "total_ascend":"مجموع صعود %1$s", @@ -1368,21 +1381,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "fil":{ "total_ascend":"", @@ -1467,21 +1481,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "fi":{ "total_ascend":"nousu yhteensä %1$s", @@ -1566,21 +1581,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"Ymmärrän ja hyväksyn", +"for_km":"kulje %1$s kilometriä", +"for_mi":"kulje %1$s mailia", +"full_screen_for_navigation":"", "in_km_singular":"Kilometrin päässä", "in_km":"%1$s kilometrin päässä", "in_m":"%1$s metrin päässä", -"for_km":"kulje %1$s kilometriä", -"then":"sen jälkeen", "in_mi_singular":"Mailin päässä", "in_mi":"%1$s mailin päässä", "in_ft":"%1$s jalan päässä", -"for_mi":"kulje %1$s mailia", -"warning":"VAROITUS: Tämä sovellus on erittäin kokeellinen! Käytä omalla vastuullasi!", -"accept_risks_after_warning":"Ymmärrän ja hyväksyn", +"reroute":"", "start_navigation":"", +"then":"sen jälkeen", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"VAROITUS: Tämä sovellus on erittäin kokeellinen! Käytä omalla vastuullasi!" }, "fr_FR":{ "total_ascend":"%1$s de dénivelé positif", @@ -1665,21 +1681,22 @@ "back_to_map":"Retour", "distance_unit":"Les distances sont en %1$s", "waiting_for_gps":"En attente du signal GPS...", +"accept_risks_after_warning":"Je comprends et j'accepte", +"for_km":"pendant %1$s kilomètres", +"for_mi":"Pendant %1$s miles", +"full_screen_for_navigation":"", "in_km_singular":"à 1 kilomètre", "in_km":"à %1$s kilomètres", "in_m":"à %1$s mètres", -"for_km":"pendant %1$s kilomètres", -"then":"ensuite", "in_mi_singular":"Dans 1 mile", "in_mi":"Dans %1$s miles", "in_ft":"Dans %1$s pieds", -"for_mi":"Pendant %1$s miles", -"warning":"ATTENTION : Cette application est hautement expérimentale ! À utiliser à vos risques et périls !", -"accept_risks_after_warning":"Je comprends et j'accepte", +"reroute":"", "start_navigation":"Naviguer", +"then":"ensuite", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"ATTENTION : Cette application est hautement expérimentale ! À utiliser à vos risques et périls !" }, "fr_CH":{ "total_ascend":"%1$s de dénivelé positif", @@ -1764,21 +1781,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"pendant %1$s kilomètres", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"à 1 kilomètre", "in_km":"à %1$s kilomètres", "in_m":"à %1$s mètres", -"for_km":"pendant %1$s kilomètres", -"then":"ensuite", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"ensuite", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "gl":{ "total_ascend":"", @@ -1863,21 +1881,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "he":{ "total_ascend":"עלייה כוללת של %1$s", @@ -1962,21 +1981,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "hr_HR":{ "total_ascend":"%1$s ukupni uspon", @@ -2061,21 +2081,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "hsb":{ "total_ascend":"", @@ -2160,21 +2181,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "hu_HU":{ "total_ascend":"Összes szintemelkedés: %1$s", @@ -2259,21 +2281,22 @@ "back_to_map":"Vissza", "distance_unit":"Távolság mértékegysége: %1$s", "waiting_for_gps":"", +"accept_risks_after_warning":"Megértettem és elfogadom", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"FIGYELEM! Ez az alkalmazás erősen kísérleti jellegű. Használat csak saját felelősségre!", -"accept_risks_after_warning":"Megértettem és elfogadom", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"FIGYELEM! Ez az alkalmazás erősen kísérleti jellegű. Használat csak saját felelősségre!" }, "in_ID":{ "total_ascend":"naik dengan jarak %1$s", @@ -2358,21 +2381,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "it":{ "total_ascend":"%1$s di dislivello positivo", @@ -2457,21 +2481,22 @@ "back_to_map":"Indietro", "distance_unit":"Le distanze sono in %1$s", "waiting_for_gps":"Aspettando il segnale GPS...", +"accept_risks_after_warning":"Ho capito e accetto", +"for_km":"per %1$s chilometri", +"for_mi":"per %1$s miglia", +"full_screen_for_navigation":"", "in_km_singular":"Tra 1 chilometro", "in_km":"Tra %1$s chilometri", "in_m":"Tra %1$s metri", -"for_km":"per %1$s chilometri", -"then":"poi", "in_mi_singular":"Tra 1 miglio", "in_mi":"Tra %1$s miglia", "in_ft":"Tra %1$s piedi", -"for_mi":"per %1$s miglia", -"warning":"ATTENZIONE: Questa applicazione è ancora sperimentale! Utilizzala a tuo rischio e pericolo!", -"accept_risks_after_warning":"Ho capito e accetto", +"reroute":"", "start_navigation":"Naviga", +"then":"poi", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"ATTENZIONE: Questa applicazione è ancora sperimentale! Utilizzala a tuo rischio e pericolo!" }, "ja":{ "total_ascend":"", @@ -2556,21 +2581,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "ko":{ "total_ascend":"오르막길 총 %1$s", @@ -2655,21 +2681,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "kz":{ "total_ascend":"%1$s көтерілу", @@ -2754,21 +2781,22 @@ "back_to_map":"Қайту", "distance_unit":"", "waiting_for_gps":"GPS сигналын күтіңіз...", +"accept_risks_after_warning":"мен түсіндім және келісемін", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"1 км жерде", "in_km":"%1$s км жерде", "in_m":"%1$s метр жерде", -"for_km":"", -"then":"одан соң ", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"Ескерту: бұрылыстан бұрылысқа навигация функциясы эксперименталды. Оны өз жауапкершілігіңізбен пайдаланыңыз, жолға назар аударыңыз және қозғалыс кезінде құрылғыға қол тигізбеңіз!", -"accept_risks_after_warning":"мен түсіндім және келісемін", +"reroute":"", "start_navigation":"навигация", +"then":"одан соң ", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"Ескерту: бұрылыстан бұрылысқа навигация функциясы эксперименталды. Оны өз жауапкершілігіңізбен пайдаланыңыз, жолға назар аударыңыз және қозғалыс кезінде құрылғыға қол тигізбеңіз!" }, "lt_LT":{ "total_ascend":"", @@ -2853,21 +2881,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"%1$s kilometrus", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"Už 1 kilometro", "in_km":"Už %1$s kilometrų", "in_m":"Už %1$s metrų", -"for_km":"%1$s kilometrus", -"then":"tada", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"tada", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "nb_NO":{ "total_ascend":"%1$s totale høydemeter", @@ -2952,21 +2981,22 @@ "back_to_map":"Tilbake", "distance_unit":"Avstand måles i %1$s", "waiting_for_gps":"Venter på GPS-signal", +"accept_risks_after_warning":"Jeg forstår og samtykker", +"for_km":"I %1$s kilometer", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"Om 1 kilometer", "in_km":"Om %1$s kilometer", "in_m":"Om %1$s meter", -"for_km":"I %1$s kilometer", -"then":"deretter", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"VARSEL: Denne appen er svært eksperimentell. Brukes på eget ansvar!", -"accept_risks_after_warning":"Jeg forstår og samtykker", +"reroute":"", "start_navigation":"Start navigasjon", +"then":"deretter", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"VARSEL: Denne appen er svært eksperimentell. Brukes på eget ansvar!" }, "ne":{ "total_ascend":"", @@ -3051,21 +3081,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "nl":{ "total_ascend":"%1$s totale klim", @@ -3150,21 +3181,22 @@ "back_to_map":"Terug", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"Voor %1$s kilometer", +"for_mi":"Voor %1$s mijl", +"full_screen_for_navigation":"", "in_km_singular":"Over 1 kilometer", "in_km":"Over %1$s kilometer", "in_m":"Over %1$s meter", -"for_km":"Voor %1$s kilometer", -"then":"dan", "in_mi_singular":"Over 1 mijl", "in_mi":"Over %1$s mijl", "in_ft":"Over %1$s voet", -"for_mi":"Voor %1$s mijl", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"dan", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "pl_PL":{ "total_ascend":"%1$s w górę", @@ -3249,21 +3281,22 @@ "back_to_map":"Wróć", "distance_unit":"Odległości w %1$s", "waiting_for_gps":"Oczekiwanie na sygnał GPS...", +"accept_risks_after_warning":"Rozumiem i akceptuję", +"for_km":"przez %1$s kilometrów", +"for_mi":"przez %1$s mil", +"full_screen_for_navigation":"", "in_km_singular":"Za 1 kilometr", "in_km":"Za %1$s km", "in_m":"Za %1$s m", -"for_km":"przez %1$s kilometrów", -"then":", potem", "in_mi_singular":"Za 1 milę", "in_mi":"Za %1$s mi", "in_ft":"Za %1$s ft", -"for_mi":"przez %1$s mil", -"warning":"OSTRZEŻENIE: Ta aplikacja jest wysoce eksperymentalna! Używaj na własne ryzyko!", -"accept_risks_after_warning":"Rozumiem i akceptuję", +"reroute":"", "start_navigation":"Nawiguj", +"then":", potem", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"OSTRZEŻENIE: Ta aplikacja jest wysoce eksperymentalna! Używaj na własne ryzyko!" }, "pt_BR":{ "total_ascend":"subida de %1$s", @@ -3348,21 +3381,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "pt_PT":{ "total_ascend":"subida de %1$s", @@ -3447,21 +3481,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "ro":{ "total_ascend":"urcare %1$s", @@ -3546,21 +3581,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "ru":{ "total_ascend":"подъём на %1$s", @@ -3645,21 +3681,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"За %1$s километрах", +"for_mi":"В %1$s милях", +"full_screen_for_navigation":"", "in_km_singular":"В 1 километре", "in_km":"В %1$s километрах", "in_m":"В %1$s метрах", -"for_km":"За %1$s километрах", -"then":"Затем", "in_mi_singular":"В 1 миле", "in_mi":"В %1$s милях", "in_ft":"В %1$s футах", -"for_mi":"В %1$s милях", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"Затем", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "sk":{ "total_ascend":"%1$s celkové stúpanie", @@ -3744,21 +3781,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "sl_SI":{ "total_ascend":"Skupni vzpon: %1$s", @@ -3843,21 +3881,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "sr_RS":{ "total_ascend":"%1$s ukupni uspon", @@ -3942,21 +3981,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "sv_SE":{ "total_ascend":"%1$s stigning", @@ -4041,21 +4081,22 @@ "back_to_map":"Backa", "distance_unit":"Avstånden är i %1$s", "waiting_for_gps":"Väntar på GPS signal...", +"accept_risks_after_warning":"Jag förstår och godkänner", +"for_km":"i %1$s kilometer", +"for_mi":"i %1$s mil", +"full_screen_for_navigation":"", "in_km_singular":"Om 1 kilometer", "in_km":"Om %1$s kilometer", "in_m":"Om %1$s meter", -"for_km":"i %1$s kilometer", -"then":"sedan", "in_mi_singular":"Om 1 mil", "in_mi":"Om %1$s mil", "in_ft":"Om %1$s fot", -"for_mi":"i %1$s mil", -"warning":"VARNING: Sväng-för-sväng-navigeringen är mycket experimentell! Använd på egen risk!", -"accept_risks_after_warning":"Jag förstår och godkänner", +"reroute":"", "start_navigation":"Navigera", +"then":"sedan", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"VARNING: Sväng-för-sväng-navigeringen är mycket experimentell! Använd på egen risk!" }, "tr":{ "total_ascend":"%1$s toplam tırmanış", @@ -4140,21 +4181,22 @@ "back_to_map":"geri", "distance_unit":"Mesafe birimi %1$s", "waiting_for_gps":"GPS sinyali bekleniyor", +"accept_risks_after_warning":"Anladım ve kabul ediyorum", +"for_km":" %1$s kilometre boyunca", +"for_mi":"%1$s mil boyunca", +"full_screen_for_navigation":"", "in_km_singular":"1 kilometre sonra", "in_km":"%1$s kilometre sonra", "in_m":"%1$s metre sonra", -"for_km":" %1$s kilometre boyunca", -"then":"ardından", "in_mi_singular":"1 mil sonra", "in_mi":"%1$s mil sonra", "in_ft":"", -"for_mi":"%1$s mil boyunca", -"warning":"", -"accept_risks_after_warning":"Anladım ve kabul ediyorum", +"reroute":"", "start_navigation":"Başla", +"then":"ardından", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "uk":{ "total_ascend":"%1$s загалом підйому", @@ -4239,21 +4281,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "vi_VN":{ "total_ascend":"Đi tiếp %1$s nữa", @@ -4338,21 +4381,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"Khoảng %1$s km", +"for_mi":"Khoảng %1$s dặm", +"full_screen_for_navigation":"", "in_km_singular":"Trong 1 km", "in_km":"Trong %1$s km", "in_m":"Trong %1$s m", -"for_km":"Khoảng %1$s km", -"then":"Gần đó", "in_mi_singular":"Trong 1 dặm", "in_mi":"Trong %1$s dặm", "in_ft":"Trong %1$s ft", -"for_mi":"Khoảng %1$s dặm", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"Gần đó", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "zh_CN":{ "total_ascend":"总上升 %1$s", @@ -4437,21 +4481,22 @@ "back_to_map":"返回", "distance_unit":"距离单位:%1$s", "waiting_for_gps":"正在搜索 GPS 信号……", +"accept_risks_after_warning":"我理解并同意", +"for_km":"行驶 %1$skm", +"for_mi":"行驶 %1$s 英里", +"full_screen_for_navigation":"", "in_km_singular":"1km 后", "in_km":"%1$skm 后", "in_m":"%1$sm 后", -"for_km":"行驶 %1$skm", -"then":"然后", "in_mi_singular":"1 英里后", "in_mi":"%1$s 英里后", "in_ft":"%1$s 英尺后", -"for_mi":"行驶 %1$s 英里", -"warning":"警告:该应用程序处于早期实验阶段,使用时风险自负!", -"accept_risks_after_warning":"我理解并同意", +"reroute":"", "start_navigation":"", +"then":"然后", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"警告:该应用程序处于早期实验阶段,使用时风险自负!" }, "zh_HK":{ "total_ascend":"總共上昇 %1$s", @@ -4536,21 +4581,22 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }, "zh_TW":{ "total_ascend":"總共上昇 %1$s", @@ -4635,19 +4681,20 @@ "back_to_map":"", "distance_unit":"", "waiting_for_gps":"", +"accept_risks_after_warning":"", +"for_km":"", +"for_mi":"", +"full_screen_for_navigation":"", "in_km_singular":"", "in_km":"", "in_m":"", -"for_km":"", -"then":"", "in_mi_singular":"", "in_mi":"", "in_ft":"", -"for_mi":"", -"warning":"", -"accept_risks_after_warning":"", +"reroute":"", "start_navigation":"", +"then":"", +"turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", -"full_screen_for_navigation":"", -"turn_navigation_settings_title":"" +"warning":"" }} \ No newline at end of file From 14be00168c7dbc6ac13b3d47e0f8349fce9a09f3 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 21 May 2023 17:47:55 +0200 Subject: [PATCH 243/322] hide context menu --- src/App.tsx | 7 ++++++- src/layers/ContextMenu.tsx | 5 +++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 3af9d30e..979c9298 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -128,7 +128,12 @@ export default function App() {
    - + {isSmallScreen ? ( (null) const container = useRef(null) @@ -66,7 +67,7 @@ export default function ContextMenu({ map, route, queryPoints }: ContextMenuProp return (
    - {menuCoordinate && ( + {menuCoordinate && !navigation && ( Date: Sun, 21 May 2023 17:48:03 +0200 Subject: [PATCH 244/322] formatting --- src/stores/MapActionReceiver.ts | 7 ++++++- src/stores/TurnNavigationStore.ts | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index c80a8916..4d7a59b4 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -80,7 +80,12 @@ export default class MapActionReceiver implements ActionReceiver { // Ignore heavy rotation when nearly no movement. const arr = mapView.getCenter() const rotDelta = Math.abs(mapView.getRotation() - rotation) - if (arr && ((new LineString([arr, center]).getLength() < 1 || action.speed <= 0.5) && rotDelta > Math.PI / 4 || action.speed == 0)) + if ( + arr && + (((new LineString([arr, center]).getLength() < 1 || action.speed <= 0.5) && + rotDelta > Math.PI / 4) || + action.speed == 0) + ) rotation = mapView.getRotation() mapView.animate({ diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 4d6255c9..0d7ab4ea 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -322,7 +322,7 @@ export default class TurnNavigationStore extends Store const text = nextInstruction.street_name if (state.settings.soundEnabled) { // announce proportional earlier if faster - const factor = estimatedAvgSpeed < 70 ? 2 : (roadClass == "trunk" || roadClass == "motorway" ? 7 : 4) + const factor = estimatedAvgSpeed < 70 ? 2 : roadClass == 'trunk' || roadClass == 'motorway' ? 7 : 4 // prefer nearly constant average speed because location.speed changes more often while driving const lastAnnounceDistance = Math.max(30, 20 + factor * estimatedAvgSpeed) From 668a363f043188bf12289ca79bd4f17f7e9ca21c Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 21 May 2023 21:19:55 +0200 Subject: [PATCH 245/322] fix problem with mobile safari and ending navigation; improve css --- src/sidebar/RoutingResult.module.css | 6 +++--- src/turnNavigation/TurnNavigation.module.css | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sidebar/RoutingResult.module.css b/src/sidebar/RoutingResult.module.css index 3b4ebc46..0f9de631 100644 --- a/src/sidebar/RoutingResult.module.css +++ b/src/sidebar/RoutingResult.module.css @@ -151,8 +151,8 @@ } .showRiskAccept button { - padding: 0.5em; - margin: 0.1em; + padding: 0.4em; + margin: 1em 0 0 0; background-color: #f97777; color: white; } @@ -163,7 +163,7 @@ } .showRiskButtons { - padding: 1.5em 1.5em 3em 1.5em; + padding: 1em 1em 2em 1em; display: flex; flex-direction: row; justify-content: space-around; diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 0290008f..ce21ba03 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -56,7 +56,7 @@ } .thirdCol { - height: 0; + height: 20px; } .thirdCol svg { From 471b9b7d433593bcf4a145806bbf259f972dbe1d Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 21 May 2023 23:02:25 +0200 Subject: [PATCH 246/322] avoid context menu from being created --- src/layers/ContextMenu.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/layers/ContextMenu.tsx b/src/layers/ContextMenu.tsx index f6348965..3f3fd968 100644 --- a/src/layers/ContextMenu.tsx +++ b/src/layers/ContextMenu.tsx @@ -20,6 +20,7 @@ const overlay = new Overlay({ export default function ContextMenu({ map, route, queryPoints, navigation }: ContextMenuProps) { const [menuCoordinate, setMenuCoordinate] = useState(null) const container = useRef(null) + const navigationRef = useRef(navigation) const closeContextMenu = () => { setMenuCoordinate(null) @@ -28,9 +29,11 @@ export default function ContextMenu({ map, route, queryPoints, navigation }: Con useEffect(() => { overlay.setElement(container.current!) map.addOverlay(overlay) + navigationRef.current = navigation function openContextMenu(e: any) { e.preventDefault() + if (navigationRef.current) return const coordinate = map.getEventCoordinate(e) const lonLat = toLonLat(coordinate) setMenuCoordinate({ lng: lonLat[0], lat: lonLat[1] }) @@ -59,7 +62,7 @@ export default function ContextMenu({ map, route, queryPoints, navigation }: Con map.getTargetElement().removeEventListener('click', closeContextMenu) map.removeOverlay(overlay) } - }, [map]) + }, [map, navigation]) useEffect(() => { overlay.setPosition(menuCoordinate ? fromLonLat([menuCoordinate.lng, menuCoordinate.lat]) : undefined) @@ -67,7 +70,7 @@ export default function ContextMenu({ map, route, queryPoints, navigation }: Con return (
    - {menuCoordinate && !navigation && ( + {menuCoordinate && ( Date: Sun, 21 May 2023 22:59:52 +0200 Subject: [PATCH 247/322] make expression more clear --- src/stores/MapActionReceiver.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 4d7a59b4..0ae04953 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -80,12 +80,8 @@ export default class MapActionReceiver implements ActionReceiver { // Ignore heavy rotation when nearly no movement. const arr = mapView.getCenter() const rotDelta = Math.abs(mapView.getRotation() - rotation) - if ( - arr && - (((new LineString([arr, center]).getLength() < 1 || action.speed <= 0.5) && - rotDelta > Math.PI / 4) || - action.speed == 0) - ) + const smallMove = arr && new LineString([arr, center]).getLength() < 1 + if (action.speed == 0 || (smallMove || action.speed <= 0.5) && rotDelta > Math.PI / 4) rotation = mapView.getRotation() mapView.animate({ From 341856e9783d3d6412835748c4f854b7f28eace3 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 21 May 2023 23:35:31 +0200 Subject: [PATCH 248/322] use Math.floor as we are moving and it is better to use smaller value --- src/stores/MapActionReceiver.ts | 2 +- src/stores/TurnNavigationStore.ts | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 0ae04953..7750e9cd 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -81,7 +81,7 @@ export default class MapActionReceiver implements ActionReceiver { const arr = mapView.getCenter() const rotDelta = Math.abs(mapView.getRotation() - rotation) const smallMove = arr && new LineString([arr, center]).getLength() < 1 - if (action.speed == 0 || (smallMove || action.speed <= 0.5) && rotDelta > Math.PI / 4) + if (action.speed == 0 || ((smallMove || action.speed <= 0.5) && rotDelta > Math.PI / 4)) rotation = mapView.getRotation() mapView.animate({ diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 0d7ab4ea..d14ad6a3 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -322,7 +322,7 @@ export default class TurnNavigationStore extends Store const text = nextInstruction.street_name if (state.settings.soundEnabled) { // announce proportional earlier if faster - const factor = estimatedAvgSpeed < 70 ? 2 : roadClass == 'trunk' || roadClass == 'motorway' ? 7 : 4 + const factor = estimatedAvgSpeed < 70 ? 2 : roadClass == 'trunk' || roadClass == 'motorway' ? 7 : 3 // prefer nearly constant average speed because location.speed changes more often while driving const lastAnnounceDistance = Math.max(30, 20 + factor * estimatedAvgSpeed) @@ -334,7 +334,8 @@ export default class TurnNavigationStore extends Store } const firstAnnounceDistance = 1150 + factor * estimatedAvgSpeed - console.log('first announce: ' + firstAnnounceDistance + ' last: ' + lastAnnounceDistance) + console.log('first announce:' + firstAnnounceDistance + ' last:' + lastAnnounceDistance) + console.log('factor:' + factor + ', avg-speed:' + estimatedAvgSpeed) if ( estimatedAvgSpeed > 15 && // two announcements only if faster speed instr.distanceToTurn > lastAnnounceDistance * 1.2 + 50 && // do not interfere with last announcement @@ -346,7 +347,7 @@ export default class TurnNavigationStore extends Store ? tr('in_km', [(instr.distanceToTurn / 1000).toFixed(1)]) : instr.distanceToTurn > 900 ? tr('in_km_singular') - : tr('in_m', ['' + Math.round(instr.distanceToTurn / 100) * 100]) + : tr('in_m', ['' + Math.floor(instr.distanceToTurn / 100) * 100]) this.synthesize(inString + ' ' + nextInstruction.text) } } From 67171c08ee1ba07f6b3505456141222bc3cb7e09 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 22 May 2023 10:35:13 +0200 Subject: [PATCH 249/322] one log --- src/stores/TurnNavigationStore.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index d14ad6a3..3f44998e 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -334,8 +334,8 @@ export default class TurnNavigationStore extends Store } const firstAnnounceDistance = 1150 + factor * estimatedAvgSpeed - console.log('first announce:' + firstAnnounceDistance + ' last:' + lastAnnounceDistance) - console.log('factor:' + factor + ', avg-speed:' + estimatedAvgSpeed) + const details = ', factor:' + factor + ', avg-speed:' + estimatedAvgSpeed + console.log('first:' + firstAnnounceDistance + ' last:' + lastAnnounceDistance + details) if ( estimatedAvgSpeed > 15 && // two announcements only if faster speed instr.distanceToTurn > lastAnnounceDistance * 1.2 + 50 && // do not interfere with last announcement From dbf020200b83194ae14f96a4fa54d6cd43ac060e Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 22 May 2023 12:03:36 +0200 Subject: [PATCH 250/322] bug fix and tests for announcements; store announcementsToDo in state --- src/stores/TurnNavigationStore.ts | 48 ++--- test/stores/TurnNavigationStore.test.ts | 60 +++++- .../turnNavigation/announce-bug-original.json | 181 ++++++++++++++++++ test/turnNavigation/announce-bug-reroute.json | 170 ++++++++++++++++ 4 files changed, 431 insertions(+), 28 deletions(-) create mode 100644 test/turnNavigation/announce-bug-original.json create mode 100644 test/turnNavigation/announce-bug-reroute.json diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 3f44998e..a770246a 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -58,6 +58,7 @@ export interface TurnNavigationStoreState { export interface TNInstructionState { index: number + announcementsToDo: number distanceToTurn: number timeToEnd: number distanceToEnd: number @@ -221,6 +222,8 @@ export default class TurnNavigationStore extends Store return state } + let announcementsToDo = state.instruction.announcementsToDo + const coordinate = action.coordinate let path = state.activePath let instr = getCurrentInstruction(path.instructions, coordinate) @@ -291,7 +294,7 @@ export default class TurnNavigationStore extends Store }) queriedAPI = true } else { - console.log('profile=' + state.activeProfile + ', reroute in progress = ' + state.rerouteInProgress) + console.log('reroute skipped (' + state.activeProfile + ') progress = ' + state.rerouteInProgress) } return { @@ -320,28 +323,27 @@ export default class TurnNavigationStore extends Store const instructionState = state.instruction const nextInstruction: Instruction = path.instructions[instr.index] const text = nextInstruction.street_name - if (state.settings.soundEnabled) { - // announce proportional earlier if faster - const factor = estimatedAvgSpeed < 70 ? 2 : roadClass == 'trunk' || roadClass == 'motorway' ? 7 : 3 - // prefer nearly constant average speed because location.speed changes more often while driving - const lastAnnounceDistance = Math.max(30, 20 + factor * estimatedAvgSpeed) - - if ( - instr.distanceToTurn <= lastAnnounceDistance && - (instructionState.distanceToTurn > lastAnnounceDistance || instr.index != instructionState.index) - ) { - this.synthesize(nextInstruction.text) - } - const firstAnnounceDistance = 1150 + factor * estimatedAvgSpeed - const details = ', factor:' + factor + ', avg-speed:' + estimatedAvgSpeed - console.log('first:' + firstAnnounceDistance + ' last:' + lastAnnounceDistance + details) - if ( - estimatedAvgSpeed > 15 && // two announcements only if faster speed - instr.distanceToTurn > lastAnnounceDistance * 1.2 + 50 && // do not interfere with last announcement - instr.distanceToTurn <= firstAnnounceDistance && - (instructionState.distanceToTurn > firstAnnounceDistance || instr.index != instructionState.index) - ) { + // announce proportional earlier if faster + const factor = estimatedAvgSpeed < 70 ? 2 : roadClass == 'trunk' || roadClass == 'motorway' ? 7 : 3 + // prefer nearly constant average speed because location.speed changes more often while driving + const lastAnnounceDistance = Math.max(30, 20 + factor * estimatedAvgSpeed) + const firstAnnounceDistance = 1150 + factor * estimatedAvgSpeed + + if (instr.index != instructionState.index) announcementsToDo = instr.distanceToTurn > 1000 ? 2 : 1 + + const details = factor + ', avg-speed:' + estimatedAvgSpeed + ', announcements:' + announcementsToDo + console.log('first:' + firstAnnounceDistance + ' last:' + lastAnnounceDistance + ', factor:' + details) + + if (instr.distanceToTurn <= lastAnnounceDistance && announcementsToDo > 0) { + announcementsToDo = 0 + this.synthesize(nextInstruction.text) + } + + if (instr.distanceToTurn <= firstAnnounceDistance && announcementsToDo == 2) { + announcementsToDo = 1 + if (instr.distanceToTurn > lastAnnounceDistance * 1.2 + 50) { + // do not interfere with last announcement let inString = instr.distanceToTurn > 1200 ? tr('in_km', [(instr.distanceToTurn / 1000).toFixed(1)]) @@ -366,6 +368,7 @@ export default class TurnNavigationStore extends Store nextWaypointIndex: instr.nextWaypointIndex, distanceToWaypoint: instr.distanceToWaypoint, sign: path.instructions[instr.index].sign, + announcementsToDo, text, }, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, @@ -407,6 +410,7 @@ export default class TurnNavigationStore extends Store nextWaypointIndex: instr.nextWaypointIndex, distanceToWaypoint: instr.distanceToWaypoint, sign: path.instructions[instr.index].sign, + announcementsToDo: instr.distanceToTurn > 1000 ? 2 : 1, text, }, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index 225709a0..d635d0d6 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -9,8 +9,9 @@ import { SetSelectedPath, SetVehicleProfile, TurnNavigationReroutingTimeResetForTest, + TurnNavigationSettingsUpdate, } from '@/actions/Actions' -import TurnNavigationStore, { MapCoordinateSystem } from '@/stores/TurnNavigationStore' +import TurnNavigationStore, { MapCoordinateSystem, TNSettingsState } from '@/stores/TurnNavigationStore' import { SpeechSynthesizer } from '@/SpeechSynthesizer' import { ApiInfo, GeocodingResult, RawResult, RoutingArgs, RoutingResult } from '@/api/graphhopper' import Api, { ApiImpl } from '@/api/Api' @@ -23,6 +24,9 @@ let reroute1 = toRoutingResult(require('../turnNavigation/reroute1.json')) let routeWithSimpleVia = toRoutingResult(require('../turnNavigation/routeWithSimpleVia.json')) let reroute2 = toRoutingResult(require('../turnNavigation/reroute2.json')) +let announceBug = toRoutingResult(require('../turnNavigation/announce-bug-original.json')) +let announceBugReroute = toRoutingResult(require('../turnNavigation/announce-bug-reroute.json')) + function toRoutingResult(rawResult: RawResult): RoutingResult { return { ...rawResult, @@ -116,13 +120,16 @@ describe('TurnNavigationStore', () => { [14.267238, 51.43475], [14.267240000000001, 51.43253000000001], ]) - const store = createStore(api) + const speech = new DummySpeech() + const store = createStore(api, speech) Dispatcher.dispatch(new SetSelectedPath(reroute1.paths[0])) Dispatcher.dispatch(new LocationUpdate({ lng: 14.268908, lat: 51.434871 }, true, 10, 120, 16)) expect(store.state.speed).toEqual(10) expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) + Dispatcher.dispatch(new TurnNavigationSettingsUpdate({ soundEnabled: true } as TNSettingsState)) + // no rerouting without profile Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, true, 12, 120, 16)) expect(store.state.speed).toEqual(12) @@ -134,6 +141,7 @@ describe('TurnNavigationStore', () => { expect(store.state.rerouteInProgress).toBeTruthy() await flushPromises() expect(store.state.rerouteInProgress).toBeFalsy() + expect(speech.getTexts()).toEqual(['reroute']) expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) @@ -215,11 +223,14 @@ describe('TurnNavigationStore', () => { ] as [number, number][] const api = new LocalApi() api.setRerouteData(reroute2, rerouteWaypoints) - const store = createStore(api) + const speech = new DummySpeech() + const store = createStore(api, speech) Dispatcher.dispatch(new SetSelectedPath(routeWithSimpleVia.paths[0])) Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) + Dispatcher.dispatch(new TurnNavigationSettingsUpdate({ soundEnabled: true } as TNSettingsState)) Dispatcher.dispatch(new LocationUpdate({ lng: 14.2727, lat: 51.436269 }, true, 10, 120, 16)) expect(store.state.activePath).toEqual(routeWithSimpleVia.paths[0]) + expect(speech.getTexts()).toEqual(['Turn right onto Franz-Liszt-Straße']) // force reroute Dispatcher.dispatch(new LocationUpdate({ lng: 14.273946, lat: 51.436422 }, true, 12, 70, 16)) @@ -275,17 +286,54 @@ describe('TurnNavigationStore', () => { expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) }) + + it('should reroute and announce turn instruction close to junction', async () => { + const api = new LocalApi() + const speech = new DummySpeech() + const store = createStore(api, speech) + Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) + Dispatcher.dispatch(new SetSelectedPath(announceBug.paths[0])) + Dispatcher.dispatch(new TurnNavigationSettingsUpdate({ soundEnabled: true } as TNSettingsState)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.191677, lat: 51.432878 }, true, 16, 70, 16)) + expect(store.state.activePath).toEqual(announceBug.paths[0]) + + api.setRerouteData(announceBugReroute, [ + [14.190732, 51.431834], + [14.193150000000001, 51.43121000000001], + ]) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.190732, lat: 51.431834 }, true, 10, 120, 16)) + expect(store.state.rerouteInProgress).toBeTruthy() + await flushPromises() + expect(store.state.rerouteInProgress).toBeFalsy() + expect(store.state.activePath).toEqual(announceBugReroute.paths[0]) + expect(store.state.instruction.index).toEqual(1) + + // the first LocationUpdate was "used" to force the re-routing -> we need another LocationUpdate + Dispatcher.dispatch(new LocationUpdate({ lng: 14.190732, lat: 51.431834 }, true, 10, 120, 16)) + + expect(speech.getTexts()).toEqual(['Links halten', 'reroute', 'Scharf links abbiegen']) + }) }) - function createStore(api: Api) { - const store = new TurnNavigationStore(api, new DummySpeech(), new DummyCS(), 0, '', '') + function createStore(api: Api, speech = new DummySpeech()) { + const store = new TurnNavigationStore(api, speech, new DummyCS(), 0, '', '') Dispatcher.register(store) return store } class DummySpeech implements SpeechSynthesizer { + private texts: string[] = [] + synthesize(text: string, offline = true) { - // TODO we could collect the text to ensure spoken words + this.texts.push(text) + } + + getTexts() { + return this.texts + } + + clear() { + this.texts = [] } } diff --git a/test/turnNavigation/announce-bug-original.json b/test/turnNavigation/announce-bug-original.json new file mode 100644 index 00000000..1128331f --- /dev/null +++ b/test/turnNavigation/announce-bug-original.json @@ -0,0 +1,181 @@ +{ + "orig_url": "https://graphhopper.com/maps/?point=51.432878%2C14.191677&point=51.431259%2C14.193178&profile=bike", + "hints": { + "visited_nodes.sum": 28, + "visited_nodes.average": 28.0 + }, + "info": { + "copyrights": [ + "GraphHopper", + "OpenStreetMap contributors" + ], + "took": 0 + }, + "paths": [ + { + "distance": 261.734, + "weight": 73.756771, + "time": 74947, + "transfers": 0, + "points_encoded": true, + "bbox": [ + 14.191374, + 51.431218, + 14.19316, + 51.432901 + ], + "points": "sn|xHoxruAeeYx@l@d@jFkBsSj@wFdA", + "instructions": [ + { + "distance": 35.727, + "heading": 206.28, + "sign": 0, + "interval": [ + 0, + 1 + ], + "text": "Dem Straßenverlauf von Schäferweg folgen", + "time": 7145, + "street_name": "Schäferweg" + }, + { + "distance": 136.493, + "sign": -7, + "interval": [ + 1, + 2 + ], + "text": "Links halten", + "time": 40948, + "street_name": "" + }, + { + "distance": 89.514, + "sign": -2, + "interval": [ + 2, + 3 + ], + "text": "Links abbiegen", + "time": 26854, + "street_name": "" + }, + { + "distance": 0.0, + "sign": 4, + "last_heading": 105.52163712924371, + "interval": [ + 3, + 3 + ], + "text": "Ziel erreicht", + "time": 0, + "street_name": "" + } + ], + "legs": [], + "details": { + "country": [ + [ + 0, + 3, + "DEU" + ] + ], + "bike_network": [ + [ + 0, + 3, + "missing" + ] + ], + "surface": [ + [ + 0, + 1, + "asphalt" + ], + [ + 1, + 3, + "missing" + ] + ], + "road_environment": [ + [ + 0, + 3, + "road" + ] + ], + "road_access": [ + [ + 0, + 3, + "yes" + ] + ], + "road_class": [ + [ + 0, + 1, + "unclassified" + ], + [ + 1, + 3, + "track" + ] + ], + "max_speed": [ + [ + 0, + 3, + null + ] + ], + "average_speed": [ + [ + 0, + 1, + 18.0 + ], + [ + 1, + 3, + 12.0 + ] + ], + "toll": [ + [ + 0, + 3, + "missing" + ] + ], + "track_type": [ + [ + 0, + 2, + "missing" + ], + [ + 2, + 3, + "grade2" + ] + ], + "get_off_bike": [ + [ + 0, + 3, + false + ] + ] + }, + "ascend": 3.3040008544921875, + "descend": 0.5460052490234375, + "snapped_waypoints": "sn|xHoxruAeeYpIuHgP" + } + ] +} \ No newline at end of file diff --git a/test/turnNavigation/announce-bug-reroute.json b/test/turnNavigation/announce-bug-reroute.json new file mode 100644 index 00000000..30d0bd58 --- /dev/null +++ b/test/turnNavigation/announce-bug-reroute.json @@ -0,0 +1,170 @@ +{ + "orig_url": "https://graphhopper.com/maps/?point=51.431767%2C14.190722&point=51.431259%2C14.193178&profile=bike", + "hints": { + "visited_nodes.sum": 14, + "visited_nodes.average": 14.0 + }, + "info": { + "copyrights": [ + "GraphHopper", + "OpenStreetMap contributors" + ], + "took": 0 + }, + "paths": [ + { + "distance": 199.33, + "weight": 57.434641, + "time": 58026, + "transfers": 0, + "points_encoded": true, + "bbox": [ + 14.190622, + 51.431218, + 14.19316, + 51.431763 + ], + "points": "og|xHasruAkhYZTuAd@aGqLj@wFdA", + "instructions": [ + { + "distance": 17.733, + "heading": 206.21, + "sign": 0, + "interval": [ + 0, + 1 + ], + "text": "Dem Straßenverlauf von Schäferweg folgen", + "time": 3547, + "street_name": "Schäferweg" + }, + { + "distance": 181.597, + "sign": -3, + "interval": [ + 1, + 3 + ], + "text": "Scharf links abbiegen", + "time": 54479, + "street_name": "" + }, + { + "distance": 0.0, + "sign": 4, + "last_heading": 105.52163712924371, + "interval": [ + 3, + 3 + ], + "text": "Ziel erreicht", + "time": 0, + "street_name": "" + } + ], + "legs": [], + "details": { + "country": [ + [ + 0, + 3, + "DEU" + ] + ], + "bike_network": [ + [ + 0, + 3, + "missing" + ] + ], + "surface": [ + [ + 0, + 1, + "asphalt" + ], + [ + 1, + 3, + "missing" + ] + ], + "road_environment": [ + [ + 0, + 3, + "road" + ] + ], + "road_access": [ + [ + 0, + 3, + "yes" + ] + ], + "road_class": [ + [ + 0, + 1, + "unclassified" + ], + [ + 1, + 3, + "track" + ] + ], + "max_speed": [ + [ + 0, + 3, + null + ] + ], + "average_speed": [ + [ + 0, + 1, + 18.0 + ], + [ + 1, + 3, + 12.0 + ] + ], + "toll": [ + [ + 0, + 3, + "missing" + ] + ], + "track_type": [ + [ + 0, + 1, + "missing" + ], + [ + 1, + 3, + "grade2" + ] + ], + "get_off_bike": [ + [ + 0, + 3, + false + ] + ] + }, + "ascend": 2.5989990234375, + "descend": 0.35050201416015625, + "snapped_waypoints": "og|xHasruAkhYlBcNaM" + } + ] +} \ No newline at end of file From 98258e74acfa75f5dafa5f8cdeeabab4244ed0fa Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 22 May 2023 12:35:23 +0200 Subject: [PATCH 251/322] move animation: set rotation only when changed --- src/stores/MapActionReceiver.ts | 34 ++++++++++++++++++------------- src/stores/TurnNavigationStore.ts | 4 ++-- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 7750e9cd..7a0eefd9 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -18,6 +18,7 @@ import { toRadians } from '@/turnNavigation/GeoMethods' import { linear } from 'ol/easing' import VectorLayer from 'ol/layer/Vector' import { LineString } from 'ol/geom' +import { AnimationOptions } from 'ol/View' export default class MapActionReceiver implements ActionReceiver { readonly map: Map @@ -73,26 +74,31 @@ export default class MapActionReceiver implements ActionReceiver { const center = fromLonLat([action.coordinate.lng, action.coordinate.lat]) if (action.syncView) { - // The heading is in degrees and shows direction into which device is going. - // Although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. - let rotation = Number.isNaN(action.heading) ? mapView.getRotation() : -toRadians(action.heading) - - // Ignore heavy rotation when nearly no movement. - const arr = mapView.getCenter() - const rotDelta = Math.abs(mapView.getRotation() - rotation) - const smallMove = arr && new LineString([arr, center]).getLength() < 1 - if (action.speed == 0 || ((smallMove || action.speed <= 0.5) && rotDelta > Math.PI / 4)) - rotation = mapView.getRotation() - - mapView.animate({ + const args: AnimationOptions = { zoom: action.zoom, center: center, - rotation: rotation, easing: linear, // We could use 1000ms or more but map tiles won't update probably due to missing updateWhileAnimating. // For now, due to performance reasons, we set this to true only for the layer. duration: 800, - }) + } + + if (!Number.isNaN(action.heading) && action.speed == 0) { + // The heading is in degrees and shows direction into which device is going. + // Although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. + const rotation = -toRadians(action.heading) + const rotDelta = Math.abs(mapView.getRotation() - rotation) + const arr = mapView.getCenter() + const smallMove = arr && new LineString([arr, center]).getLength() < 1 + + if ((smallMove || action.speed <= 0.5) && rotDelta > Math.PI / 4) { + // Ignore heavy rotation when nearly no movement or tiny rotation (avoids jitty https://github.com/openlayers/openlayers/discussions/14764) + } else { + args.rotation = rotation + } + } + + mapView.animate(args) } else { // TODO why does this layer not yet exist in the constructor const layer = this.map diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index a770246a..624e02c8 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -332,8 +332,8 @@ export default class TurnNavigationStore extends Store if (instr.index != instructionState.index) announcementsToDo = instr.distanceToTurn > 1000 ? 2 : 1 - const details = factor + ', avg-speed:' + estimatedAvgSpeed + ', announcements:' + announcementsToDo - console.log('first:' + firstAnnounceDistance + ' last:' + lastAnnounceDistance + ', factor:' + details) + // const details = factor + ', avg-speed:' + estimatedAvgSpeed + ', announcements:' + announcementsToDo + // console.log('first:' + firstAnnounceDistance + ' last:' + lastAnnounceDistance + ', factor:' + details) if (instr.distanceToTurn <= lastAnnounceDistance && announcementsToDo > 0) { announcementsToDo = 0 From 4feb52f663005b5c38a63c4de03fc40fbcfefec4 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 29 May 2023 21:38:54 +0200 Subject: [PATCH 252/322] merged --- src/map/map.ts | 1 + src/stores/MapActionReceiver.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/map/map.ts b/src/map/map.ts index ac34e183..d1b3ed9b 100644 --- a/src/map/map.ts +++ b/src/map/map.ts @@ -12,6 +12,7 @@ export function createMap(): Map { map = new Map({ view: new View({ enableRotation: true, + constrainRotation: false, multiWorld: false, constrainResolution: true, center: fromLonLat([10, 10]), diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 7a0eefd9..ec3e279c 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -83,7 +83,7 @@ export default class MapActionReceiver implements ActionReceiver { duration: 800, } - if (!Number.isNaN(action.heading) && action.speed == 0) { + if (!Number.isNaN(action.heading) && action.speed > 0) { // The heading is in degrees and shows direction into which device is going. // Although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. const rotation = -toRadians(action.heading) From c5422cfd90bbba081cce6a97314e23dc32d5af77 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 2 Jun 2023 16:05:44 +0200 Subject: [PATCH 253/322] more compact navigation bar --- src/App.module.css | 10 +--- src/App.tsx | 2 +- src/turnNavigation/TurnNavigation.module.css | 50 +++++++++++++--- src/turnNavigation/TurnNavigation.tsx | 60 +++++++++++--------- 4 files changed, 76 insertions(+), 46 deletions(-) diff --git a/src/App.module.css b/src/App.module.css index 5dbf1b7d..bf733ea4 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -57,7 +57,7 @@ grid-column: 1 / span 1; grid-row: 1 / span 1; z-index: 3; - max-height: 8em; + max-height: 87px; margin: 0.5rem; padding: 0.5rem; background-color: white; @@ -146,14 +146,6 @@ pointer-events: all; } -.smallScreenRoutingResult { - grid-row: 4 / span 1; - grid-column: 1 / span 1; - margin: 0; - z-index: 2; - background-color: white; -} - .smallScreenFirstRow { grid-row: 1 / span 1; grid-column: 1 / span 1; diff --git a/src/App.tsx b/src/App.tsx index 979c9298..d8bd9781 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -325,7 +325,7 @@ function SmallScreenLayout({
    )}
    -
    +
    diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index ce21ba03..82c8df17 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -1,48 +1,81 @@ .turnInfo { font-size: 20px; display: flex; - padding: 0.5rem; + padding: 3px; } .turnInfoRightSide { display: flex; width: 100%; - flex-direction: column; + flex-direction: row; justify-content: space-between; } + .instructionText { font-size: smaller; overflow: hidden; - height: 20px; } .turnSign img { padding-top: 0.4rem; - height: 3.5rem; + height: 45px; + padding-bottom: 4px; } .turnSign div:first-child { - padding-bottom: 0.7em; + padding-bottom: 7px; + min-height: 50px; } + .turnSign { padding-left: 0.4rem; - min-width: 25%; + + min-width: 80px; + font-size: smaller; flex-direction: column; font-weight: bold; } +.currentData { + padding-bottom: 4px; + width: 45%; + flex-grow: 1; + + display: flex; + justify-content: space-between; + flex-direction: column; +} + +.speedRow { + display: flex; + flex-direction: row; +} + +.currentSpeed { + font-size: 22px; + padding-right: 10px; + padding-top: 3px; +} + +.maxSpeed { + /*background-color: red;*/ +} + .arrival .remainingDistance { color: gray; - padding-top: 10px; + font-size: smaller; + padding-top: 20px; padding-bottom: 3px; float: right; } .arrival { + flex-grow: 2; + padding-top: 4px; display: flex; font-size: larger; flex-direction: row; - justify-content: space-between; + justify-content: center; } .arrival svg { @@ -57,6 +90,7 @@ .thirdCol { height: 20px; + width: 20px; } .thirdCol svg { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index e0a6f787..1fff4601 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -53,51 +53,55 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto {metersToText(instruction.distanceToEnd, false)}
    -
    setShowDebug(!showDebug)}> -
    {currentSpeed} km/h
    -
    +
    +
    setShowDebug(!showDebug)}> +
    +
    {currentSpeed} km/h
    +
    {pd.maxSpeed != null && (ApiImpl.isMotorVehicle(turnNavigation.activeProfile) || pd.maxSpeed > 50) ? ( - + {Math.round(pd.maxSpeed)} ) : null}
    - {showDebug ? ( -
    -
    {pd.estimatedAvgSpeed}
    -
    {pd.surface}
    -
    {pd.roadClass}
    -
    - ) : null}
    - { - if (turnNavigation.settings.forceVectorTiles) - Dispatcher.dispatch(new SelectMapLayer(turnNavigation.oldTiles)) - Dispatcher.dispatch(new TurnNavigationStop()) - }} - > - - +
    + {instruction.text} +
    + {showDebug ? ( +
    + {pd.estimatedAvgSpeed}, + {pd.surface}, + {pd.roadClass} +
    + ) : null}
    -
    {instruction.text}
    + { + if (turnNavigation.settings.forceVectorTiles) + Dispatcher.dispatch(new SelectMapLayer(turnNavigation.oldTiles)) + Dispatcher.dispatch(new TurnNavigationStop()) + }} + > + +
    From 4c792db73770baaebaa616ca5288d9c70399a532 Mon Sep 17 00:00:00 2001 From: easbar Date: Fri, 2 Jun 2023 16:25:01 +0200 Subject: [PATCH 254/322] close context menu before going to navi, separate useEffect --- src/layers/ContextMenu.tsx | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/layers/ContextMenu.tsx b/src/layers/ContextMenu.tsx index 3f3fd968..eb03a3a1 100644 --- a/src/layers/ContextMenu.tsx +++ b/src/layers/ContextMenu.tsx @@ -22,6 +22,20 @@ export default function ContextMenu({ map, route, queryPoints, navigation }: Con const container = useRef(null) const navigationRef = useRef(navigation) + useEffect(() => { + // we need the reference so we get the up-to-date value of the navigation prop in the openContextMenu callback + navigationRef.current = navigation + if (!navigation) closeContextMenu() + }, [navigation]) + + const openContextMenu = (e: any) => { + e.preventDefault() + if (navigationRef.current) return + const coordinate = map.getEventCoordinate(e) + const lonLat = toLonLat(coordinate) + setMenuCoordinate({ lng: lonLat[0], lat: lonLat[1] }) + } + const closeContextMenu = () => { setMenuCoordinate(null) } @@ -29,19 +43,10 @@ export default function ContextMenu({ map, route, queryPoints, navigation }: Con useEffect(() => { overlay.setElement(container.current!) map.addOverlay(overlay) - navigationRef.current = navigation - - function openContextMenu(e: any) { - e.preventDefault() - if (navigationRef.current) return - const coordinate = map.getEventCoordinate(e) - const lonLat = toLonLat(coordinate) - setMenuCoordinate({ lng: lonLat[0], lat: lonLat[1] }) - } const longTouchHandler = new LongTouchHandler(e => openContextMenu(e)) - map.on('change:target', () => { + function onMapTargetChange() { // it is important to setup new listeners whenever the map target changes, like when we switch between the // small and large screen layout, see #203 @@ -55,14 +60,16 @@ export default function ContextMenu({ map, route, queryPoints, navigation }: Con map.getTargetElement().addEventListener('touchend', () => longTouchHandler.onTouchEnd()) map.getTargetElement().addEventListener('click', closeContextMenu) - }) + } + map.on('change:target', onMapTargetChange) return () => { map.getTargetElement().removeEventListener('contextmenu', openContextMenu) map.getTargetElement().removeEventListener('click', closeContextMenu) map.removeOverlay(overlay) + map.un('change:target', onMapTargetChange) } - }, [map, navigation]) + }, [map]) useEffect(() => { overlay.setPosition(menuCoordinate ? fromLonLat([menuCoordinate.lng, menuCoordinate.lat]) : undefined) From 29934f15a7ed399e7fde325e9abc4983bc1f626a Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 2 Jun 2023 16:54:51 +0200 Subject: [PATCH 255/322] bigger maxSpeed circle necessary and minor increase height of bar --- src/App.module.css | 2 +- src/turnNavigation/TurnNavigation.module.css | 7 ++++--- src/turnNavigation/TurnNavigation.tsx | 14 +++++++------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/App.module.css b/src/App.module.css index bf733ea4..5717533b 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -57,7 +57,7 @@ grid-column: 1 / span 1; grid-row: 1 / span 1; z-index: 3; - max-height: 87px; + max-height: 94px; margin: 0.5rem; padding: 0.5rem; background-color: white; diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 82c8df17..756db823 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -37,6 +37,7 @@ } .currentData { + padding-top: 2px; padding-bottom: 4px; width: 45%; flex-grow: 1; @@ -54,7 +55,7 @@ .currentSpeed { font-size: 22px; padding-right: 10px; - padding-top: 3px; + padding-top: 5px; } .maxSpeed { @@ -89,8 +90,8 @@ } .thirdCol { - height: 20px; - width: 20px; + height: 30px; + width: 25px; } .thirdCol svg { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 1fff4601..2f1e7c08 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -62,19 +62,19 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto (ApiImpl.isMotorVehicle(turnNavigation.activeProfile) || pd.maxSpeed > 50) ? ( - + {Math.round(pd.maxSpeed)} From df3962936234013615a2821ea317051cfc20f122 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 4 Jun 2023 21:15:18 +0200 Subject: [PATCH 256/322] css tuning --- src/stores/TurnNavigationStore.ts | 9 +++ src/turnNavigation/TurnNavigation.module.css | 61 ++++++++++---------- src/turnNavigation/TurnNavigation.tsx | 8 +-- 3 files changed, 43 insertions(+), 35 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 624e02c8..3bb13d0b 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -464,6 +464,15 @@ export default class TurnNavigationStore extends Store } private async initFake() { + if (this.state.settings.fullScreen) + try { + let el = document.documentElement + let requestFullscreenFct = el.requestFullscreen + requestFullscreenFct.call(el) + } catch (e) { + console.log('error requesting full screen ' + JSON.stringify(e)) + } + console.log('started fake GPS injection') let mouseControlled = false // control GPS movement via mouse or see below: along a predefined route diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 756db823..e0a383a9 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -1,7 +1,7 @@ .turnInfo { font-size: 20px; display: flex; - padding: 3px; + padding: 3px 3px 6px 12px /* left needs a bit more space -> rounded screens */; } .turnInfoRightSide { @@ -36,9 +36,30 @@ font-weight: bold; } -.currentData { - padding-top: 2px; - padding-bottom: 4px; +.secondCol .remainingDistance { + color: #000000; + font-size: smaller; + padding-top: 20px; + padding-bottom: 3px; + float: right; +} + +.secondCol { + flex-grow: 2; + padding-top: 4px; + display: flex; + font-size: larger; + flex-direction: row; + justify-content: center; +} + +.secondCol svg { + padding-left: 22px; + padding-right: 22px; +} + +.thirdCol { + padding: 2px 20px 4px 20px; width: 45%; flex-grow: 1; @@ -55,46 +76,24 @@ .currentSpeed { font-size: 22px; padding-right: 10px; - padding-top: 5px; + padding-top: 4px; } .maxSpeed { /*background-color: red;*/ } -.arrival .remainingDistance { - color: gray; - font-size: smaller; - padding-top: 20px; - padding-bottom: 3px; - float: right; -} - -.arrival { - flex-grow: 2; - padding-top: 4px; - display: flex; - font-size: larger; - flex-direction: row; - justify-content: center; -} - -.arrival svg { - padding-left: 22px; - padding-right: 22px; -} - .debug { font-size: smaller; float: right; } -.thirdCol { - height: 30px; - width: 25px; +.fourthCol { + height: 38px; + width: 27px; } -.thirdCol svg { +.fourthCol svg { width: 20px; height: 20px; padding: 0; diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 2f1e7c08..be14985b 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -30,7 +30,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
    {metersToText(instruction.distanceToTurn, false)}
    -
    +
    setShowTime(!showTime)}> {showTime ? (
    @@ -54,7 +54,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
    -
    setShowDebug(!showDebug)}> +
    setShowDebug(!showDebug)}>
    {currentSpeed} km/h
    @@ -74,7 +74,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto strokeWidth="3px" fill="none" /> - + {Math.round(pd.maxSpeed)} @@ -93,7 +93,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto ) : null}
    { if (turnNavigation.settings.forceVectorTiles) Dispatcher.dispatch(new SelectMapLayer(turnNavigation.oldTiles)) From 934f6eeced35018935fc0e1a299d09a372ec20a4 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 11 Jun 2023 12:47:20 +0200 Subject: [PATCH 257/322] move turn sign to top left --- src/App.module.css | 102 +++------- src/App.tsx | 105 ++-------- src/layers/ContextMenu.tsx | 11 +- .../instructions/Instructions.module.css | 1 - src/stores/MapActionReceiver.ts | 2 +- src/turnNavigation/TurnNavigation.module.css | 183 +++++++++++++----- src/turnNavigation/TurnNavigation.tsx | 125 +++++++----- 7 files changed, 255 insertions(+), 274 deletions(-) diff --git a/src/App.module.css b/src/App.module.css index eb4041aa..96f0e2b3 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -4,7 +4,7 @@ padding: 0; margin: 0; display: grid; - grid-template-columns: 27rem 1fr auto; + grid-template-columns: 26rem 1fr auto; grid-template-rows: 100%; justify-content: space-between; overflow: auto; @@ -12,6 +12,32 @@ user-select: none; /* firefox does not ignore -webkit-user-select so make this explicit, see #217 */ } +.appNaviWrapper { + width: 100%; + height: 100%; + padding: 0; + margin: 0; + display: grid; + grid-template-columns: 30rem 1fr; + grid-template-rows: 1fr auto; + justify-content: space-between; + overflow: auto; + -webkit-user-select: none; + user-select: none; /* firefox does not ignore -webkit-user-select so make this explicit, see #217 */ +} + +@media (max-width: 44rem) { + .appWrapper { + grid-template-columns: 100%; + grid-template-rows: auto 0 1fr auto auto; + } + + .appNaviWrapper { + grid-template-columns: 100%; + grid-template-rows: 1fr auto; + } +} + .map { grid-column: 1 / span 3; grid-row: 1 / span 1; @@ -53,18 +79,6 @@ overflow: auto; } -.turnNavigation { - grid-column: 1 / span 1; - grid-row: 1 / span 1; - z-index: 3; - max-height: 94px; - margin: 0.5rem; - padding: 0.5rem; - background-color: white; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); - border-radius: 0.5rem; -} - .onMapRightSide { position: relative; grid-column: 3 / span 1; @@ -94,34 +108,6 @@ pointer-events: none; } -.volume { - grid-column: 3 / span 1; - grid-row: 1 / span 1; - margin: 5px 5px; - padding: 7px 7px 2px 7px; - height: 53px; - z-index: 2; - background-color: white; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); - border-radius: 0.5rem; -} - -.syncLocation svg { - scale: 0.8; -} - -.syncLocation { - grid-column: 3 / span 1; - grid-row: 1 / span 1; - margin: 75px 5px 5px 5px; - padding: 7px 7px 2px 7px; - height: 53px; - z-index: 2; - background-color: white; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); - border-radius: 0.5rem; -} - .smallScreenMap { grid-row: 1 / span 3; grid-column: 1 / span 1; @@ -147,33 +133,6 @@ box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); } -.smallScreenFirstRow { - grid-row: 1 / span 1; - grid-column: 1 / span 1; - - display: flex; - justify-content: space-between; - z-index: 2; -} - -.smallScreenVolume { - align-self: flex-start; - width: 48px; - padding: 5px; - background-color: white; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); - border-radius: 0.5rem; -} - -.smallScreenSyncLocation { - align-self: flex-end; - width: 48px; - padding: 5px; - background-color: white; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); - border-radius: 0.5rem; -} - .smallScreenPoweredBy { grid-row: 5 / span 1; grid-column: 1 / span 1; @@ -182,13 +141,6 @@ z-index: 2; } -@media (max-width: 44rem) { - .appWrapper { - grid-template-columns: 100%; - grid-template-rows: auto 0 1fr auto auto; - } -} - /* mapilion */ @font-face { font-family: 'Open Sans'; diff --git a/src/App.tsx b/src/App.tsx index 6a2be853..86652410 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react' +import React, { useEffect, useState } from 'react' import PathDetails from '@/pathDetails/PathDetails' import styles from './App.module.css' import { @@ -24,7 +24,7 @@ import { MapOptionsStoreState } from '@/stores/MapOptionsStore' import { ErrorStoreState } from '@/stores/ErrorStore' import Search from '@/sidebar/search/Search' import ErrorMessage from '@/sidebar/ErrorMessage' -import { TNSettingsState, TurnNavigationStoreState } from './stores/TurnNavigationStore' +import { TurnNavigationStoreState } from './stores/TurnNavigationStore' import useBackgroundLayer from '@/layers/UseBackgroundLayer' import useQueryPointsLayer from '@/layers/UseQueryPointsLayer' import usePathsLayer from '@/layers/UsePathsLayer' @@ -38,11 +38,6 @@ import useUrbanDensityLayer from '@/layers/UseUrbanDensityLayer' import useMapBorderLayer from '@/layers/UseMapBorderLayer' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' import RoutingProfiles from '@/sidebar/search/routingProfiles/RoutingProfiles' -import { LocationUpdateSync, TurnNavigationSettingsUpdate } from '@/actions/Actions' -import Dispatcher from '@/stores/Dispatcher' -import VolumeUpIcon from '@/turnNavigation/volume_up.svg' -import VolumeOffIcon from '@/turnNavigation/volume_off.svg' -import SyncLocationIcon from '@/turnNavigation/location_searching.svg' import PlainButton from '@/PlainButton' import TurnNavigation from '@/turnNavigation/TurnNavigation' import MapPopups from '@/map/MapPopups' @@ -127,15 +122,17 @@ export default function App() { const isSmallScreen = useMediaQuery({ query: '(max-width: 44rem)' }) return ( -
    +
    - - {isSmallScreen ? ( + + {turnNavigation.showUI ? ( + <> + +
    + +
    + + ) : isSmallScreen ? ( -
    - -
    -
    - - Dispatcher.dispatch( - new TurnNavigationSettingsUpdate({ - soundEnabled: !turnNavigation.settings.soundEnabled, - } as TNSettingsState) - ) - } - > - {turnNavigation.settings.soundEnabled ? ( - - ) : ( - - )} - -
    - {!turnNavigation.settings.syncView && ( -
    - Dispatcher.dispatch(new LocationUpdateSync(true))}> - - -
    - )} -
    - -
    - - ) - return ( <> {showSidebar ? ( @@ -294,48 +255,6 @@ function SmallScreenLayout({ drawAreas, turnNavigation, }: LayoutProps) { - if (turnNavigation.showUI) - return ( - <> -
    -
    - Dispatcher.dispatch( - new TurnNavigationSettingsUpdate({ - soundEnabled: !turnNavigation.settings.soundEnabled, - } as TNSettingsState) - ) - } - > - - {turnNavigation.settings.soundEnabled ? ( - - ) : ( - - )} - -
    - {!turnNavigation.settings.syncView && ( -
    Dispatcher.dispatch(new LocationUpdateSync(true))} - > - - - -
    - )} -
    -
    - -
    -
    - -
    - - ) - return ( <>
    diff --git a/src/layers/ContextMenu.tsx b/src/layers/ContextMenu.tsx index eb03a3a1..24fd299b 100644 --- a/src/layers/ContextMenu.tsx +++ b/src/layers/ContextMenu.tsx @@ -10,27 +10,18 @@ interface ContextMenuProps { map: Map route: RouteStoreState queryPoints: QueryPoint[] - navigation: boolean } const overlay = new Overlay({ autoPan: true, }) -export default function ContextMenu({ map, route, queryPoints, navigation }: ContextMenuProps) { +export default function ContextMenu({ map, route, queryPoints }: ContextMenuProps) { const [menuCoordinate, setMenuCoordinate] = useState(null) const container = useRef(null) - const navigationRef = useRef(navigation) - - useEffect(() => { - // we need the reference so we get the up-to-date value of the navigation prop in the openContextMenu callback - navigationRef.current = navigation - if (!navigation) closeContextMenu() - }, [navigation]) const openContextMenu = (e: any) => { e.preventDefault() - if (navigationRef.current) return const coordinate = map.getEventCoordinate(e) const lonLat = toLonLat(coordinate) setMenuCoordinate({ lng: lonLat[0], lat: lonLat[1] }) diff --git a/src/sidebar/instructions/Instructions.module.css b/src/sidebar/instructions/Instructions.module.css index 2c1f516b..b606093d 100644 --- a/src/sidebar/instructions/Instructions.module.css +++ b/src/sidebar/instructions/Instructions.module.css @@ -19,7 +19,6 @@ .sign > svg { width: 100%; height: 100%; - display: block; } .mainText { diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index ec3e279c..d6b6476e 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -69,7 +69,7 @@ export default class MapActionReceiver implements ActionReceiver { const mapView = this.map.getView() const size = this.map.getSize() // [width, height] // move center a bit down - mapView.padding = [size ? size[1] / 2 : 0, 0, 0, 0] + mapView.padding = [size ? (size[1] * 2) / 3 : 0, 0, 0, 0] mapView.cancelAnimations() // if location updates are sent too fast animations might stack up const center = fromLonLat([action.coordinate.lng, action.coordinate.lat]) diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index e0a383a9..dd3e2fde 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -1,86 +1,165 @@ -.turnInfo { - font-size: 20px; +.turnSign { + padding: 10px 10px 10px 10px; + min-width: 70px; + margin-right: 1px; + background-color: white; + + font-size: smaller; + font-weight: bold; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); + border-bottom-right-radius: 0.5rem; + display: flex; - padding: 3px 3px 6px 12px /* left needs a bit more space -> rounded screens */; + flex-direction: column; + align-items: center; + align-self: flex-start; } -.turnInfoRightSide { - display: flex; - width: 100%; - flex-direction: row; - justify-content: space-between; +.turnSign div:first-child { + padding-bottom: 7px; + min-height: 50px; +} + +.turnSign img { + height: 55px; +} + +.turnSign .nextDistance { } .instructionText { - font-size: smaller; overflow: hidden; -} + align-self: flex-start; + flex-grow: 1; -.turnSign img { - padding-top: 0.4rem; - height: 45px; - padding-bottom: 4px; + background-color: rgba(255, 255, 255, 1); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); } -.turnSign div:first-child { - padding-bottom: 7px; - min-height: 50px; +.instructionText:not(:empty) { + padding: 5px 10px; } -.turnSign { - padding-left: 0.4rem; +.firstRow { + grid-row: 1 / span 1; + grid-column: 1 / span 1; + display: flex; + z-index: 1; + /* important to avoid overlay over whole map */ + align-self: flex-start; + /* + background-color: red; + highlight the area which isn't clickable except we set it to none + */ + pointer-events: none; +} - min-width: 80px; - font-size: smaller; +.buttonCol { + display: flex; flex-direction: column; - font-weight: bold; + pointer-events: visible; + gap: 10px; } -.secondCol .remainingDistance { - color: #000000; - font-size: smaller; - padding-top: 20px; - padding-bottom: 3px; - float: right; +.volume { + padding: 5px; + margin-left: 1px; + background-color: white; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); + border-radius: 0 0 0.5rem 0.5rem; } -.secondCol { - flex-grow: 2; - padding-top: 4px; +.syncLocation { + padding: 5px; + background-color: white; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); + border-radius: 0.5rem; +} + +.syncLocation svg { + scale: 0.8; +} + +.syncLocation { + z-index: 2; + background-color: white; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); + border-radius: 0.5rem; +} + +.turnInfo { + z-index: 2; + font-size: 20px; display: flex; - font-size: larger; - flex-direction: row; - justify-content: center; + padding: 10px 3px 10px 12px /* left needs a bit more space -> rounded screens */; } -.secondCol svg { - padding-left: 22px; - padding-right: 22px; +/* not all and (x) is the opposite of x */ +@media not all and (max-width: 44rem) { + .instructionText { + flex-grow: unset; + margin-right: auto; + width: 23.8rem; + border-bottom-right-radius: 0.5rem; + } + + .firstRow { + grid-column: 1 / span 2; + justify-content: space-between; + } + + .turnInfo { + grid-column: 1 / span 1; + grid-row: 1 / span 1; + align-self: end; + background-color: white; + + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); + border-top-right-radius: 0.5rem; + } } -.thirdCol { - padding: 2px 20px 4px 20px; - width: 45%; - flex-grow: 1; +.turnInfoRightSide { + font-size: larger; display: flex; + align-items: baseline; /* text of different columns -> same line */ + width: 100%; + flex-direction: row; justify-content: space-between; - flex-direction: column; } -.speedRow { +.firstCol { + flex-grow: 1; display: flex; - flex-direction: row; + justify-content: center; } .currentSpeed { - font-size: 22px; + padding-top: 1px; padding-right: 10px; - padding-top: 4px; } -.maxSpeed { - /*background-color: red;*/ +.secondCol { + font-size: larger; + + flex-grow: 3; + display: flex; + justify-content: center; +} + +.remainingDistance { + color: #000000; +} + +.secondCol svg { + padding-left: 22px; + padding-right: 22px; +} + +.thirdCol { + padding: 0 20px 0 20px; + flex-grow: 1; } .debug { @@ -98,3 +177,11 @@ height: 20px; padding: 0; } + +.largeScreenColumn { + grid-row: 1 / span 1; + grid-column: 1 / span 1; + + display: flex; + z-index: 2; +} diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index be14985b..21b92b76 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -3,11 +3,14 @@ import { metersToText, milliSecondsToText } from '@/Converters' import { getTurnSign } from '@/sidebar/instructions/Instructions' import styles from '@/turnNavigation/TurnNavigation.module.css' import EndNavigation from '@/sidebar/times-solid.svg' -import { TurnNavigationStoreState } from '@/stores/TurnNavigationStore' +import { TNSettingsState, TurnNavigationStoreState } from '@/stores/TurnNavigationStore' import Dispatcher from '@/stores/Dispatcher' -import { SelectMapLayer, TurnNavigationStop } from '@/actions/Actions' +import { LocationUpdateSync, SelectMapLayer, TurnNavigationSettingsUpdate, TurnNavigationStop } from '@/actions/Actions' import PlainButton from '@/PlainButton' import { ApiImpl } from '@/api/Api' +import VolumeUpIcon from '@/turnNavigation/volume_up.svg' +import VolumeOffIcon from '@/turnNavigation/volume_off.svg' +import SyncLocationIcon from '@/turnNavigation/location_searching.svg' export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { if (turnNavigation.activePath == null) new Error('activePath cannot be null if TurnNavigation is enabled') @@ -24,12 +27,80 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto return ( <> +
    +
    +
    {getTurnSign(instruction.sign, instruction.index, instruction.nextWaypointIndex)}
    +
    {metersToText(instruction.distanceToTurn, false)}
    +
    +
    setShowDebug(!showDebug)} + > + {instruction.text} + {showDebug ? ( +
    + {pd.estimatedAvgSpeed}, + {pd.surface}, + {pd.roadClass} +
    + ) : null} +
    + +
    +
    + Dispatcher.dispatch( + new TurnNavigationSettingsUpdate({ + soundEnabled: !turnNavigation.settings.soundEnabled, + } as TNSettingsState) + ) + } + > + + {turnNavigation.settings.soundEnabled ? ( + + ) : ( + + )} + +
    + {!turnNavigation.settings.syncView && ( +
    Dispatcher.dispatch(new LocationUpdateSync(true))} + > + + + +
    + )} +
    +
    -
    -
    {getTurnSign(instruction.sign, instruction.index, instruction.nextWaypointIndex)}
    -
    {metersToText(instruction.distanceToTurn, false)}
    -
    +
    +
    {currentSpeed} km/h
    +
    + {pd.maxSpeed != null && + (ApiImpl.isMotorVehicle(turnNavigation.activeProfile) || pd.maxSpeed > 50) ? ( + + + + {Math.round(pd.maxSpeed)} + + + ) : null} +
    +
    setShowTime(!showTime)}> {showTime ? ( @@ -49,48 +120,10 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
    )} -
    - {metersToText(instruction.distanceToEnd, false)} -
    -
    setShowDebug(!showDebug)}> -
    -
    {currentSpeed} km/h
    -
    - {pd.maxSpeed != null && - (ApiImpl.isMotorVehicle(turnNavigation.activeProfile) || pd.maxSpeed > 50) ? ( - - - - {Math.round(pd.maxSpeed)} - - - ) : null} -
    -
    -
    - {instruction.text} -
    - {showDebug ? ( -
    - {pd.estimatedAvgSpeed}, - {pd.surface}, - {pd.roadClass} -
    - ) : null} +
    +
    {metersToText(instruction.distanceToEnd, false)}
    Date: Sun, 11 Jun 2023 15:02:04 +0200 Subject: [PATCH 258/322] minor padding --- src/turnNavigation/TurnNavigation.module.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index dd3e2fde..c2e5b101 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -1,5 +1,5 @@ .turnSign { - padding: 10px 10px 10px 10px; + padding: 15px 10px 10px 10px; min-width: 70px; margin-right: 1px; background-color: white; From 753b482255557f6fce4cc4de96cdb97a43f53ee2 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 11 Jun 2023 16:08:43 +0200 Subject: [PATCH 259/322] support for miles and mph --- src/Converters.ts | 18 +++++ src/index.tsx | 4 +- src/stores/TurnNavigationStore.ts | 40 +++++++--- src/turnNavigation/TurnNavigation.tsx | 100 +++++++++++++----------- test/stores/TurnNavigationStore.test.ts | 12 +-- 5 files changed, 109 insertions(+), 65 deletions(-) diff --git a/src/Converters.ts b/src/Converters.ts index eea243f9..0783e0ce 100644 --- a/src/Converters.ts +++ b/src/Converters.ts @@ -12,10 +12,28 @@ export function milliSecondsToText(seconds: number) { } const distanceFormat = new Intl.NumberFormat(navigator.language, { maximumFractionDigits: 1 }) +const distanceFormat2 = new Intl.NumberFormat(navigator.language, { maximumFractionDigits: 2 }) + +export function kmToMPHIfMiles(value: number, showDistanceInMiles: boolean, roundTo10 = false) { + return showDistanceInMiles + ? roundTo10 + ? Math.round((value * 1.60934) / 10.0) * 10 + : Math.round(value * 1.60934) + : value +} + +export function meterToFt(value: number) { + return value / 0.3048 +} + +export function meterToMiles(value: number) { + return value / 1609.34 +} export function metersToText(meters: number, showDistanceInMiles: boolean, forceSmallUnits: boolean = false) { if (showDistanceInMiles) { if (meters < 160.934 || forceSmallUnits) return Math.floor(meters / 0.3048) + ' ft' + if (meters < 600) return distanceFormat2.format(meters / 1609.34) + ' mi' return distanceFormat.format(meters / 1609.34) + ' mi' } else { if (meters < 1000 || forceSmallUnits) return Math.floor(meters) + ' m' diff --git a/src/index.tsx b/src/index.tsx index 278f97be..0a61a478 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -48,6 +48,7 @@ setApi(config.routingApi, config.geocodingApi, apiKey || '') const initialCustomModelStr = url.searchParams.get('custom_model') const queryStore = new QueryStore(getApi(), initialCustomModelStr) +const settingsStore = new SettingsStore() const routeStore = new RouteStore(queryStore) const speechSynthesizer = new SpeechSynthesizerImpl(navigator.language) @@ -62,10 +63,11 @@ const turnNavigationStore = new TurnNavigationStore( new CoordSysImpl(), fakeGPSDelta, config.defaultTiles, + settingsStore, queryStore.state.customModelEnabled ? queryStore.state.customModelStr : '' ) setStores({ - settingsStore: new SettingsStore(), + settingsStore: settingsStore, queryStore: queryStore, routeStore: routeStore, infoStore: new ApiInfoStore(), diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 3bb13d0b..df046ec2 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -34,6 +34,8 @@ import { Instruction, Path, RoutingArgs } from '@/api/graphhopper' import { tr } from '@/translation/Translation' import { SpeechSynthesizer } from '@/SpeechSynthesizer' import { Pixel } from 'ol/pixel' +import SettingsStore from '@/stores/SettingsStore' +import { meterToFt, meterToMiles } from '@/Converters' export interface TurnNavigationStoreState { // TODO replace "showUI" with a composite state depending on activePath, coordinate and instruction @@ -95,6 +97,7 @@ export default class TurnNavigationStore extends Store private noSleep: NoSleep | null = null private readonly speechSynthesizer: SpeechSynthesizer private readonly cs: MapCoordinateSystem + private readonly settingsStore: SettingsStore constructor( api: Api, @@ -102,6 +105,7 @@ export default class TurnNavigationStore extends Store cs: MapCoordinateSystem, fakeGPSDelta: number, tiles: string, + settingsStore: SettingsStore, customModelStr: string ) { super({ @@ -132,6 +136,7 @@ export default class TurnNavigationStore extends Store this.cs = cs this.api = api this.speechSynthesizer = speechSynthesizer + this.settingsStore = settingsStore } reduce(state: TurnNavigationStoreState, action: Action): TurnNavigationStoreState { @@ -185,7 +190,7 @@ export default class TurnNavigationStore extends Store customModelEnabled: action.enabled, } } else if (action instanceof SetCustomModel) { - console.log('SetCustomModel ' + action.customModelStr) + // console.log('SetCustomModel ' + action.customModelStr) return { ...state, customModelStr: action.customModelStr, @@ -197,7 +202,7 @@ export default class TurnNavigationStore extends Store activeProfile: action.result.profiles[0].name, } } else if (action instanceof SetVehicleProfile) { - console.log('SetVehicleProfile, profile: ' + action.profile.name) + // console.log('SetVehicleProfile, profile: ' + action.profile.name) return { ...state, activeProfile: action.profile.name, @@ -280,7 +285,7 @@ export default class TurnNavigationStore extends Store .route(args) .then(result => { if (result.paths.length > 0) { - console.log('rerouted:' + state.activePath?.distance + '->' + result.paths[0].distance) + // console.log('rerouted:' + state.activePath?.distance + '->' + result.paths[0].distance) Dispatcher.dispatch(new TurnNavigationRerouting(result.paths[0])) if (!skipWaypoint) this.synthesize(tr('reroute')) } else { @@ -340,17 +345,26 @@ export default class TurnNavigationStore extends Store this.synthesize(nextInstruction.text) } - if (instr.distanceToTurn <= firstAnnounceDistance && announcementsToDo == 2) { + const dist = instr.distanceToTurn + if (dist <= firstAnnounceDistance && announcementsToDo == 2) { announcementsToDo = 1 - if (instr.distanceToTurn > lastAnnounceDistance * 1.2 + 50) { + if (dist > lastAnnounceDistance * 1.2 + 50) { // do not interfere with last announcement - let inString = - instr.distanceToTurn > 1200 - ? tr('in_km', [(instr.distanceToTurn / 1000).toFixed(1)]) - : instr.distanceToTurn > 900 - ? tr('in_km_singular') - : tr('in_m', ['' + Math.floor(instr.distanceToTurn / 100) * 100]) - this.synthesize(inString + ' ' + nextInstruction.text) + if (this.settingsStore.state.showDistanceInMiles) { + let inString = + dist > 1800 + ? tr('in_mi', [meterToMiles(dist).toFixed(1)]) + : tr('in_ft', ['' + Math.round(meterToFt(dist) / 100) * 100]) + this.synthesize(inString + ' ' + nextInstruction.text) + } else { + let inString = + dist > 1200 + ? tr('in_km', [(dist / 1000).toFixed(1)]) + : dist > 900 + ? tr('in_km_singular') + : tr('in_m', ['' + Math.floor(dist / 100) * 100]) + this.synthesize(inString + ' ' + nextInstruction.text) + } } } @@ -439,7 +453,7 @@ export default class TurnNavigationStore extends Store } private synthesize(text: string) { - console.log('speak: ' + text) + // console.log('speak: ' + text) if (this.state.settings.soundEnabled) this.speechSynthesizer.synthesize(text) } diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 21b92b76..ed161450 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -1,5 +1,5 @@ -import React, { useState } from 'react' -import { metersToText, milliSecondsToText } from '@/Converters' +import React, { useContext, useState } from 'react' +import { kmToMPHIfMiles, metersToText, milliSecondsToText } from '@/Converters' import { getTurnSign } from '@/sidebar/instructions/Instructions' import styles from '@/turnNavigation/TurnNavigation.module.css' import EndNavigation from '@/sidebar/times-solid.svg' @@ -11,9 +11,11 @@ import { ApiImpl } from '@/api/Api' import VolumeUpIcon from '@/turnNavigation/volume_up.svg' import VolumeOffIcon from '@/turnNavigation/volume_off.svg' import SyncLocationIcon from '@/turnNavigation/location_searching.svg' +import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { if (turnNavigation.activePath == null) new Error('activePath cannot be null if TurnNavigation is enabled') + const showDistanceInMiles = useContext(ShowDistanceInMilesContext) const instruction = turnNavigation.instruction const pd = turnNavigation.pathDetails @@ -21,67 +23,71 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto let [showDebug, setShowDebug] = useState(false) const arrivalDate = new Date() - const currentSpeed = Math.round(turnNavigation.speed * 3.6) + const currentSpeed = kmToMPHIfMiles(turnNavigation.speed * 3.6, showDistanceInMiles) arrivalDate.setMilliseconds(arrivalDate.getSeconds() + instruction.timeToEnd) const min = arrivalDate.getMinutes() return ( <>
    -
    -
    {getTurnSign(instruction.sign, instruction.index, instruction.nextWaypointIndex)}
    -
    {metersToText(instruction.distanceToTurn, false)}
    +
    +
    {getTurnSign(instruction.sign, instruction.index, instruction.nextWaypointIndex)}
    +
    + {metersToText(instruction.distanceToTurn, showDistanceInMiles)}
    +
    +
    setShowDebug(!showDebug)} + > + {instruction.text} + {showDebug ? ( +
    + {pd.estimatedAvgSpeed}, + {pd.surface}, + {pd.roadClass} +
    + ) : null} +
    + +
    setShowDebug(!showDebug)} + className={styles.volume} + onClick={() => + Dispatcher.dispatch( + new TurnNavigationSettingsUpdate({ + soundEnabled: !turnNavigation.settings.soundEnabled, + } as TNSettingsState) + ) + } > - {instruction.text} - {showDebug ? ( -
    - {pd.estimatedAvgSpeed}, - {pd.surface}, - {pd.roadClass} -
    - ) : null} + + {turnNavigation.settings.soundEnabled ? ( + + ) : ( + + )} +
    - -
    + {!turnNavigation.settings.syncView && (
    - Dispatcher.dispatch( - new TurnNavigationSettingsUpdate({ - soundEnabled: !turnNavigation.settings.soundEnabled, - } as TNSettingsState) - ) - } + className={styles.syncLocation} + onClick={() => Dispatcher.dispatch(new LocationUpdateSync(true))} > - {turnNavigation.settings.soundEnabled ? ( - - ) : ( - - )} +
    - {!turnNavigation.settings.syncView && ( -
    Dispatcher.dispatch(new LocationUpdateSync(true))} - > - - - -
    - )} -
    + )} +
    -
    {currentSpeed} km/h
    +
    + {currentSpeed} {showDistanceInMiles ? 'mph' : 'km/h'} +
    {pd.maxSpeed != null && (ApiImpl.isMotorVehicle(turnNavigation.activeProfile) || pd.maxSpeed > 50) ? ( @@ -95,7 +101,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto fill="none" /> - {Math.round(pd.maxSpeed)} + {kmToMPHIfMiles(pd.maxSpeed, showDistanceInMiles, true)} ) : null} @@ -123,7 +129,9 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
    -
    {metersToText(instruction.distanceToEnd, false)}
    +
    + {metersToText(instruction.distanceToEnd, showDistanceInMiles)} +
    { }) function createStore(api: Api, speech = new DummySpeech()) { - const store = new TurnNavigationStore(api, speech, new DummyCS(), 0, '', '') + const store = new TurnNavigationStore(api, speech, new DummyCS(), 0, '', new SettingsStore(), '') Dispatcher.register(store) return store } @@ -388,6 +386,10 @@ describe('TurnNavigationStore', () => { }) async function flushPromises() { - const flush = () => new Promise(setImmediate) + const flush = () => new Promise(setImmediatePolyfill) await flush() } + +function setImmediatePolyfill(callback: any) { + return setTimeout(callback, 0); +} \ No newline at end of file From 1feeafe3863f4fe5cfc56da509a09aa5ef845ef8 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 11 Jun 2023 16:17:38 +0200 Subject: [PATCH 260/322] bug fix --- src/Converters.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Converters.ts b/src/Converters.ts index 0783e0ce..1bbba8ae 100644 --- a/src/Converters.ts +++ b/src/Converters.ts @@ -17,9 +17,9 @@ const distanceFormat2 = new Intl.NumberFormat(navigator.language, { maximumFract export function kmToMPHIfMiles(value: number, showDistanceInMiles: boolean, roundTo10 = false) { return showDistanceInMiles ? roundTo10 - ? Math.round((value * 1.60934) / 10.0) * 10 - : Math.round(value * 1.60934) - : value + ? Math.round((value / 1.60934) / 10.0) * 10 + : Math.round(value / 1.60934) + : Math.round(value) } export function meterToFt(value: number) { From 0ff5ff49f675efd701a5478a95f9b5ec32b26c5c Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 11 Jun 2023 16:18:07 +0200 Subject: [PATCH 261/322] formatting --- src/Converters.ts | 2 +- test/stores/TurnNavigationStore.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Converters.ts b/src/Converters.ts index 1bbba8ae..626144f7 100644 --- a/src/Converters.ts +++ b/src/Converters.ts @@ -17,7 +17,7 @@ const distanceFormat2 = new Intl.NumberFormat(navigator.language, { maximumFract export function kmToMPHIfMiles(value: number, showDistanceInMiles: boolean, roundTo10 = false) { return showDistanceInMiles ? roundTo10 - ? Math.round((value / 1.60934) / 10.0) * 10 + ? Math.round(value / 1.60934 / 10.0) * 10 : Math.round(value / 1.60934) : Math.round(value) } diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index 3bb4b219..aaf699d8 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -391,5 +391,5 @@ async function flushPromises() { } function setImmediatePolyfill(callback: any) { - return setTimeout(callback, 0); -} \ No newline at end of file + return setTimeout(callback, 0) +} From a473eb02567a573e5e4529551fcf176f7c2be1dc Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 11 Jun 2023 18:48:50 +0200 Subject: [PATCH 262/322] make two fonts and the arrow a bit larger --- src/layers/CurrentLocationLayer.tsx | 8 ++++---- src/turnNavigation/TurnNavigation.module.css | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/layers/CurrentLocationLayer.tsx b/src/layers/CurrentLocationLayer.tsx index a6b61c0f..d8a8fd10 100644 --- a/src/layers/CurrentLocationLayer.tsx +++ b/src/layers/CurrentLocationLayer.tsx @@ -43,10 +43,10 @@ export default function useCurrentLocationLayer(map: Map, turnNavigation: TurnNa // we need a filled version of navigation.svg const svgArrowData = - '' + - ' ' + - ' ' + - ' ' + + '' + + ' ' + + ' ' + + ' ' + '' function addCurrentLocation(map: Map, feature: Feature) { diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index c2e5b101..e7c2677d 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -4,8 +4,7 @@ margin-right: 1px; background-color: white; - font-size: smaller; - font-weight: bold; + font-size: larger; box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); border-bottom-right-radius: 0.5rem; @@ -28,6 +27,7 @@ } .instructionText { + font-size: larger; overflow: hidden; align-self: flex-start; flex-grow: 1; From c8ebfcf9b0853d49cbd3080bb048a86fff86d4ad Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 11 Jun 2023 18:55:41 +0200 Subject: [PATCH 263/322] more padding --- src/turnNavigation/TurnNavigation.module.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index e7c2677d..9406ab81 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -1,5 +1,5 @@ .turnSign { - padding: 15px 10px 10px 10px; + padding: 18px 12px 13px 12px; min-width: 70px; margin-right: 1px; background-color: white; @@ -91,7 +91,7 @@ z-index: 2; font-size: 20px; display: flex; - padding: 10px 3px 10px 12px /* left needs a bit more space -> rounded screens */; + padding: 14px 10px 16px 12px /* left needs a bit more space -> rounded screens */; } /* not all and (x) is the opposite of x */ From 97742c40f49b4c8407bc5f9c76557336e3b7d72b Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 19 Jun 2023 16:16:49 +0200 Subject: [PATCH 264/322] show debug info on click --- src/turnNavigation/TurnNavigation.module.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 9406ab81..af013c78 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -31,6 +31,7 @@ overflow: hidden; align-self: flex-start; flex-grow: 1; + pointer-events: visible; background-color: rgba(255, 255, 255, 1); box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); @@ -164,7 +165,6 @@ .debug { font-size: smaller; - float: right; } .fourthCol { From c9e32654094944ac34c65086dfe8cd45893684e0 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 19 Jun 2023 21:30:17 +0200 Subject: [PATCH 265/322] i18n update --- src/translation/tr.json | 101 +++++++++++++++++++++++++++++----------- 1 file changed, 74 insertions(+), 27 deletions(-) diff --git a/src/translation/tr.json b/src/translation/tr.json index cf7ab9c5..d8381b73 100644 --- a/src/translation/tr.json +++ b/src/translation/tr.json @@ -94,6 +94,7 @@ "reroute":"reroute", "start_navigation":"Navigation", "then":"then", +"thenSign":"Then", "turn_navigation_settings_title":"Turn-by-turn navigation", "vector_tiles_for_navigation":"Use vector tiles", "warning":"WARNING: The turn-by-turn navigation feature is highly experimental. Use it at your own risk, pay attention to the road and do not touch the device while driving!" @@ -194,6 +195,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -294,6 +296,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -394,6 +397,7 @@ "reroute":"", "start_navigation":"", "then":"sonra", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -494,6 +498,7 @@ "reroute":"", "start_navigation":"", "then":"след това", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"Внимание: Приложението е експериментално! Използвайте на свой риск!" @@ -594,6 +599,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -694,6 +700,7 @@ "reroute":"", "start_navigation":"", "then":"després", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -794,6 +801,7 @@ "reroute":"", "start_navigation":"Navigace", "then":"a poté", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"Použít vektorové dlaždice", "warning":"POZOR: Navigace je vysoce experimentální. Použití je na vlastní nebezpečí, soustřeďte se na řízení a věnujte pozornost dopravní situaci. Neovládejte přístroj za jízdy!" @@ -894,6 +902,7 @@ "reroute":"", "start_navigation":"", "then":"så", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -994,6 +1003,7 @@ "reroute":"Neue Route", "start_navigation":"Navigation", "then":"dann", +"thenSign":"Dann", "turn_navigation_settings_title":"Navigation", "vector_tiles_for_navigation":"Nutze Vector Tiles", "warning":"ACHTUNG: Die Navigation ist höchst experimentell. Verwenden Sie diese auf eigene Gefahr, achten Sie auf den Straßenverkehr und berühren Sie das Gerät nicht während der Fahrt!" @@ -1094,6 +1104,7 @@ "reroute":"", "start_navigation":"", "then":"τότε", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"ΠΡΟΣΟΧΗ: Αυτή η εφαρμογή είναι πειραματική! Χρησιμοποιήστε την με δική σας ευθύνη!" @@ -1194,6 +1205,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -1294,6 +1306,7 @@ "reroute":"", "start_navigation":"", "then":"luego", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -1394,6 +1407,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -1494,6 +1508,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -1594,6 +1609,7 @@ "reroute":"", "start_navigation":"", "then":"sen jälkeen", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"VAROITUS: Tämä sovellus on erittäin kokeellinen! Käytä omalla vastuullasi!" @@ -1694,6 +1710,7 @@ "reroute":"", "start_navigation":"Naviguer", "then":"ensuite", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"ATTENTION : Cette application est hautement expérimentale ! À utiliser à vos risques et périls !" @@ -1794,6 +1811,7 @@ "reroute":"", "start_navigation":"", "then":"ensuite", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -1894,6 +1912,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -1994,6 +2013,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -2094,6 +2114,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -2194,6 +2215,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -2209,11 +2231,11 @@ "way_contains":"Az útvonalon előfordul %1$s", "tracks":"burkolatlan földút", "steps":"lépcső", -"footways":"", -"steep_sections":"", -"private_sections":"", -"trunk_roads_warn":"", -"get_off_bike_for":"", +"footways":"gyalogút", +"steep_sections":"meredek szakasz", +"private_sections":"magánút", +"trunk_roads_warn":"Az útvonal potenciálisan veszélyes autóutat vagy forgalmasabbat is tartalmaz", +"get_off_bike_for":"A kerékpárt tolni kell ennyit: %1$s", "start_label":"Indulás", "intermediate_label":"Köztes célpont", "end_label":"Célpont", @@ -2227,16 +2249,16 @@ "add_to_route":"Hely hozzáadása", "delete_from_route":"Eltávolítás az útvonalról", "open_custom_model_box":"Egyedi modelldoboz megnyitása", -"draw_areas_enabled":"", +"draw_areas_enabled":"Területek rajzolása és módosítása a térképen", "help_custom_model":"Súgó", "apply_custom_model":"Alkalmazás", -"custom_model_enabled":"", -"settings":"", -"settings_close":"", +"custom_model_enabled":"Egyedi modell bekapcsolva", +"settings":"Beállítások", +"settings_close":"Bezárás", "exclude_motorway_example":"Autópálya nélkül", "limit_speed_example":"Sebességkorlátozás", -"cargo_bike_example":"", -"prefer_bike_network":"", +"cargo_bike_example":"Viszikli (teherkerékpár)", +"prefer_bike_network":"Kerékpárutak előnyben részesítése", "exclude_area_example":"Terület elkerülése", "combined_example":"Kombinált példa", "examples_custom_model":"Példák", @@ -2282,21 +2304,22 @@ "distance_unit":"Távolság mértékegysége: %1$s", "waiting_for_gps":"", "accept_risks_after_warning":"Megértettem és elfogadom", -"for_km":"", -"for_mi":"", -"full_screen_for_navigation":"", -"in_km_singular":"", -"in_km":"", -"in_m":"", -"in_mi_singular":"", -"in_mi":"", -"in_ft":"", -"reroute":"", -"start_navigation":"", -"then":"", -"turn_navigation_settings_title":"", -"vector_tiles_for_navigation":"", -"warning":"FIGYELEM! Ez az alkalmazás erősen kísérleti jellegű. Használat csak saját felelősségre!" +"for_km":"%1$s kilométert", +"for_mi":"%1$s mérföldet", +"full_screen_for_navigation":"Teljes képernyő bekapcsolása", +"in_km_singular":"1 kilométer múlva", +"in_km":"%1$s kilométer múlva", +"in_m":"%1$s méter múlva", +"in_mi_singular":"1 mérföld múlva", +"in_mi":"%1$s mérföld múlva", +"in_ft":"%1$s láb múlva", +"reroute":"újratervezés", +"start_navigation":"Navigáció", +"then":"majd", +"thenSign":"", +"turn_navigation_settings_title":"Részletes navigáció", +"vector_tiles_for_navigation":"Vektoros csempék használata", +"warning":"FIGYELEM! A részletes navigáció funkció erősen kísérleti jellegű. Csak saját felelősségre használja, figyeljen az útra és ne érintse meg a készüléket vezetés közben!" }, "in_ID":{ "total_ascend":"naik dengan jarak %1$s", @@ -2394,6 +2417,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -2491,9 +2515,10 @@ "in_mi_singular":"Tra 1 miglio", "in_mi":"Tra %1$s miglia", "in_ft":"Tra %1$s piedi", -"reroute":"", +"reroute":"Ricalcola", "start_navigation":"Naviga", "then":"poi", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"ATTENZIONE: Questa applicazione è ancora sperimentale! Utilizzala a tuo rischio e pericolo!" @@ -2594,6 +2619,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -2694,6 +2720,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -2794,6 +2821,7 @@ "reroute":"", "start_navigation":"навигация", "then":"одан соң ", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"Ескерту: бұрылыстан бұрылысқа навигация функциясы эксперименталды. Оны өз жауапкершілігіңізбен пайдаланыңыз, жолға назар аударыңыз және қозғалыс кезінде құрылғыға қол тигізбеңіз!" @@ -2894,6 +2922,7 @@ "reroute":"", "start_navigation":"", "then":"tada", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -2994,6 +3023,7 @@ "reroute":"", "start_navigation":"Start navigasjon", "then":"deretter", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"VARSEL: Denne appen er svært eksperimentell. Brukes på eget ansvar!" @@ -3094,6 +3124,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -3194,6 +3225,7 @@ "reroute":"", "start_navigation":"", "then":"dan", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -3294,6 +3326,7 @@ "reroute":"", "start_navigation":"Nawiguj", "then":", potem", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"OSTRZEŻENIE: Ta aplikacja jest wysoce eksperymentalna! Używaj na własne ryzyko!" @@ -3394,6 +3427,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -3494,6 +3528,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -3594,6 +3629,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -3694,6 +3730,7 @@ "reroute":"", "start_navigation":"", "then":"Затем", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -3794,6 +3831,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -3894,6 +3932,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -3994,6 +4033,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -4094,6 +4134,7 @@ "reroute":"", "start_navigation":"Navigera", "then":"sedan", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"VARNING: Sväng-för-sväng-navigeringen är mycket experimentell! Använd på egen risk!" @@ -4194,6 +4235,7 @@ "reroute":"", "start_navigation":"Başla", "then":"ardından", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -4294,6 +4336,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -4394,6 +4437,7 @@ "reroute":"", "start_navigation":"", "then":"Gần đó", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -4494,6 +4538,7 @@ "reroute":"", "start_navigation":"", "then":"然后", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"警告:该应用程序处于早期实验阶段,使用时风险自负!" @@ -4594,6 +4639,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" @@ -4694,6 +4740,7 @@ "reroute":"", "start_navigation":"", "then":"", +"thenSign":"", "turn_navigation_settings_title":"", "vector_tiles_for_navigation":"", "warning":"" From f0eb1c12ca301291b0edb86cb18c5afadabb0b3b Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 19 Jun 2023 21:35:01 +0200 Subject: [PATCH 266/322] show 'then' instruction sign --- src/stores/TurnNavigationStore.ts | 61 +++++++++++--------- src/turnNavigation/TurnNavigation.module.css | 25 ++++++-- src/turnNavigation/TurnNavigation.tsx | 13 ++++- 3 files changed, 64 insertions(+), 35 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index df046ec2..d4331971 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -55,6 +55,7 @@ export interface TurnNavigationStoreState { rerouteInProgress: boolean settings: TNSettingsState instruction: TNInstructionState + thenInstructionSign: number | null pathDetails: TNPathDetailsState } @@ -131,6 +132,7 @@ export default class TurnNavigationStore extends Store fullScreen: true, } as TNSettingsState, instruction: {} as TNInstructionState, + thenInstructionSign: null, pathDetails: {} as TNPathDetailsState, }) this.cs = cs @@ -231,12 +233,12 @@ export default class TurnNavigationStore extends Store const coordinate = action.coordinate let path = state.activePath - let instr = getCurrentInstruction(path.instructions, coordinate) + let instrInfo = getCurrentInstruction(path.instructions, coordinate) // skip waypoint if close to it and next is available (either activePath has via points or initialPath) let skipWaypoint = TurnNavigationStore.skipWaypoint( state.instruction.distanceToWaypoint, - TurnNavigationStore.getWaypoint(path, instr.nextWaypointIndex), + TurnNavigationStore.getWaypoint(path, instrInfo.nextWaypointIndex), state.coordinate, action.coordinate ) @@ -248,10 +250,10 @@ export default class TurnNavigationStore extends Store ) { // switch back to original path and skip the current waypoint path = state.initialPath - instr = getCurrentInstruction(path.instructions, coordinate) + instrInfo = getCurrentInstruction(path.instructions, coordinate) skipWaypoint = TurnNavigationStore.skipWaypoint( state.instruction.distanceToWaypoint, - TurnNavigationStore.getWaypoint(path, instr.nextWaypointIndex), + TurnNavigationStore.getWaypoint(path, instrInfo.nextWaypointIndex), state.coordinate, action.coordinate ) @@ -259,16 +261,16 @@ export default class TurnNavigationStore extends Store // the initialPath can contain more than 2 waypoints -> pick the next as destination for rerouting if (skipWaypoint) { - if (instr.nextWaypointIndex + 1 < path.snapped_waypoints.coordinates.length) instr.nextWaypointIndex++ + if (instrInfo.nextWaypointIndex + 1 < path.snapped_waypoints.coordinates.length) instrInfo.nextWaypointIndex++ else skipWaypoint = false // no reroute if end is reached } // reroute only if already in turn navigation mode otherwise UI is not ready - if (state.showUI && (skipWaypoint || this.shouldReroute(instr.distanceToRoute))) { + if (state.showUI && (skipWaypoint || this.shouldReroute(instrInfo.distanceToRoute))) { let queriedAPI = false if (state.activeProfile && !state.rerouteInProgress) { const nextWaypoints = path.snapped_waypoints.coordinates - .slice(instr.nextWaypointIndex) + .slice(instrInfo.nextWaypointIndex) .map(p => [p[0], p[1]] as [number, number]) if (nextWaypoints.length == 0) throw Error('rerouting needs a destination but was empty ' + JSON.stringify(path)) @@ -311,7 +313,7 @@ export default class TurnNavigationStore extends Store } } - if (instr.index < 0) { + if (instrInfo.index < 0) { console.error( 'Instruction cannot be determined. Current location too far away? ' + JSON.stringify(coordinate) ) @@ -325,9 +327,8 @@ export default class TurnNavigationStore extends Store path.details.road_class, ]) - const instructionState = state.instruction - const nextInstruction: Instruction = path.instructions[instr.index] - const text = nextInstruction.street_name + const instruction: Instruction = path.instructions[instrInfo.index] + const text = instruction.street_name // announce proportional earlier if faster const factor = estimatedAvgSpeed < 70 ? 2 : roadClass == 'trunk' || roadClass == 'motorway' ? 7 : 3 @@ -335,17 +336,15 @@ export default class TurnNavigationStore extends Store const lastAnnounceDistance = Math.max(30, 20 + factor * estimatedAvgSpeed) const firstAnnounceDistance = 1150 + factor * estimatedAvgSpeed - if (instr.index != instructionState.index) announcementsToDo = instr.distanceToTurn > 1000 ? 2 : 1 - - // const details = factor + ', avg-speed:' + estimatedAvgSpeed + ', announcements:' + announcementsToDo - // console.log('first:' + firstAnnounceDistance + ' last:' + lastAnnounceDistance + ', factor:' + details) + if (instrInfo.index != state.instruction.index) + announcementsToDo = instrInfo.distanceToTurn > 1000 ? 2 : 1 - if (instr.distanceToTurn <= lastAnnounceDistance && announcementsToDo > 0) { + if (instrInfo.distanceToTurn <= lastAnnounceDistance && announcementsToDo > 0) { announcementsToDo = 0 - this.synthesize(nextInstruction.text) + this.synthesize(instruction.text) } - const dist = instr.distanceToTurn + const dist = instrInfo.distanceToTurn if (dist <= firstAnnounceDistance && announcementsToDo == 2) { announcementsToDo = 1 if (dist > lastAnnounceDistance * 1.2 + 50) { @@ -355,7 +354,7 @@ export default class TurnNavigationStore extends Store dist > 1800 ? tr('in_mi', [meterToMiles(dist).toFixed(1)]) : tr('in_ft', ['' + Math.round(meterToFt(dist) / 100) * 100]) - this.synthesize(inString + ' ' + nextInstruction.text) + this.synthesize(inString + ' ' + instruction.text) } else { let inString = dist > 1200 @@ -363,11 +362,16 @@ export default class TurnNavigationStore extends Store : dist > 900 ? tr('in_km_singular') : tr('in_m', ['' + Math.floor(dist / 100) * 100]) - this.synthesize(inString + ' ' + nextInstruction.text) + this.synthesize(inString + ' ' + instruction.text) } } } + // if instruction after next instruction is too close show "then" instruction + let thenInstructionSign = null + if (instrInfo.index + 1 < path.instructions.length && instruction.distance < 200) + thenInstructionSign = path.instructions[instrInfo.index + 1].sign + return { ...state, showUI: true, @@ -375,16 +379,17 @@ export default class TurnNavigationStore extends Store speed: action.speed, coordinate: coordinate, instruction: { - index: instr.index, - distanceToTurn: instr.distanceToTurn, - timeToEnd: instr.timeToEnd, - distanceToEnd: instr.distanceToEnd, - nextWaypointIndex: instr.nextWaypointIndex, - distanceToWaypoint: instr.distanceToWaypoint, - sign: path.instructions[instr.index].sign, + index: instrInfo.index, + distanceToTurn: instrInfo.distanceToTurn, + timeToEnd: instrInfo.timeToEnd, + distanceToEnd: instrInfo.distanceToEnd, + nextWaypointIndex: instrInfo.nextWaypointIndex, + distanceToWaypoint: instrInfo.distanceToWaypoint, + sign: instruction.sign, announcementsToDo, text, }, + thenInstructionSign: thenInstructionSign, pathDetails: { estimatedAvgSpeed: Math.round(estimatedAvgSpeed), maxSpeed, surface, roadClass }, } } else if (action instanceof TurnNavigationRerouting) { @@ -453,7 +458,7 @@ export default class TurnNavigationStore extends Store } private synthesize(text: string) { - // console.log('speak: ' + text) + console.log('speak: ' + text) if (this.state.settings.soundEnabled) this.speechSynthesizer.synthesize(text) } diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index af013c78..cf434ef4 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -14,16 +14,31 @@ align-self: flex-start; } -.turnSign div:first-child { - padding-bottom: 7px; - min-height: 50px; +.turnSign .nextDistance { +} + +.turnSign .firstSign div:first-child { + min-height: 50px !important; } -.turnSign img { +.turnSign div > img { height: 55px; } -.turnSign .nextDistance { +.turnSign .thenDistance img { + padding-left: 5px; + height: 20px; +} + +.turnSign .thenDistance { + margin-top: 10px; + border-top: lightgray solid 1px; + padding-top: 10px; + font-size: smaller; + + display: flex; + flex-direction: row; + column-gap: 5px; } .instructionText { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index ed161450..3a760da6 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -12,13 +12,14 @@ import VolumeUpIcon from '@/turnNavigation/volume_up.svg' import VolumeOffIcon from '@/turnNavigation/volume_off.svg' import SyncLocationIcon from '@/turnNavigation/location_searching.svg' import { ShowDistanceInMilesContext } from '@/ShowDistanceInMilesContext' +import { tr } from '@/translation/Translation' export default function ({ turnNavigation }: { turnNavigation: TurnNavigationStoreState }) { if (turnNavigation.activePath == null) new Error('activePath cannot be null if TurnNavigation is enabled') const showDistanceInMiles = useContext(ShowDistanceInMilesContext) const instruction = turnNavigation.instruction const pd = turnNavigation.pathDetails - + const thenInstructionSign = turnNavigation.thenInstructionSign let [showTime, setShowTime] = useState(true) let [showDebug, setShowDebug] = useState(false) @@ -31,10 +32,18 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto <>
    -
    {getTurnSign(instruction.sign, instruction.index, instruction.nextWaypointIndex)}
    +
    + {getTurnSign(instruction.sign, instruction.index, instruction.nextWaypointIndex)} +
    {metersToText(instruction.distanceToTurn, showDistanceInMiles)}
    + {thenInstructionSign && ( +
    +
    {tr('thenSign')}
    +
    {getTurnSign(thenInstructionSign, instruction.index, instruction.nextWaypointIndex)}
    +
    + )}
    Date: Mon, 19 Jun 2023 22:17:08 +0200 Subject: [PATCH 267/322] formatting --- src/stores/TurnNavigationStore.ts | 6 +++--- src/turnNavigation/TurnNavigation.tsx | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index d4331971..75eaee6a 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -261,7 +261,8 @@ export default class TurnNavigationStore extends Store // the initialPath can contain more than 2 waypoints -> pick the next as destination for rerouting if (skipWaypoint) { - if (instrInfo.nextWaypointIndex + 1 < path.snapped_waypoints.coordinates.length) instrInfo.nextWaypointIndex++ + if (instrInfo.nextWaypointIndex + 1 < path.snapped_waypoints.coordinates.length) + instrInfo.nextWaypointIndex++ else skipWaypoint = false // no reroute if end is reached } @@ -336,8 +337,7 @@ export default class TurnNavigationStore extends Store const lastAnnounceDistance = Math.max(30, 20 + factor * estimatedAvgSpeed) const firstAnnounceDistance = 1150 + factor * estimatedAvgSpeed - if (instrInfo.index != state.instruction.index) - announcementsToDo = instrInfo.distanceToTurn > 1000 ? 2 : 1 + if (instrInfo.index != state.instruction.index) announcementsToDo = instrInfo.distanceToTurn > 1000 ? 2 : 1 if (instrInfo.distanceToTurn <= lastAnnounceDistance && announcementsToDo > 0) { announcementsToDo = 0 diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 3a760da6..5c5a6e3e 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -41,7 +41,9 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto {thenInstructionSign && (
    {tr('thenSign')}
    -
    {getTurnSign(thenInstructionSign, instruction.index, instruction.nextWaypointIndex)}
    +
    + {getTurnSign(thenInstructionSign, instruction.index, instruction.nextWaypointIndex)} +
    )}
    From 10c331277ef98586178a1705f6442f7bf7b2a14c Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 22 Jun 2023 18:01:01 +0200 Subject: [PATCH 268/322] current speed: minor css tweak --- src/turnNavigation/TurnNavigation.module.css | 17 +++++++++++++++-- src/turnNavigation/TurnNavigation.tsx | 15 ++++++++------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index cf434ef4..2c2b6ced 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -149,11 +149,24 @@ flex-grow: 1; display: flex; justify-content: center; + + gap: 15px; } .currentSpeed { - padding-top: 1px; - padding-right: 10px; + padding-top: 7px; + display: flex; + flex-direction: row; + align-items: baseline; + gap: 5px; +} + +.currentSpeed div:last-child { + font-size: smaller; +} + +.maxSpeed { + padding-top: 4px; } .secondCol { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 5c5a6e3e..013c57e8 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -97,21 +97,22 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
    - {currentSpeed} {showDistanceInMiles ? 'mph' : 'km/h'} +
    {currentSpeed}
    +
    {showDistanceInMiles ? 'mph' : 'km/h'}
    {pd.maxSpeed != null && - (ApiImpl.isMotorVehicle(turnNavigation.activeProfile) || pd.maxSpeed > 50) ? ( - + ApiImpl.isMotorVehicle(turnNavigation.activeProfile) ? ( + - + {kmToMPHIfMiles(pd.maxSpeed, showDistanceInMiles, true)} From 387bb1fb0e381dc96447cda1a9cffcb9bfc04c68 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 22 Jun 2023 18:11:49 +0200 Subject: [PATCH 269/322] larger font for next turn text --- src/turnNavigation/TurnNavigation.module.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/turnNavigation/TurnNavigation.module.css b/src/turnNavigation/TurnNavigation.module.css index 2c2b6ced..e462bfd3 100644 --- a/src/turnNavigation/TurnNavigation.module.css +++ b/src/turnNavigation/TurnNavigation.module.css @@ -4,7 +4,7 @@ margin-right: 1px; background-color: white; - font-size: larger; + font-size: x-large; box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); border-bottom-right-radius: 0.5rem; @@ -42,7 +42,7 @@ } .instructionText { - font-size: larger; + font-size: x-large; overflow: hidden; align-self: flex-start; flex-grow: 1; From 6523238693808aa248d62b340792f8234c2a704c Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 25 Jun 2023 12:59:18 +0200 Subject: [PATCH 270/322] thenInstr: minor bug fix --- src/turnNavigation/TurnNavigation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index 013c57e8..a935c0aa 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -38,7 +38,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
    {metersToText(instruction.distanceToTurn, showDistanceInMiles)}
    - {thenInstructionSign && ( + {thenInstructionSign != null && (
    {tr('thenSign')}
    From 12e88dd4d188489c7012f409b11da40b4271b49f Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 28 Jun 2023 09:56:22 +0200 Subject: [PATCH 271/322] added eruda --- src/index.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/index.html b/src/index.html index c655258f..0a65f83d 100644 --- a/src/index.html +++ b/src/index.html @@ -11,6 +11,14 @@ name="keywords" content="route planner,shortest path,maps,openstreetmap,android,navigation,routenplaner,gis" /> + Driving Directions - GraphHopper Maps From c6bf7d9a3883639f57d4ebcb878eb02fd0842cfc Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 28 Jun 2023 10:00:37 +0200 Subject: [PATCH 272/322] added maplibre for faster vector tiles --- package-lock.json | 708 +++++++++++++++++++++++++++++- package.json | 2 + src/layers/MapLibreLayer.ts | 91 ++++ src/layers/UseBackgroundLayer.tsx | 9 +- 4 files changed, 785 insertions(+), 25 deletions(-) create mode 100644 src/layers/MapLibreLayer.ts diff --git a/package-lock.json b/package-lock.json index cd58a8a8..7d8bd223 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "custom-model-editor": "github:graphhopper/custom-model-editor#3a46b6981d170b7eb70d621bbb92caed149e5a97", "geojson": "^0.5.0", "heightgraph": "github:easbar/Leaflet.Heightgraph#a1014641c35c43490b31cb25d3072e6c1237ed0e", + "maplibre-gl": "^3.1.0", "ol": "7.4.0", "ol-mapbox-style": "10.6.0", "react": "^18.2.0", @@ -2726,6 +2727,18 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "node_modules/@mapbox/geojson-rewind": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "dependencies": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + }, + "bin": { + "geojson-rewind": "geojson-rewind" + } + }, "node_modules/@mapbox/jsonlint-lines-primitives": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", @@ -2760,11 +2773,94 @@ "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" }, + "node_modules/@mapbox/tiny-sdf": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", + "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==" + }, "node_modules/@mapbox/unitbezier": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" }, + "node_modules/@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "dependencies": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "node_modules/@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@maplibre/maplibre-gl-style-spec": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-19.2.1.tgz", + "integrity": "sha512-ZVT5QlkVhlxlPav+ca0NO3Moc7EzbHDO2FXW4ic3Q0Vm+TDUw9I8A2EBws7xUUQZf7HQB3kQ+3Jsh5mFLRD4GQ==", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/unitbezier": "^0.0.1", + "@types/mapbox__point-geometry": "^0.1.2", + "json-stringify-pretty-compact": "^3.0.0", + "minimist": "^1.2.8", + "rw": "^1.3.3", + "sort-object": "^3.0.3" + }, + "bin": { + "gl-style-format": "dist/gl-style-format.mjs", + "gl-style-migrate": "dist/gl-style-migrate.mjs", + "gl-style-validate": "dist/gl-style-validate.mjs" + } + }, + "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" + }, + "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/json-stringify-pretty-compact": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz", + "integrity": "sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==" + }, + "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/sort-asc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz", + "integrity": "sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/sort-desc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.2.0.tgz", + "integrity": "sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/sort-object": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-3.0.3.tgz", + "integrity": "sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==", + "dependencies": { + "bytewise": "^1.1.0", + "get-value": "^2.0.2", + "is-extendable": "^0.1.1", + "sort-asc": "^0.2.0", + "sort-desc": "^0.2.0", + "union-value": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3236,8 +3332,7 @@ "node_modules/@types/geojson": { "version": "7946.0.10", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", - "dev": true + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" }, "node_modules/@types/graceful-fs": { "version": "4.1.6", @@ -3314,6 +3409,21 @@ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, + "node_modules/@types/mapbox__point-geometry": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.2.tgz", + "integrity": "sha512-D0lgCq+3VWV85ey1MZVkE8ZveyuvW5VAfuahVTQRpXFQTxw03SuIf1/K4UQ87MMIXVKzpFjXFiFMZzLj2kU+iA==" + }, + "node_modules/@types/mapbox__vector-tile": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.0.tgz", + "integrity": "sha512-kDwVreQO5V4c8yAxzZVQLE5tyWF+IPToAanloQaSnwfXmIcJ7cyOrv8z4Ft4y7PsLYmhWXmON8MBV8RX0Rgr8g==", + "dependencies": { + "@types/geojson": "*", + "@types/mapbox__point-geometry": "*", + "@types/pbf": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -3326,6 +3436,11 @@ "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", "dev": true }, + "node_modules/@types/pbf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.2.tgz", + "integrity": "sha512-EDrLIPaPXOZqDjrkzxxbX7UlJSeQVgah3i0aA4pOSzmK9zq3BIh7/MZIQxED7slJByvKM4Gc6Hypyu2lJzh3SQ==" + }, "node_modules/@types/prettier": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", @@ -3841,12 +3956,28 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4315,6 +4446,23 @@ "node": ">= 0.8" } }, + "node_modules/bytewise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", + "integrity": "sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==", + "dependencies": { + "bytewise-core": "^1.2.2", + "typewise": "^1.0.3" + } + }, + "node_modules/bytewise-core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", + "integrity": "sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==", + "dependencies": { + "typewise-core": "^1.2" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -6034,6 +6182,17 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -6325,6 +6484,11 @@ "node": ">= 0.10" } }, + "node_modules/geojson-vt": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", + "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" + }, "node_modules/geotiff": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.0.7.tgz", @@ -6379,7 +6543,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, "engines": { "node": ">=10" }, @@ -6387,12 +6550,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "dev": true }, + "node_modules/gl-matrix": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -6431,6 +6607,30 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -6902,8 +7102,7 @@ "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/internmap": { "version": "2.0.3", @@ -6976,6 +7175,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7040,7 +7247,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -7087,14 +7293,12 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8944,11 +9148,15 @@ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" }, + "node_modules/kdbush": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9108,6 +9316,49 @@ "resolved": "https://registry.npmjs.org/mapbox-to-css-font/-/mapbox-to-css-font-2.4.2.tgz", "integrity": "sha512-f+NBjJJY4T3dHtlEz1wCG7YFlkODEjFIYlxDdLIDMNpkSksqTt+l/d4rjuwItxuzkuMFvPyrjzV2lxRM4ePcIA==" }, + "node_modules/maplibre-gl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-3.1.0.tgz", + "integrity": "sha512-KFarVUUszCEucPwnGsFJtPMQBg/F6lg+SPDmTztKUD/n0YShETjIOdNmm5jpxacEX3+dq50MzlqDr6VH+RtDDA==", + "dependencies": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^2.0.6", + "@mapbox/unitbezier": "^0.0.1", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "@maplibre/maplibre-gl-style-spec": "^19.2.1", + "@types/geojson": "^7946.0.10", + "@types/mapbox__point-geometry": "^0.1.2", + "@types/mapbox__vector-tile": "^1.3.0", + "@types/pbf": "^3.0.2", + "earcut": "^2.2.4", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.4.3", + "global-prefix": "^3.0.0", + "kdbush": "^4.0.2", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^2.0.0", + "quickselect": "^2.0.0", + "supercluster": "^8.0.1", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.3" + }, + "engines": { + "node": ">=16.14.0", + "npm": ">=8.1.0" + }, + "funding": { + "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" + } + }, + "node_modules/maplibre-gl/node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" + }, "node_modules/matchmediaquery": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", @@ -9291,6 +9542,11 @@ "multicast-dns": "cli.js" } }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" + }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -9989,6 +10245,11 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/potpack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz", + "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" + }, "node_modules/prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", @@ -10902,6 +11163,20 @@ "node": ">= 0.8.0" } }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -11237,6 +11512,40 @@ "wbuf": "^1.7.3" } }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -11367,6 +11676,14 @@ "webpack": "^5.0.0" } }, + "node_modules/supercluster": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "dependencies": { + "kdbush": "^4.0.2" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -11698,6 +12015,11 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "node_modules/tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -12036,6 +12358,19 @@ "node": ">=14.17" } }, + "node_modules/typewise": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", + "integrity": "sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==", + "dependencies": { + "typewise-core": "^1.2.0" + } + }, + "node_modules/typewise-core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", + "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==" + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -12076,6 +12411,20 @@ "node": ">=4" } }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -12196,6 +12545,16 @@ "node": ">= 0.8" } }, + "node_modules/vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "dependencies": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -14696,6 +15055,15 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "@mapbox/geojson-rewind": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "requires": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + } + }, "@mapbox/jsonlint-lines-primitives": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", @@ -14721,11 +15089,79 @@ "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" }, + "@mapbox/tiny-sdf": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", + "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==" + }, "@mapbox/unitbezier": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" }, + "@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "requires": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" + }, + "@maplibre/maplibre-gl-style-spec": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-19.2.1.tgz", + "integrity": "sha512-ZVT5QlkVhlxlPav+ca0NO3Moc7EzbHDO2FXW4ic3Q0Vm+TDUw9I8A2EBws7xUUQZf7HQB3kQ+3Jsh5mFLRD4GQ==", + "requires": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/unitbezier": "^0.0.1", + "@types/mapbox__point-geometry": "^0.1.2", + "json-stringify-pretty-compact": "^3.0.0", + "minimist": "^1.2.8", + "rw": "^1.3.3", + "sort-object": "^3.0.3" + }, + "dependencies": { + "@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" + }, + "json-stringify-pretty-compact": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz", + "integrity": "sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==" + }, + "sort-asc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz", + "integrity": "sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==" + }, + "sort-desc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.2.0.tgz", + "integrity": "sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==" + }, + "sort-object": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-3.0.3.tgz", + "integrity": "sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==", + "requires": { + "bytewise": "^1.1.0", + "get-value": "^2.0.2", + "is-extendable": "^0.1.1", + "sort-asc": "^0.2.0", + "sort-desc": "^0.2.0", + "union-value": "^1.0.1" + } + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -15059,8 +15495,7 @@ "@types/geojson": { "version": "7946.0.10", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", - "dev": true + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" }, "@types/graceful-fs": { "version": "4.1.6", @@ -15137,6 +15572,21 @@ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, + "@types/mapbox__point-geometry": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.2.tgz", + "integrity": "sha512-D0lgCq+3VWV85ey1MZVkE8ZveyuvW5VAfuahVTQRpXFQTxw03SuIf1/K4UQ87MMIXVKzpFjXFiFMZzLj2kU+iA==" + }, + "@types/mapbox__vector-tile": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.0.tgz", + "integrity": "sha512-kDwVreQO5V4c8yAxzZVQLE5tyWF+IPToAanloQaSnwfXmIcJ7cyOrv8z4Ft4y7PsLYmhWXmON8MBV8RX0Rgr8g==", + "requires": { + "@types/geojson": "*", + "@types/mapbox__point-geometry": "*", + "@types/pbf": "*" + } + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -15149,6 +15599,11 @@ "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", "dev": true }, + "@types/pbf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.2.tgz", + "integrity": "sha512-EDrLIPaPXOZqDjrkzxxbX7UlJSeQVgah3i0aA4pOSzmK9zq3BIh7/MZIQxED7slJByvKM4Gc6Hypyu2lJzh3SQ==" + }, "@types/prettier": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", @@ -15588,12 +16043,22 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==" + }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -15939,6 +16404,23 @@ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true }, + "bytewise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", + "integrity": "sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==", + "requires": { + "bytewise-core": "^1.2.2", + "typewise": "^1.0.3" + } + }, + "bytewise-core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", + "integrity": "sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==", + "requires": { + "typewise-core": "^1.2" + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -17233,6 +17715,14 @@ } } }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "requires": { + "is-extendable": "^0.1.0" + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -17459,6 +17949,11 @@ "resolved": "https://registry.npmjs.org/geojson/-/geojson-0.5.0.tgz", "integrity": "sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ==" }, + "geojson-vt": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", + "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" + }, "geotiff": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.0.7.tgz", @@ -17500,8 +17995,12 @@ "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==" }, "github-from-package": { "version": "0.0.0", @@ -17509,6 +18008,11 @@ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "dev": true }, + "gl-matrix": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -17538,6 +18042,26 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -17883,8 +18407,7 @@ "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "internmap": { "version": "2.0.3", @@ -17933,6 +18456,11 @@ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -17976,7 +18504,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "requires": { "isobject": "^3.0.1" } @@ -18011,14 +18538,12 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" }, "istanbul-lib-coverage": { "version": "3.2.0", @@ -19391,11 +19916,15 @@ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" }, + "kdbush": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==" + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "kleur": { "version": "3.0.3", @@ -19528,6 +20057,44 @@ "resolved": "https://registry.npmjs.org/mapbox-to-css-font/-/mapbox-to-css-font-2.4.2.tgz", "integrity": "sha512-f+NBjJJY4T3dHtlEz1wCG7YFlkODEjFIYlxDdLIDMNpkSksqTt+l/d4rjuwItxuzkuMFvPyrjzV2lxRM4ePcIA==" }, + "maplibre-gl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-3.1.0.tgz", + "integrity": "sha512-KFarVUUszCEucPwnGsFJtPMQBg/F6lg+SPDmTztKUD/n0YShETjIOdNmm5jpxacEX3+dq50MzlqDr6VH+RtDDA==", + "requires": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^2.0.6", + "@mapbox/unitbezier": "^0.0.1", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "@maplibre/maplibre-gl-style-spec": "^19.2.1", + "@types/geojson": "^7946.0.10", + "@types/mapbox__point-geometry": "^0.1.2", + "@types/mapbox__vector-tile": "^1.3.0", + "@types/pbf": "^3.0.2", + "earcut": "^2.2.4", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.4.3", + "global-prefix": "^3.0.0", + "kdbush": "^4.0.2", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^2.0.0", + "quickselect": "^2.0.0", + "supercluster": "^8.0.1", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.3" + }, + "dependencies": { + "@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" + } + } + }, "matchmediaquery": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", @@ -19666,6 +20233,11 @@ "thunky": "^1.0.2" } }, + "murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" + }, "nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -20180,6 +20752,11 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "potpack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz", + "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" + }, "prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", @@ -20885,6 +21462,17 @@ "send": "0.18.0" } }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -21131,6 +21719,33 @@ "wbuf": "^1.7.3" } }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -21224,6 +21839,14 @@ "dev": true, "requires": {} }, + "supercluster": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "requires": { + "kdbush": "^4.0.2" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -21466,6 +22089,11 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -21695,6 +22323,19 @@ "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", "dev": true }, + "typewise": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", + "integrity": "sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==", + "requires": { + "typewise-core": "^1.2.0" + } + }, + "typewise-core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", + "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==" + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -21723,6 +22364,17 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, "universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -21805,6 +22457,16 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, + "vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "requires": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, "w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", diff --git a/package.json b/package.json index bd623a5a..2cbd3ccd 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,8 @@ "test": "jest" }, "dependencies": { + "maplibre-gl": "^3.1.0", + "custom-model-editor": "github:graphhopper/custom-model-editor#3a46b6981d170b7eb70d621bbb92caed149e5a97", "geojson": "^0.5.0", "heightgraph": "github:easbar/Leaflet.Heightgraph#a1014641c35c43490b31cb25d3072e6c1237ed0e", diff --git a/src/layers/MapLibreLayer.ts b/src/layers/MapLibreLayer.ts new file mode 100644 index 00000000..a4da9bd8 --- /dev/null +++ b/src/layers/MapLibreLayer.ts @@ -0,0 +1,91 @@ +// BSD 3-Clause License +// +// Copyright (c) 2019-present, camptocamp SA +// All rights reserved. +// +// See https://github.com/geoblocks/ol-maplibre-layer + +import Layer from 'ol/layer/Layer.js'; +import {toDegrees} from 'ol/math.js'; +import {toLonLat} from 'ol/proj.js'; + +import maplibregl from 'maplibre-gl'; +import type {FrameState} from 'ol/Map.js'; +import RenderEvent from "ol/render/Event"; +import _default from "ol/MapEventType"; +import POSTRENDER = _default.POSTRENDER; + +export default class MapLibreLayer extends Layer { + maplibreMap: maplibregl.Map; + + constructor(style: string) { + super({}) + const container = document.createElement('div'); + container.style.position = 'absolute'; + container.style.width = '100%'; + container.style.height = '100%'; + + this.maplibreMap = new maplibregl.Map( + Object.assign({}, {style: style}, { + container: container, + attributionControl: false, + interactive: false, + trackResize: false, + }) + ); + + this.applyOpacity_(); + } + + override disposeInternal() { + this.maplibreMap.remove(); + super.disposeInternal(); + } + + override setOpacity(opacity: number) { + super.setOpacity(opacity); + this.applyOpacity_(); + } + + private applyOpacity_() { + const canvas = this.maplibreMap.getCanvas(); + const opacity = this.getOpacity().toString(); + if (opacity !== canvas.style.opacity) { + canvas.style.opacity = opacity; + } + } + + override render(frameState: FrameState): HTMLElement { + const viewState = frameState.viewState; + + // adjust view parameters in maplibre + this.maplibreMap.jumpTo({ + center: toLonLat(viewState.center) as [number, number], + zoom: viewState.zoom - 1, + bearing: toDegrees(-viewState.rotation), + }); + + const maplibreCanvas = this.maplibreMap.getCanvas(); + if (!maplibreCanvas.isConnected) { + // The canvas is not connected to the DOM, request a map rendering at the next animation frame + // to set the canvas size. + this.getMapInternal()!.render(); + } else if (!sameSize(maplibreCanvas, frameState)) { + this.maplibreMap.resize(); + } + + this.maplibreMap.redraw(); + + // const layer = this.getLayer() + this.dispatchEvent(new RenderEvent(POSTRENDER, undefined, frameState, undefined)) + + return this.maplibreMap.getContainer(); + } +} + +function sameSize(canvas: HTMLCanvasElement, frameState: FrameState): boolean { + return ( + canvas.width === Math.floor(frameState.size[0] * frameState.pixelRatio) && + canvas.height === Math.floor(frameState.size[1] * frameState.pixelRatio) + ); +} diff --git a/src/layers/UseBackgroundLayer.tsx b/src/layers/UseBackgroundLayer.tsx index 037db4ac..d59c3da9 100644 --- a/src/layers/UseBackgroundLayer.tsx +++ b/src/layers/UseBackgroundLayer.tsx @@ -4,6 +4,7 @@ import { RasterStyle, StyleOption } from '@/stores/MapOptionsStore' import TileLayer from 'ol/layer/Tile' import { XYZ } from 'ol/source' import { apply } from 'ol-mapbox-style' +import MapLibreLayer from "@/layers/MapLibreLayer"; export default function useBackgroundLayer(map: Map, styleOption: StyleOption) { useEffect(() => { @@ -22,7 +23,7 @@ export function getCurrentBackgroundLayers(map: Map) { .getArray() .filter(l => { // vector layers added via olms#addLayers have the mapbox-source key - return l.get('mapbox-source') || l.get('background-raster-layer') + return l.get('mapbox-source') || l.get('background-maplibre-layer') || l.get('background-raster-layer') }) } @@ -33,7 +34,11 @@ function removeCurrentBackgroundLayers(map: Map) { function addNewBackgroundLayers(map: Map, styleOption: StyleOption) { if (styleOption.type === 'vector') { // todo: handle promise return value? - apply(map, styleOption.url) + // apply(map, styleOption.url) + + const vectorLayer = new MapLibreLayer(styleOption.url as string); + vectorLayer.set('background-maplibre-layer', true) + map.addLayer(vectorLayer); } else { const rasterStyle = styleOption as RasterStyle const tileLayer = new TileLayer({ From 80dfe20352b8ecdcebaab6c290e3eccf9b227ba4 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 28 Jun 2023 10:11:00 +0200 Subject: [PATCH 273/322] smoother location update now possible --- src/stores/MapActionReceiver.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index d6b6476e..e74a9ef8 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -78,9 +78,10 @@ export default class MapActionReceiver implements ActionReceiver { zoom: action.zoom, center: center, easing: linear, - // We could use 1000ms or more but map tiles won't update probably due to missing updateWhileAnimating. - // For now, due to performance reasons, we set this to true only for the layer. - duration: 800, + // Create a smooth animation that lasts at least 1000ms (as location updates come in every 1s). + // This was 800 as with normal vector tiles we had performance problems while rerouting. + // The new route did not show up likely because FPS is in that case too low. + duration: 1050, } if (!Number.isNaN(action.heading) && action.speed > 0) { From 822c88653c3741fd84bbbed588729201fd277757 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 28 Jun 2023 12:11:38 +0200 Subject: [PATCH 274/322] try speed-dependent zoom to get closer to roads for e.g. walking --- src/actions/Actions.ts | 4 +-- src/stores/MapActionReceiver.ts | 4 ++- src/stores/TurnNavigationStore.ts | 2 +- test/stores/TurnNavigationStore.test.ts | 36 ++++++++++++------------- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/actions/Actions.ts b/src/actions/Actions.ts index 47120ea7..35dedf72 100644 --- a/src/actions/Actions.ts +++ b/src/actions/Actions.ts @@ -28,15 +28,13 @@ export class LocationUpdate implements Action { readonly coordinate: Coordinate readonly speed: number // in meter/sec readonly heading: number - readonly zoom: number readonly syncView: boolean - constructor(coordinate: Coordinate, syncView: boolean, speed: number, heading: number, zoom: number) { + constructor(coordinate: Coordinate, syncView: boolean, speed: number, heading: number) { this.coordinate = coordinate this.speed = speed this.syncView = syncView this.heading = heading - this.zoom = zoom } } diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index e74a9ef8..782a3526 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -49,6 +49,7 @@ export default class MapActionReceiver implements ActionReceiver { // reset padding this.map.getView().padding = [0, 0, 0, 0] this.map.getView().animate({ rotation: 0, zoom: 14, duration: 600 }) + this.map.getView().setConstrainResolution(true) this.map.un('pointerdrag', this.onMove) // this.map.getView().un('change:resolution', this.onMove) } else if (action instanceof TurnNavigationStart) { @@ -62,6 +63,7 @@ export default class MapActionReceiver implements ActionReceiver { } if (this.zoomCtrl) arr.remove(this.zoomCtrl) if (this.attributionCtrl) arr.remove(this.attributionCtrl) + this.map.getView().setConstrainResolution(false) this.map.on('pointerdrag', this.onMove) // disable auto moving&zooming the map if *moving* the map // TODO this interferes with zooming from inside the application // this.map.getView().on('change:resolution', this.onMove) // disable auto moving&zooming the map if *zooming* the map @@ -75,7 +77,7 @@ export default class MapActionReceiver implements ActionReceiver { const center = fromLonLat([action.coordinate.lng, action.coordinate.lat]) if (action.syncView) { const args: AnimationOptions = { - zoom: action.zoom, + zoom: action.speed < 8 ? (action.speed < 4 ? 18 : 17.5 ) : 17, center: center, easing: linear, // Create a smooth animation that lasts at least 1000ms (as location updates come in every 1s). diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 75eaee6a..0965d726 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -614,7 +614,7 @@ export default class TurnNavigationStore extends Store private locationUpdate(pos: any) { let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } Dispatcher.dispatch( - new LocationUpdate(c, this.state.settings.syncView, pos.coords.speed, pos.coords.heading, 17) + new LocationUpdate(c, this.state.settings.syncView, pos.coords.speed, pos.coords.heading) ) } diff --git a/test/stores/TurnNavigationStore.test.ts b/test/stores/TurnNavigationStore.test.ts index aaf699d8..361d55a4 100644 --- a/test/stores/TurnNavigationStore.test.ts +++ b/test/stores/TurnNavigationStore.test.ts @@ -121,7 +121,7 @@ describe('TurnNavigationStore', () => { const speech = new DummySpeech() const store = createStore(api, speech) Dispatcher.dispatch(new SetSelectedPath(reroute1.paths[0])) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.268908, lat: 51.434871 }, true, 10, 120, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.268908, lat: 51.434871 }, true, 10, 120)) expect(store.state.speed).toEqual(10) expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) @@ -129,12 +129,12 @@ describe('TurnNavigationStore', () => { Dispatcher.dispatch(new TurnNavigationSettingsUpdate({ soundEnabled: true } as TNSettingsState)) // no rerouting without profile - Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, true, 12, 120, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, true, 12, 120)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeFalsy() Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.267238, lat: 51.43475 }, true, 12, 120, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.267238, lat: 51.43475 }, true, 12, 120)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() await flushPromises() @@ -145,7 +145,7 @@ describe('TurnNavigationStore', () => { expect(store.state.instruction.index).toEqual(1) // avoid too frequent rerouting - Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, true, 10, 120, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, true, 10, 120)) expect(store.state.speed).toEqual(10) expect(store.state.rerouteInProgress).toBeFalsy() @@ -154,7 +154,7 @@ describe('TurnNavigationStore', () => { [14.267240000000001, 51.43253000000001], ]) Dispatcher.dispatch(new TurnNavigationReroutingTimeResetForTest()) // skip waiting 10 seconds - Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, true, 12, 120, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266328, lat: 51.434653 }, true, 12, 120)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() await flushPromises() @@ -169,13 +169,13 @@ describe('TurnNavigationStore', () => { const store = createStore(new LocalApi().setRerouteData(reroute1, rerouteWaypoints)) Dispatcher.dispatch(new SetSelectedPath(routeWithVia.paths[0])) Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.266959, lat: 51.435051 }, true, 10, 120, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.266959, lat: 51.435051 }, true, 10, 120)) expect(store.state.speed).toEqual(10) expect(store.state.instruction.index).toEqual(1) expect(store.state.activePath).toEqual(routeWithVia.paths[0]) // close to via point it should force rerouting to avoid potential interferences with overlapping edges - Dispatcher.dispatch(new LocationUpdate({ lng: 14.269289, lat: 51.434764 }, true, 12, 70, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.269289, lat: 51.434764 }, true, 12, 70)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() @@ -194,15 +194,15 @@ describe('TurnNavigationStore', () => { const store = createStore(new LocalApi().setRerouteData(reroute1, rerouteWaypoints)) Dispatcher.dispatch(new SetSelectedPath(routeWithSimpleVia.paths[0])) Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.2727, lat: 51.436269 }, true, 10, 120, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.2727, lat: 51.436269 }, true, 10, 120)) expect(store.state.activePath).toEqual(routeWithSimpleVia.paths[0]) // close to middle waypoint but not within 50m - Dispatcher.dispatch(new LocationUpdate({ lng: 14.27109, lat: 51.435472 }, true, 12, 70, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.27109, lat: 51.435472 }, true, 12, 70)) expect(store.state.speed).toEqual(12) // close to middle waypoint but again not within 50m but still rerouting as skipWaypoint was true - Dispatcher.dispatch(new LocationUpdate({ lng: 14.271099, lat: 51.435433 }, true, 14, 70, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.271099, lat: 51.435433 }, true, 14, 70)) expect(store.state.speed).toEqual(14) expect(store.state.rerouteInProgress).toBeTruthy() @@ -226,12 +226,12 @@ describe('TurnNavigationStore', () => { Dispatcher.dispatch(new SetSelectedPath(routeWithSimpleVia.paths[0])) Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) Dispatcher.dispatch(new TurnNavigationSettingsUpdate({ soundEnabled: true } as TNSettingsState)) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.2727, lat: 51.436269 }, true, 10, 120, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.2727, lat: 51.436269 }, true, 10, 120)) expect(store.state.activePath).toEqual(routeWithSimpleVia.paths[0]) expect(speech.getTexts()).toEqual(['Turn right onto Franz-Liszt-Straße']) // force reroute - Dispatcher.dispatch(new LocationUpdate({ lng: 14.273946, lat: 51.436422 }, true, 12, 70, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.273946, lat: 51.436422 }, true, 12, 70)) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() await flushPromises() @@ -244,7 +244,7 @@ describe('TurnNavigationStore', () => { [14.267240000000001, 51.43253000000001], ] as [number, number][] api.setRerouteData(reroute1, newWaypoints) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.270589, lat: 51.435272 }, true, 16, 70, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.270589, lat: 51.435272 }, true, 16, 70)) expect(store.state.speed).toEqual(16) expect(store.state.rerouteInProgress).toBeTruthy() @@ -266,14 +266,14 @@ describe('TurnNavigationStore', () => { Dispatcher.dispatch(new SetCustomModel(customModelStr, false)) Dispatcher.dispatch(new SetCustomModelEnabled(true)) Dispatcher.dispatch(new SetSelectedPath(reroute1.paths[0])) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.268908, lat: 51.434871 }, true, 10, 120, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.268908, lat: 51.434871 }, true, 10, 120)) expect(store.state.customModelStr).toEqual(customModelStr) expect(store.state.speed).toEqual(10) expect(store.state.activePath).toEqual(reroute1.paths[0]) expect(store.state.instruction.index).toEqual(1) Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.267238, lat: 51.43475 }, true, 12, 120, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.267238, lat: 51.43475 }, true, 12, 120)) expect(store.state.customModelStr).toEqual(customModelStr) expect(store.state.speed).toEqual(12) expect(store.state.rerouteInProgress).toBeTruthy() @@ -292,14 +292,14 @@ describe('TurnNavigationStore', () => { Dispatcher.dispatch(new SetVehicleProfile({ name: 'car' })) Dispatcher.dispatch(new SetSelectedPath(announceBug.paths[0])) Dispatcher.dispatch(new TurnNavigationSettingsUpdate({ soundEnabled: true } as TNSettingsState)) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.191677, lat: 51.432878 }, true, 16, 70, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.191677, lat: 51.432878 }, true, 16, 70)) expect(store.state.activePath).toEqual(announceBug.paths[0]) api.setRerouteData(announceBugReroute, [ [14.190732, 51.431834], [14.193150000000001, 51.43121000000001], ]) - Dispatcher.dispatch(new LocationUpdate({ lng: 14.190732, lat: 51.431834 }, true, 10, 120, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.190732, lat: 51.431834 }, true, 10, 120)) expect(store.state.rerouteInProgress).toBeTruthy() await flushPromises() expect(store.state.rerouteInProgress).toBeFalsy() @@ -307,7 +307,7 @@ describe('TurnNavigationStore', () => { expect(store.state.instruction.index).toEqual(1) // the first LocationUpdate was "used" to force the re-routing -> we need another LocationUpdate - Dispatcher.dispatch(new LocationUpdate({ lng: 14.190732, lat: 51.431834 }, true, 10, 120, 16)) + Dispatcher.dispatch(new LocationUpdate({ lng: 14.190732, lat: 51.431834 }, true, 10, 120)) expect(speech.getTexts()).toEqual(['Links halten', 'reroute', 'Scharf links abbiegen']) }) From 63ad885ea89094597a0af5852dc5a8e94314138b Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 28 Jun 2023 12:12:20 +0200 Subject: [PATCH 275/322] formatting --- src/index.html | 10 +- src/layers/MapLibreLayer.ts | 148 +++++++++++++------------- src/layers/UseBackgroundLayer.tsx | 6 +- src/stores/MapActionReceiver.ts | 2 +- src/stores/TurnNavigationStore.ts | 4 +- src/turnNavigation/TurnNavigation.tsx | 3 +- 6 files changed, 87 insertions(+), 86 deletions(-) diff --git a/src/index.html b/src/index.html index 0a65f83d..fb9fdd70 100644 --- a/src/index.html +++ b/src/index.html @@ -13,11 +13,11 @@ /> diff --git a/src/layers/MapLibreLayer.ts b/src/layers/MapLibreLayer.ts index a4da9bd8..b98a8fd4 100644 --- a/src/layers/MapLibreLayer.ts +++ b/src/layers/MapLibreLayer.ts @@ -5,87 +5,91 @@ // // See https://github.com/geoblocks/ol-maplibre-layer -import Layer from 'ol/layer/Layer.js'; -import {toDegrees} from 'ol/math.js'; -import {toLonLat} from 'ol/proj.js'; +import Layer from 'ol/layer/Layer.js' +import { toDegrees } from 'ol/math.js' +import { toLonLat } from 'ol/proj.js' -import maplibregl from 'maplibre-gl'; -import type {FrameState} from 'ol/Map.js'; -import RenderEvent from "ol/render/Event"; -import _default from "ol/MapEventType"; -import POSTRENDER = _default.POSTRENDER; +import maplibregl from 'maplibre-gl' +import type { FrameState } from 'ol/Map.js' +import RenderEvent from 'ol/render/Event' +import _default from 'ol/MapEventType' +import POSTRENDER = _default.POSTRENDER export default class MapLibreLayer extends Layer { - maplibreMap: maplibregl.Map; - - constructor(style: string) { - super({}) - const container = document.createElement('div'); - container.style.position = 'absolute'; - container.style.width = '100%'; - container.style.height = '100%'; - - this.maplibreMap = new maplibregl.Map( - Object.assign({}, {style: style}, { - container: container, - attributionControl: false, - interactive: false, - trackResize: false, - }) - ); - - this.applyOpacity_(); - } - - override disposeInternal() { - this.maplibreMap.remove(); - super.disposeInternal(); - } - - override setOpacity(opacity: number) { - super.setOpacity(opacity); - this.applyOpacity_(); - } - - private applyOpacity_() { - const canvas = this.maplibreMap.getCanvas(); - const opacity = this.getOpacity().toString(); - if (opacity !== canvas.style.opacity) { - canvas.style.opacity = opacity; + maplibreMap: maplibregl.Map + + constructor(style: string) { + super({}) + const container = document.createElement('div') + container.style.position = 'absolute' + container.style.width = '100%' + container.style.height = '100%' + + this.maplibreMap = new maplibregl.Map( + Object.assign( + {}, + { style: style }, + { + container: container, + attributionControl: false, + interactive: false, + trackResize: false, + } + ) + ) + + this.applyOpacity_() } - } - - override render(frameState: FrameState): HTMLElement { - const viewState = frameState.viewState; - - // adjust view parameters in maplibre - this.maplibreMap.jumpTo({ - center: toLonLat(viewState.center) as [number, number], - zoom: viewState.zoom - 1, - bearing: toDegrees(-viewState.rotation), - }); - - const maplibreCanvas = this.maplibreMap.getCanvas(); - if (!maplibreCanvas.isConnected) { - // The canvas is not connected to the DOM, request a map rendering at the next animation frame - // to set the canvas size. - this.getMapInternal()!.render(); - } else if (!sameSize(maplibreCanvas, frameState)) { - this.maplibreMap.resize(); + + override disposeInternal() { + this.maplibreMap.remove() + super.disposeInternal() + } + + override setOpacity(opacity: number) { + super.setOpacity(opacity) + this.applyOpacity_() + } + + private applyOpacity_() { + const canvas = this.maplibreMap.getCanvas() + const opacity = this.getOpacity().toString() + if (opacity !== canvas.style.opacity) { + canvas.style.opacity = opacity + } } - this.maplibreMap.redraw(); + override render(frameState: FrameState): HTMLElement { + const viewState = frameState.viewState - // const layer = this.getLayer() - this.dispatchEvent(new RenderEvent(POSTRENDER, undefined, frameState, undefined)) + // adjust view parameters in maplibre + this.maplibreMap.jumpTo({ + center: toLonLat(viewState.center) as [number, number], + zoom: viewState.zoom - 1, + bearing: toDegrees(-viewState.rotation), + }) - return this.maplibreMap.getContainer(); - } + const maplibreCanvas = this.maplibreMap.getCanvas() + if (!maplibreCanvas.isConnected) { + // The canvas is not connected to the DOM, request a map rendering at the next animation frame + // to set the canvas size. + this.getMapInternal()!.render() + } else if (!sameSize(maplibreCanvas, frameState)) { + this.maplibreMap.resize() + } + + this.maplibreMap.redraw() + + // const layer = this.getLayer() + this.dispatchEvent(new RenderEvent(POSTRENDER, undefined, frameState, undefined)) + + return this.maplibreMap.getContainer() + } } function sameSize(canvas: HTMLCanvasElement, frameState: FrameState): boolean { - return ( - canvas.width === Math.floor(frameState.size[0] * frameState.pixelRatio) && - canvas.height === Math.floor(frameState.size[1] * frameState.pixelRatio) - ); + return ( + canvas.width === Math.floor(frameState.size[0] * frameState.pixelRatio) && + canvas.height === Math.floor(frameState.size[1] * frameState.pixelRatio) + ) } diff --git a/src/layers/UseBackgroundLayer.tsx b/src/layers/UseBackgroundLayer.tsx index d59c3da9..f661e9c9 100644 --- a/src/layers/UseBackgroundLayer.tsx +++ b/src/layers/UseBackgroundLayer.tsx @@ -4,7 +4,7 @@ import { RasterStyle, StyleOption } from '@/stores/MapOptionsStore' import TileLayer from 'ol/layer/Tile' import { XYZ } from 'ol/source' import { apply } from 'ol-mapbox-style' -import MapLibreLayer from "@/layers/MapLibreLayer"; +import MapLibreLayer from '@/layers/MapLibreLayer' export default function useBackgroundLayer(map: Map, styleOption: StyleOption) { useEffect(() => { @@ -36,9 +36,9 @@ function addNewBackgroundLayers(map: Map, styleOption: StyleOption) { // todo: handle promise return value? // apply(map, styleOption.url) - const vectorLayer = new MapLibreLayer(styleOption.url as string); + const vectorLayer = new MapLibreLayer(styleOption.url as string) vectorLayer.set('background-maplibre-layer', true) - map.addLayer(vectorLayer); + map.addLayer(vectorLayer) } else { const rasterStyle = styleOption as RasterStyle const tileLayer = new TileLayer({ diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 782a3526..052a90b6 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -77,7 +77,7 @@ export default class MapActionReceiver implements ActionReceiver { const center = fromLonLat([action.coordinate.lng, action.coordinate.lat]) if (action.syncView) { const args: AnimationOptions = { - zoom: action.speed < 8 ? (action.speed < 4 ? 18 : 17.5 ) : 17, + zoom: action.speed < 8 ? (action.speed < 4 ? 18 : 17.5) : 17, center: center, easing: linear, // Create a smooth animation that lasts at least 1000ms (as location updates come in every 1s). diff --git a/src/stores/TurnNavigationStore.ts b/src/stores/TurnNavigationStore.ts index 0965d726..b3ded170 100644 --- a/src/stores/TurnNavigationStore.ts +++ b/src/stores/TurnNavigationStore.ts @@ -613,9 +613,7 @@ export default class TurnNavigationStore extends Store private locationUpdate(pos: any) { let c = { lat: pos.coords.latitude, lng: pos.coords.longitude } - Dispatcher.dispatch( - new LocationUpdate(c, this.state.settings.syncView, pos.coords.speed, pos.coords.heading) - ) + Dispatcher.dispatch(new LocationUpdate(c, this.state.settings.syncView, pos.coords.speed, pos.coords.heading)) } private initReal() { diff --git a/src/turnNavigation/TurnNavigation.tsx b/src/turnNavigation/TurnNavigation.tsx index a935c0aa..7d7a835d 100644 --- a/src/turnNavigation/TurnNavigation.tsx +++ b/src/turnNavigation/TurnNavigation.tsx @@ -101,8 +101,7 @@ export default function ({ turnNavigation }: { turnNavigation: TurnNavigationSto
    {showDistanceInMiles ? 'mph' : 'km/h'}
    - {pd.maxSpeed != null && - ApiImpl.isMotorVehicle(turnNavigation.activeProfile) ? ( + {pd.maxSpeed != null && ApiImpl.isMotorVehicle(turnNavigation.activeProfile) ? ( Date: Wed, 28 Jun 2023 15:00:29 +0200 Subject: [PATCH 276/322] less zooming --- src/stores/MapActionReceiver.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 052a90b6..f542a6e4 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -77,7 +77,6 @@ export default class MapActionReceiver implements ActionReceiver { const center = fromLonLat([action.coordinate.lng, action.coordinate.lat]) if (action.syncView) { const args: AnimationOptions = { - zoom: action.speed < 8 ? (action.speed < 4 ? 18 : 17.5) : 17, center: center, easing: linear, // Create a smooth animation that lasts at least 1000ms (as location updates come in every 1s). @@ -86,6 +85,16 @@ export default class MapActionReceiver implements ActionReceiver { duration: 1050, } + // Currently we have two zoom values 17 and 18 but to avoid zooming forth and back when the speed changes only slightly, + // we only change to the lower zoom when below 14.4km/h and change to the higher speed when above 28.8km/h. + // And because the animation could be cancelled the oldZoom could be a none-integer value. + const oldZoom = mapView.getZoom() + if (!oldZoom || oldZoom < 17 || oldZoom > 18) args.zoom = 18 + else if (oldZoom <= 18 && action.speed < 4) args.zoom = 18 + else if (oldZoom >= 17 && action.speed > 8) args.zoom = 17 + + console.log('zoom ' + args.zoom + ', old ' + oldZoom + ', speed:' + action.speed) + if (!Number.isNaN(action.heading) && action.speed > 0) { // The heading is in degrees and shows direction into which device is going. // Although in openlayers docs they say rotation is clockwise it seems to be CCW or just a different view port definition. From c23958e25e54637abaff4459e17b54b9cb38d1b8 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 28 Jun 2023 21:21:35 +0200 Subject: [PATCH 277/322] fix rotate when navigation ends --- src/stores/MapActionReceiver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index f542a6e4..0c02a200 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -48,8 +48,8 @@ export default class MapActionReceiver implements ActionReceiver { // reset padding this.map.getView().padding = [0, 0, 0, 0] - this.map.getView().animate({ rotation: 0, zoom: 14, duration: 600 }) this.map.getView().setConstrainResolution(true) + this.map.getView().animate({ rotation: 0, zoom: 16, duration: 600 }) this.map.un('pointerdrag', this.onMove) // this.map.getView().un('change:resolution', this.onMove) } else if (action instanceof TurnNavigationStart) { From 4ba63a5b304ed528b1bfdd6817ae4094259f6846 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 30 Jun 2023 10:54:59 +0200 Subject: [PATCH 278/322] zoom in earlier --- src/stores/MapActionReceiver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/MapActionReceiver.ts b/src/stores/MapActionReceiver.ts index 0c02a200..f8b089e3 100644 --- a/src/stores/MapActionReceiver.ts +++ b/src/stores/MapActionReceiver.ts @@ -90,7 +90,7 @@ export default class MapActionReceiver implements ActionReceiver { // And because the animation could be cancelled the oldZoom could be a none-integer value. const oldZoom = mapView.getZoom() if (!oldZoom || oldZoom < 17 || oldZoom > 18) args.zoom = 18 - else if (oldZoom <= 18 && action.speed < 4) args.zoom = 18 + else if (oldZoom <= 18 && action.speed < 6) args.zoom = 18 else if (oldZoom >= 17 && action.speed > 8) args.zoom = 17 console.log('zoom ' + args.zoom + ', old ' + oldZoom + ', speed:' + action.speed) From d9a79e44519080de3a7a71536cb99fbba3dfeaf9 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 8 Jul 2023 22:55:21 +0200 Subject: [PATCH 279/322] separate favicon plugin to avoid calling it for fdroid --- package.json | 1 + webpack.common.js | 7 ------- webpack.dev.js | 8 ++++++++ webpack.fdroid.js | 5 +++++ webpack.prod.js | 8 ++++++++ 5 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 webpack.fdroid.js diff --git a/package.json b/package.json index 1fe8aab9..e6a4465b 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "format": "prettier --write \"src/**/*.{css,ts,tsx,html}\" \"test/**/*.{js,ts,jsx,tsx}\" \"jest.config.js\" \"webpack.*.js\" \"config.js\"", "serve": "webpack serve --config webpack.dev.js", "build": "webpack --config webpack.prod.js", + "fdroid": "webpack --config webpack.fdroid.js", "build-debug": "webpack --config webpack.dev.js", "test": "jest" }, diff --git a/webpack.common.js b/webpack.common.js index a29eb161..cf921be6 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -3,7 +3,6 @@ const fs = require('fs') const webpack = require('webpack') const HTMLWebpackPlugin = require('html-webpack-plugin') -const FaviconsWebpackPlugin = require('favicons-webpack-plugin') const CopyPlugin = require('copy-webpack-plugin') const localConfig = path.resolve(__dirname, 'config-local.js') @@ -89,12 +88,6 @@ module.exports = { }, plugins: [ new HTMLWebpackPlugin({ template: path.resolve(__dirname, 'src/index.html') }), - new FaviconsWebpackPlugin({ - logo: './src/logo.svg', - favicons: { - icons: { appleStartup: false, yandex: false, coast: false } - } - }), // config.js is kept outside the bundle and simply copied to the dist folder new CopyPlugin({ patterns: [ diff --git a/webpack.dev.js b/webpack.dev.js index d80ad654..97f17ce2 100644 --- a/webpack.dev.js +++ b/webpack.dev.js @@ -3,6 +3,14 @@ const path = require('path') const common = require('./webpack.common.js') +const FaviconsWebpackPlugin = require('favicons-webpack-plugin') +common.plugins.push(new FaviconsWebpackPlugin({ + logo: './src/logo.svg', + favicons: { + icons: { appleStartup: false, yandex: false, coast: false } + } + })) + const develop = { mode: 'development', devtool: 'source-map', diff --git a/webpack.fdroid.js b/webpack.fdroid.js new file mode 100644 index 00000000..42f75f44 --- /dev/null +++ b/webpack.fdroid.js @@ -0,0 +1,5 @@ +const common = require('./webpack.common.js') + +module.exports = merge(common, { + mode: 'production', +}) diff --git a/webpack.prod.js b/webpack.prod.js index 00c0b161..9ec19084 100644 --- a/webpack.prod.js +++ b/webpack.prod.js @@ -1,6 +1,14 @@ const { merge } = require('webpack-merge') const common = require('./webpack.common.js') +const FaviconsWebpackPlugin = require('favicons-webpack-plugin') +common.plugins.push(new FaviconsWebpackPlugin({ + logo: './src/logo.svg', + favicons: { + icons: { appleStartup: false, yandex: false, coast: false } + } + })) + module.exports = merge(common, { mode: 'production', }) From 694d0da5cb42554f391a59a61cb9b7ab7bb15b8e Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 8 Jul 2023 22:58:45 +0200 Subject: [PATCH 280/322] minor fix --- webpack.fdroid.js | 1 + 1 file changed, 1 insertion(+) diff --git a/webpack.fdroid.js b/webpack.fdroid.js index 42f75f44..00c0b161 100644 --- a/webpack.fdroid.js +++ b/webpack.fdroid.js @@ -1,3 +1,4 @@ +const { merge } = require('webpack-merge') const common = require('./webpack.common.js') module.exports = merge(common, { From e8aa7eef45de22b0a6f92be84ea6632a398fd55c Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 8 Jul 2023 23:59:30 +0200 Subject: [PATCH 281/322] a few more comments --- src/api/Api.ts | 1 + src/index.html | 2 ++ src/index.tsx | 3 +++ src/layers/CurrentLocationLayer.tsx | 13 ++++++++----- src/layers/MapLibreLayer.ts | 4 ++++ src/layers/UsePathsLayer.tsx | 2 +- src/map/map.ts | 2 +- src/stores/MapActionReceiver.ts | 9 +++++++++ src/turnNavigation/TurnNavigation.tsx | 1 + webpack.prod.js | 1 + 10 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/api/Api.ts b/src/api/Api.ts index 3e5009bf..e42631c0 100644 --- a/src/api/Api.ts +++ b/src/api/Api.ts @@ -212,6 +212,7 @@ export class ApiImpl implements Api { } if (args.heading) { + // for navigation we use heading => we have to disable CH request['ch.disable'] = true request.headings = [args.heading] request.heading_penalty = 120 diff --git a/src/index.html b/src/index.html index fb9fdd70..b5ab8aa1 100644 --- a/src/index.html +++ b/src/index.html @@ -12,6 +12,8 @@ content="route planner,shortest path,maps,openstreetmap,android,navigation,routenplaner,gis" /> - Driving Directions - GraphHopper Maps + Browser-based GPS Navigation from GraphHopper Maps